-// 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)
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.
/// /// <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 ();
-// 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)
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;
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;
}
<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'>
}
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 ();
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);
}
}
}
- } /*else if (tok.GetTokenType() != XmlTokenType.AttributeValueClose &&
+ } *//*else if (tok.GetTokenType() != XmlTokenType.AttributeValueClose &&
tok.GetTokenType() != XmlTokenType.EmptyElementClosing &&
tok.GetTokenType() != XmlTokenType.ClosingSign &&
CurrentNode is ElementStartTagSyntax eltStartTag) {
}*/
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)
{
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;
}
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)
{
#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) {
using Drawing2D;
using System.Collections.Generic;
using System;
+using Crow;
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;
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);
}
change = new TextChange (tok.Start, tok.Length, selectedSugg);
- return true;*/
- }
+ return true;
+ }*/
public override Color GetColorForToken(TokenType tokType)
{