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)); }