예제 #1
0
        internal SnapshotSpan?GetExpressionAtPointWorker(SnapshotSpan span, GetExpressionOptions options)
        {
            // First do some very quick tokenization to save a full analysis
            if (!IsPossibleExpressionAtPoint(span.Start))
            {
                return(null);
            }

            if (span.End.GetContainingLine() != span.Start.GetContainingLine() &&
                !IsPossibleExpressionAtPoint(span.End))
            {
                return(null);
            }

            var sourceSpan = new SnapshotSpanSourceCodeReader(
                new SnapshotSpan(span.Snapshot, 0, span.End.Position)
                );

            PythonAst ast;

            using (var parser = Parser.CreateParser(sourceSpan, LanguageVersion)) {
                ast = parser.ParseFile();
            }

            var finder     = new ExpressionFinder(ast, options);
            var actualExpr = finder.GetExpressionSpan(span.ToSourceSpan());

            return(actualExpr?.ToSnapshotSpan(span.Snapshot));
        }