]> O.S.I.I.S - jp/crowedit.git/commitdiff
Suggestion class, removed abstract TryCompleteToken
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Fri, 28 Feb 2025 05:15:17 +0000 (06:15 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Fri, 28 Feb 2025 05:15:17 +0000 (06:15 +0100)
CrowEditBase/src/Compiler/SourceDocument.cs
CrowEditBase/src/CrowEditComponent.cs
CrowEditBase/src/SourceEditor.cs
plugins/CECrowPlugin/src/Parsing/IML/ImlDocument.cs
plugins/CECrowPlugin/src/Parsing/Styling/StyleDocument.cs
plugins/CEEbnfPlugin/src/Parsing/EbnfDocument.cs
plugins/CERoslynPlugin/src/CSDocument.cs
plugins/CEXmlPlugin/src/Parsing/XmlDocument.cs

index 5c746661dadebb90bc86d4d321a6ba7b8e21ff21..808b80ff2442b46dc15b983bd447c69e799587d0 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (c) 2021-2021  Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+// Copyright (c) 2021-2025  Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
 //
 // This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
 
@@ -138,7 +138,7 @@ namespace CrowEditBase
                public virtual string GetTokenTypeString (TokenType tokenType) => tokenType.ToString();
                //protected abstract Tokenizer CreateTokenizer ();
                protected abstract SyntaxAnalyser CreateSyntaxAnalyser ();
-               public abstract IList GetSuggestions (int currentTokenIndex, SyntaxNode currentNode, CharLocation loc);
+               public abstract IList GetSuggestions (int absoluteTextPos, int currentTokenIndex, SyntaxNode currentNode, CharLocation loc);
 
                /// <summary>
                /// complete current token with selected item from the suggestion overlay.
@@ -148,7 +148,7 @@ namespace CrowEditBase
                /// /// <param name="change">the text change to apply</param>
                /// <param name="newSelection">new position or selection, null if normal position after text changes</param>
                /// <returns>true if successed</returns>
-               public abstract bool TryCompleteToken (Token CurrentToken, SyntaxNode CurrentNode, object suggestion, out TextChange change, out TextSpan? newSelection);
+               //public abstract bool TryCompleteToken (Token CurrentToken, SyntaxNode CurrentNode, object suggestion, out TextChange change, out TextSpan? newSelection);
                //protected bool previousTokHasFlag(TokenType flag) => previousToken.HasValue && previousToken.Value.Type.HasFlag(flag);
                void parse () {
                        SyntaxAnalyser syntaxAnalyser = CreateSyntaxAnalyser ();
index b1a5c30a3a138fe0d267f9bb89797a67d09f61f0..8caff4af92a7a75382fd1c8237bc4cb1c89cab97 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (c) 2021-2021  Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+// Copyright (c) 2021-2025  Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
 //
 // This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
 
index b951b3fec919344277fde80ddf577bd981a59c72..5cdf778c43096dc9098376282e9d683776add76e 100644 (file)
@@ -15,6 +15,17 @@ using System.Collections.Frozen;
 
 namespace Crow
 {
+       public class Suggestion {
+               public string Caption;
+               public TextChange Change;
+               public TextSpan? NextSelection;
+
+               public Suggestion(string caption, TextChange change = default, TextSpan? nextSelection = null) {
+                       Caption = caption;
+                       Change = change;
+                       NextSelection = nextSelection;
+               }
+       }
        public class SourceEditor : Editor {
                int currentTokenIndex = -1;
                SyntaxNode currentNode;
@@ -62,15 +73,17 @@ namespace Crow
 
                protected void tryGetSuggestions () {
                        if (currentLoc.HasValue && Document is SourceDocument srcDoc && srcDoc.IsParsed) {
-                               IList suggs = srcDoc.GetSuggestions (currentTokenIndex, currentNode, CurrentLoc.Value);
-                               Token tok = CurrentToken;
+                               int pos = srcDoc.GetAbsolutePosition(CurrentLoc.Value);
+                               Suggestions = srcDoc.GetSuggestions (pos, currentTokenIndex, currentNode, CurrentLoc.Value);
+
+                               /*Token tok = CurrentToken;
                                if (suggs != null && suggs.Count == 1 && (
                                        (suggs[0] is System.Reflection.MemberInfo mi && mi.Name == srcDoc.GetText(tok.Span)) ||
                                        (suggs[0].ToString() == srcDoc.GetText(tok.Span))
                                )){
                                        Suggestions = null;
                                }else
-                                       Suggestions = suggs;
+                                       Suggestions = suggs;*/
                        } else
                                Suggestions = null;
                }
@@ -83,7 +96,7 @@ namespace Crow
                                                                <ListItem Height='Fit' Margin='0' Focusable='false' HorizontalAlignment='Left'
                                                                                                Selected = '{Background=${ControlHighlight}}'
                                                                                                Unselected = '{Background=Transparent}'>
-                                                                       <Label Text='{}' HorizontalAlignment='Left' />
+                                                                       <Label Text='{Caption}' HorizontalAlignment='Left' />
                                                                </ListItem>
                                                        </ItemTemplate>
                                                        <ItemTemplate DataType='System.Reflection.MemberInfo'>
@@ -122,11 +135,10 @@ namespace Crow
                }
                void completeToken () {
                        if (Document is SourceDocument srcDoc) {
-                               if (srcDoc.TryCompleteToken (CurrentToken, CurrentNode, overlay.SelectedItem, out TextChange change, out TextSpan? nextSelection)) {
-                                       update (change);
-                                       if (nextSelection.HasValue) {
-                                               Selection = nextSelection.Value;
-                                       }
+                               if (overlay.SelectedItem is Suggestion sug) {   
+                                       update (sug.Change);
+                                       if (sug.NextSelection.HasValue) 
+                                               Selection = sug.NextSelection.Value;
                                }
                        }
                        hideOverlay ();
index 4b3afcb1c587a4eb78ac48bf41d97764a63e165b..11fc938fc752fbdf4a7a4aaccfd8db7f1322779e 100644 (file)
@@ -49,13 +49,13 @@ namespace CECrowPlugin
                        return crowType.GetMember (memberName, BindingFlags.Public | BindingFlags.Instance).FirstOrDefault ();
                }
 
-               public override IList GetSuggestions (int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
-                       IList sugs = base.GetSuggestions (currentTokenIndex, CurrentNode, loc);
+               public override IList GetSuggestions (int absoluteTextPos, int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
+                       IList sugs = base.GetSuggestions (absoluteTextPos, currentTokenIndex, CurrentNode, loc);
                        if (sugs != null)
                                return sugs;
 
                        //Token tok = currentToken.Length == 0 || currentToken.Type.HasFlag(TokenType.Trivia) ? previousToken : currentToken;
-                       Token tok = GetTokenByIndex(currentTokenIndex);
+                       /*Token tok = GetTokenByIndex(currentTokenIndex);
 
                        if (tok.GetTokenType() == XmlTokenType.ElementOpen)
                                return new List<string> (allWidgetNames);
@@ -113,7 +113,7 @@ namespace CECrowPlugin
                                                }
                                        }
                                }
-                       } /*else if (tok.GetTokenType() != XmlTokenType.AttributeValueClose &&
+                       } *//*else if (tok.GetTokenType() != XmlTokenType.AttributeValueClose &&
                                        tok.GetTokenType() != XmlTokenType.EmptyElementClosing &&
                                        tok.GetTokenType() != XmlTokenType.ClosingSign &&
                                        CurrentNode is ElementStartTagSyntax eltStartTag) {
@@ -126,9 +126,6 @@ namespace CECrowPlugin
                        }*/
                        return null;
                }
-               public override bool TryCompleteToken (Token tok, SyntaxNode node, object suggestion, out TextChange change, out TextSpan? newSelection) {
-                       return base.TryCompleteToken (tok, node, suggestion is MemberInfo mi ? mi.Name : suggestion, out change, out newSelection);
-               }
 
                public override Color GetColorForToken(TokenType tokType)
                {
index 0fbee53e3f4568033198df92eb9e23efd1b9255a..87432929ed495bf5a7a8b4fbca01cdde434716b7 100644 (file)
@@ -24,19 +24,13 @@ namespace CECrowPlugin.Style
 
                protected override SyntaxAnalyser CreateSyntaxAnalyser() => new StyleSyntaxAnalyser (this);
 
-               public override IList GetSuggestions (int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
+               public override IList GetSuggestions (int absoluteTextPos, int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
                        Token currentToken = GetTokenByIndex(currentTokenIndex);
                        /*Console.ForegroundColor = ConsoleColor.DarkYellow;
                        Console.WriteLine ($"Tok: {this.CurrentTokenString} {((StyleTokenType)CurrentToken.Type).ToString()}");
                        Console.ResetColor();*/
                        return null;
                }
-               public override bool TryCompleteToken(Token tok, SyntaxNode node, object suggestion, out TextChange change, out TextSpan? newSelection)
-               {
-                       change = default;
-                       newSelection = null;
-                       return false;
-               }
                public override Color GetColorForToken(TokenType tokType)
                {
                        StyleTokenType xmlTokType = (StyleTokenType)tokType;
index 0ac5675000ab595c4760aeb7160bb7bf117cd194..9c9a3b588ab90d4e7d29f885ab356ab003cf4500 100644 (file)
@@ -25,15 +25,10 @@ namespace CrowEdit.Ebnf
                }
                protected override SyntaxAnalyser CreateSyntaxAnalyser() => new EbnfSyntaxAnalyser (this);
 
-               public override IList GetSuggestions (int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
+               public override IList GetSuggestions (int absoluteTextPos, int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
                        Token currentToken = GetTokenByIndex(currentTokenIndex);
                        return null;
                }
-               public override bool TryCompleteToken (Token tok, SyntaxNode node, object suggestion, out TextChange change, out TextSpan? newSelection) {
-                       newSelection = null;
-                       change = default;
-                       return false;
-               }
 
                public override Color GetColorForToken(TokenType tokType)
                {
index 8c8bf14cd44b5e197c89f2c5ca1b6cbf5d0188c3..8987350e6f18d32d8280ddd4abc9850ed8f4c4cd 100644 (file)
@@ -46,15 +46,11 @@ namespace CERoslynPlugin
                #region SourceDocument abstract class implementation
                protected override SyntaxAnalyser CreateSyntaxAnalyser() => new CSSyntaxAnalyser (this);
 
-               public override IList GetSuggestions (int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc)
+               public override IList GetSuggestions (int absoluteTextPos, int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc)
                {
                        Token currentToken = GetTokenByIndex(currentTokenIndex);
                        throw new NotImplementedException();
                }
-               public override bool TryCompleteToken (Token tok, SyntaxNode node, object suggestion, out TextChange change, out TextSpan? newSelection)
-               {
-                       throw new NotImplementedException();
-               }
                #endregion
 
                public override Color GetColorForToken (TokenType tokType) {
index ac7ec9bf243b4719fa212ecb0ce846a1b6d8c983..302a8e811b588b015c0f42d4640a14b6eadb2796 100644 (file)
@@ -8,6 +8,7 @@ using CrowEditBase;
 using Drawing2D;
 using System.Collections.Generic;
 using System;
+using Crow;
 
 namespace CrowEdit.Xml
 {
@@ -25,31 +26,42 @@ namespace CrowEdit.Xml
                public XmlDocument (string fullPath, string editorPath) : base (fullPath, editorPath) { }
                protected override SyntaxAnalyser CreateSyntaxAnalyser() => new XmlSyntaxAnalyser (this);
                public override string GetTokenTypeString (TokenType tokenType) => ((XmlTokenType)tokenType).ToString();
-               public override IList GetSuggestions (int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
-                       Token currentToken = GetTokenByIndex(currentTokenIndex);
-                       Token previousToken = GetTokenByIndex(currentTokenIndex-1);
+               public override IList GetSuggestions (int absoluteTextPos, int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
+                       Token tok = GetTokenByIndex(currentTokenIndex);
+                       Token prevTok = GetTokenByIndex(currentTokenIndex-1);
 
-                       if (CurrentNode is ElementEndTagSyntax eltEndTag && 
+                       if (!tok.Is(XmlTokenType.ClosingSign) &&
+                               CurrentNode is ElementEndTagSyntax eltEndTag && 
                                        eltEndTag.Parent is ElementSyntax elt &&
                                        elt.StartTag?.Name != null) {
 
-                               string eltName = elt.StartTag.Name;
+                               Suggestion sug = new Suggestion(elt.StartTag.Name);
                                string curEndName = null;
+                               
 
-                               if (currentToken.Is(XmlTokenType.ElementName))
-                                       curEndName = root.GetTokenString(currentToken);
-                               else if (previousToken.Is(XmlTokenType.ElementName))
-                                       curEndName = root.GetTokenString(previousToken);
-                               else if (previousToken.Is(XmlTokenType.EndElementOpen))
+                               if (tok.Is(XmlTokenType.ElementName)) {
+                                       curEndName = root.GetTokenString(tok);
+                                       sug.Change = new TextChange (tok.Start, tok.Length, sug.Caption);
+                               } else if (prevTok.Is(XmlTokenType.ElementName)) {
+                                       curEndName = root.GetTokenString(prevTok);
+                                       sug.Change = new TextChange (prevTok.Start, prevTok.Length, sug.Caption);
+                               } else if (prevTok.Is(XmlTokenType.EndElementOpen)) {
                                        curEndName = "";
+                                       sug.Change = new TextChange (prevTok.End, 0, sug.Caption);
+                               }
+
+                               if (!(sug.Change.IsEmpty || GetTokenByIndex(currentTokenIndex+1).Is(XmlTokenType.ClosingSign)))
+                                       sug.Change.ChangedText += ">";
 
                                if (curEndName != null && elt.StartTag.Name.StartsWith (
-                                                                                       curEndName, StringComparison.OrdinalIgnoreCase))
-                                       return new List<string> (new string[] {eltName});
+                                                                                       curEndName, StringComparison.OrdinalIgnoreCase)
+                                                                               && !elt.StartTag.Name.Equals(curEndName, StringComparison.Ordinal))
+                                       return new List<Suggestion> ([sug]);
                        }
                        return null;
                }
-               public override bool TryCompleteToken (Token tok, SyntaxNode node, object suggestion, out TextChange change, out TextSpan? newSelection) {
+               /*
+               public override bool TryCompleteToken (Suggestion suggestion) {
                        newSelection = null;
                        change = default;
 
@@ -111,9 +123,9 @@ namespace CrowEdit.Xml
                                change =  new TextChange (tok.Start, tok.Length, selectedSugg);
 
                        return true;
-/***********************************************/
 
-                       /*if (tok.GetTokenType() == XmlTokenType.ElementOpen ||
+
+                       if (tok.GetTokenType() == XmlTokenType.ElementOpen ||
                                tok.GetTokenType() == XmlTokenType.WhiteSpace ||
                                tok.GetTokenType() == XmlTokenType.AttributeValueOpen) {
                                change = new TextChange (tok.End, 0, selectedSugg);
@@ -134,8 +146,8 @@ namespace CrowEdit.Xml
                        }
 
                        change = new TextChange (tok.Start, tok.Length, selectedSugg);
-                       return true;*/
-               }
+                       return true;
+               }*/
 
                public override Color GetColorForToken(TokenType tokType)
                {