示例#1
0
        public static Ast GetContainingAstOfPosition(Ast fullAst, IScriptPosition position)
        {
            var visitor = new FindAstFromPositionVisitor(position);

            fullAst.Visit(visitor);
            return(visitor.GetAst());
        }
示例#2
0
        public static KeywordContext BuildFromInput(
            Ast ast,
            IReadOnlyList <Token> tokens,
            IScriptPosition cursorPosition)
        {
            // Now find the AST we're in
            CompletionPositionContext positionContext = GetEffectiveScriptPosition(cursorPosition, tokens);

            Ast containingAst = FindAstFromPositionVisitor.GetContainingAstOfPosition(ast, positionContext.LastNonNewlineToken.Extent.EndScriptPosition);

            if (containingAst is null)
            {
                return(null);
            }

            // Find the command AST that we're in
            CommandAst containingCommandAst = GetFirstParentCommandAst(containingAst);

            var context = new KeywordContext
            {
                ContainingAst        = containingAst,
                ContainingCommandAst = containingCommandAst,
                FullAst                = ast,
                LastTokenIndex         = positionContext.LastTokenIndex,
                LastToken              = positionContext.LastToken,
                LastNonNewlineToken    = positionContext.LastNonNewlineToken,
                EffectivePositionToken = positionContext.EffectivePositionToken,
                Tokens   = tokens,
                Position = cursorPosition
            };

            // Build a list of the keyword ASTs we're in going up
            Ast currAst     = containingAst;
            var commandAsts = new List <CommandAst>();

            do
            {
                if (currAst is CommandAst commandAst)
                {
                    commandAsts.Add(commandAst);
                }

                currAst = currAst.Parent;
            } while (currAst != null);

            // Then build the context list going back down
            var keywordStack = new List <KeywordContextFrame>(commandAsts.Count);
            int frameIndex   = 0;

            for (int i = commandAsts.Count - 1; i >= 0; i--)
            {
                keywordStack.Add(new KeywordContextFrame(context, frameIndex, commandAsts[i]));
                frameIndex++;
            }
            context.KeywordStack = keywordStack;

            return(context);
        }