示例#1
0
 /// <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;
 }
示例#2
0
        /// <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));
 }
示例#6
0
 /// <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));
 }
示例#7
0
 public IClassifiedToken GetTokenBefore(IClassifiedToken token)
 {
     return(this.tokens.TakeWhile(t => !t.Equals(token)).LastOrDefault());
 }