/// <summary> /// Initializes a new instance of the <see cref="SerializableToken"/> class. /// </summary> /// <param name="token"> /// The token. /// </param> public SerializableToken([NotNull] IClassifiedToken token) { this.Start = token.Start; this.Classification = token.Classification; this.Value = token.Value; this.Kind = token.Kind; }
/// <summary> /// Gets the completions. /// </summary> /// <param name="tokens"> /// The tokens. /// </param> /// <param name="current"> /// The current. /// </param> /// <returns> /// The <see cref="AutoCompletions"/>. /// </returns> public static AutoCompletions GetCompletions([NotNull] IReadOnlyList <IClassifiedToken> tokens, IClassifiedToken current) { var scope = TokenScope.Root; var openParens = new Stack <OpenParens>(); var i = 0; for (i = 0; i < tokens.Count && (tokens[i].Start != current.Start || tokens[i].End != current.End); i++) { if (tokens[i].Kind == Parser.LeftParenLiteral) { openParens.Push(tokens[i - 1].Classification == Classification.Function ? OpenParens.Function : OpenParens.Expression); } if (tokens[i].Kind == Parser.RightParenLiteral && openParens.Count > 0) { openParens.Pop(); } if (AutoComplete.Transitions.TryGetValue(Tuple.Create(scope, tokens[i].Kind), out var newScope) || AutoComplete.Transitions.TryGetValue(Tuple.Create(TokenScope.Any, tokens[i].Kind), out newScope)) { scope = newScope; openParens.Clear(); } } if (i == tokens.Count) { return(AutoComplete.RootCompletions); } var classifcation = tokens[i].Classification; var kind = tokens[i].Kind; var prevClass = tokens[i - 1].Classification; var prevKind = tokens[i - 1].Kind; switch (scope) { case TokenScope.Root: return(AutoComplete.RootCompletions); case TokenScope.Select: if (prevClass == Classification.Operator || prevClass == Classification.Keyword) { return(new AutoCompletions(AutoCompleteType.Expression | AutoCompleteType.SourceAlias)); } if (prevKind == Parser.DotLiteral) { return(new AutoCompletions(AutoCompleteType.Field)); } break; case TokenScope.From: if (prevClass == Classification.Keyword) { return(new AutoCompletions(AutoCompleteType.Source)); } break; case TokenScope.Import: if (prevKind == Parser.ImportLiteral) { return(new AutoCompletions(AutoCompleteType.Literal, "PLUGIN")); } if (prevClass == Classification.Keyword) { return(new AutoCompletions(AutoCompleteType.Plugin)); } break; case TokenScope.Use: if (prevKind == Parser.UseLiteral) { return(new AutoCompletions(AutoCompleteType.Literal, "DEFAULT")); } break; case TokenScope.Insert: if (prevKind == Parser.InsertLiteral) { return(new AutoCompletions(AutoCompleteType.Literal, "INTO")); } if (prevClass == Classification.Keyword) { return(new AutoCompletions(AutoCompleteType.Target)); } break; } if (prevClass == Classification.Number || prevClass == Classification.String || prevClass == Classification.Constant || prevClass == Classification.Variable) { return(new AutoCompletions( AutoCompleteType.Operator | AutoCompleteType.Literal, prevClass == Classification.Number ? AutoComplete.TimeLiterals : null, openParens.Any() ? new[] { ")" } : null, openParens.LastOrDefault() == OpenParens.Function ? new[] { "," } : null)); } return(new AutoCompletions(AutoCompleteType.Literal, string.Empty)); }
/// <summary> /// Checks if the token has the specified value. /// </summary> /// <param name="token"> /// The token. /// </param> /// <param name="value"> /// The value. /// </param> /// <param name="comparison"> /// The comparison. /// </param> /// <returns> /// The <see cref="bool"/>. /// </returns> public static bool Is([NotNull] this IClassifiedToken token, [NotNull] string value, StringComparison comparison = StringComparison.CurrentCultureIgnoreCase) { return(value.Equals(token.Value, comparison)); }
/// <summary> /// Checks if the token has the specified value. /// </summary> /// <param name="token"> /// The token. /// </param> /// <param name="comparison"> /// The comparison. /// </param> /// <param name="values"> /// The value. /// </param> /// <returns> /// The <see cref="bool"/>. /// </returns> public static bool In(this IClassifiedToken token, StringComparison comparison, [NotNull] params string[] values) { return(values.Any(v => token.Value.Equals(v, comparison))); }
/// <summary> /// Checks if the token has the specified value. /// </summary> /// <param name="token"> /// The token. /// </param> /// <param name="values"> /// The values. /// </param> /// <returns> /// The <see cref="bool"/>. /// </returns> public static bool In(this IClassifiedToken token, params string[] values) { return(token.In(StringComparison.OrdinalIgnoreCase, values)); }
/// <summary> /// Gets the automatic completions. /// </summary> /// <param name="current">The current token.</param> /// <returns>The completions.</returns> public IAutoCompletions GetAutoCompletions(IClassifiedToken current) { return(AutoComplete.GetCompletions(this.tokens, current)); }
public IClassifiedToken GetTokenBefore(IClassifiedToken token) { return(this.tokens.TakeWhile(t => !t.Equals(token)).LastOrDefault()); }