public virtual string GetTokenTypeString (TokenType tokenType) => tokenType.ToString();
//protected abstract Tokenizer CreateTokenizer ();
protected abstract SyntaxAnalyser CreateSyntaxAnalyser ();
- public abstract IList GetSuggestions (Token currentToken, SyntaxNode currentNode, CharLocation loc);
+ public abstract IList GetSuggestions (int currentTokenIndex, SyntaxNode currentNode, CharLocation loc);
/// <summary>
/// complete current token with selected item from the suggestion overlay.
protected void tryGetSuggestions () {
if (currentLoc.HasValue && Document is SourceDocument srcDoc && srcDoc.IsParsed) {
- IList suggs = srcDoc.GetSuggestions (CurrentToken, currentNode, CurrentLoc.Value);
+ IList suggs = srcDoc.GetSuggestions (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)) ||
return crowType.GetMember (memberName, BindingFlags.Public | BindingFlags.Instance).FirstOrDefault ();
}
- public override IList GetSuggestions (Token currentToken, SyntaxNode CurrentNode, CharLocation loc) {
- IList sugs = base.GetSuggestions (currentToken, CurrentNode, loc);
+ public override IList GetSuggestions (int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
+ IList sugs = base.GetSuggestions (currentTokenIndex, CurrentNode, loc);
if (sugs != null)
return sugs;
//Token tok = currentToken.Length == 0 || currentToken.Type.HasFlag(TokenType.Trivia) ? previousToken : currentToken;
- Token tok = currentToken;
+ Token tok = GetTokenByIndex(currentTokenIndex);
if (tok.GetTokenType() == XmlTokenType.ElementOpen)
return new List<string> (allWidgetNames);
protected override SyntaxAnalyser CreateSyntaxAnalyser() => new StyleSyntaxAnalyser (this);
- public override IList GetSuggestions (Token currentToken, SyntaxNode CurrentNode, CharLocation loc) {
+ public override IList GetSuggestions (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();*/
}
protected override SyntaxAnalyser CreateSyntaxAnalyser() => new EbnfSyntaxAnalyser (this);
- public override IList GetSuggestions (Token currentToken, SyntaxNode CurrentNode, CharLocation loc) {
+ public override IList GetSuggestions (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) {
#region SourceDocument abstract class implementation
protected override SyntaxAnalyser CreateSyntaxAnalyser() => new CSSyntaxAnalyser (this);
- public override IList GetSuggestions (Token currentToken, SyntaxNode CurrentNode, CharLocation loc)
+ public override IList GetSuggestions (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)
public static void SetTokenType (this Token tok, XmlTokenType type) {
tok.Type = (TokenType)type;
}
-
+ public static bool Is(this Token tok, XmlTokenType type) => (XmlTokenType)tok.Type == type;
}
public class XmlDocument : SourceDocument {
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 (Token currentToken, SyntaxNode CurrentNode, CharLocation loc) {
- /*currentToken = FindTokenIncludingPosition (pos);
- currentNode = FindNodeIncludingPosition (pos);*/
- if (currentToken.GetTokenType() == XmlTokenType.EndElementOpen &&
- CurrentNode is ElementEndTagSyntax eltEndTag && !eltEndTag.IsComplete) {
- ElementSyntax es = eltEndTag.Parent as ElementSyntax;
- if (es?.StartTag.name != null)
- return new List<string> (new string[] {es.StartTag.Name});
- }
+ public override IList GetSuggestions (int currentTokenIndex, SyntaxNode CurrentNode, CharLocation loc) {
+ Token currentToken = GetTokenByIndex(currentTokenIndex);
+ Token previousToken = GetTokenByIndex(currentTokenIndex-1);
+
+ if (CurrentNode is ElementEndTagSyntax eltEndTag &&
+ eltEndTag.Parent is ElementSyntax elt &&
+ elt.StartTag?.Name != null) {
+
+ string eltName = 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))
+ curEndName = "";
+
+ if (curEndName != null && elt.StartTag.Name.StartsWith (
+ curEndName, StringComparison.OrdinalIgnoreCase))
+ return new List<string> (new string[] {eltName});
+ }
return null;
}
public override bool TryCompleteToken (Token tok, SyntaxNode node, object suggestion, out TextChange change, out TextSpan? newSelection) {