public static Ast GetContainingAstOfPosition(Ast fullAst, IScriptPosition position) { var visitor = new FindAstFromPositionVisitor(position); fullAst.Visit(visitor); return(visitor.GetAst()); }
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); }