private NetworkInterpreter CreateNetworkInterpreter(ITokenStream tokens) { Network network = NetworkBuilder <AlloySimplifiedAtnBuilder> .GetOrBuildNetwork(); NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); RuleBinding memberSelectRule = network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.BinOpExpr18); interpreter.BoundaryRules.Add(memberSelectRule); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.LetDecl)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.QuantDecls)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Decl)); ////interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.NameList)); ////interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.NameListName)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Ref)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Open)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.FactDecl)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.AssertDecl)); ////interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.FunDecl)); ////interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.FunctionName)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.CmdDecl)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Typescope)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.EnumDecl)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.ElseClause)); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Module)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.LetDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.QuantDecls)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Decl)); /* adding this rule definitely didn't help! */ //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Expr)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Module)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.FactDeclHeader)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.AssertDeclHeader)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.FunFunctionName)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.PredFunctionName)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.FunctionReturn)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.SigDeclHeader)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.SigExt)); //interpreter.ExcludedStartRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.CallArguments)); return(interpreter); }
private NetworkInterpreter CreateNetworkInterpreter(ITokenStream tokens) { Network network = NetworkBuilder <AlloyOutliningAtnBuilder> .GetOrBuildNetwork(); NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); interpreter.BoundaryRules.Add(network.GetRule(AlloyOutliningAtnBuilder.RuleNames.AssertDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloyOutliningAtnBuilder.RuleNames.EnumDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloyOutliningAtnBuilder.RuleNames.FactDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloyOutliningAtnBuilder.RuleNames.FunDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloyOutliningAtnBuilder.RuleNames.SigDecl)); interpreter.ExcludedStartRules.Add(network.GetRule(AlloyOutliningAtnBuilder.RuleNames.SigBody)); interpreter.ExcludedStartRules.Add(network.GetRule(AlloyOutliningAtnBuilder.RuleNames.Block)); return(interpreter); }
private NetworkInterpreter CreateNetworkInterpreter(ITokenStream tokens) { Network network = NetworkBuilder <GoOutliningAtnBuilder> .GetOrBuildNetwork(); NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); interpreter.BoundaryRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.ImportDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.TypeDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.ConstDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.FunctionDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.MethodDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.VarDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.StructType)); interpreter.ExcludedStartRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.FunctionType)); interpreter.ExcludedStartRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.TypeSwitchGuard)); interpreter.ExcludedStartRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.Block)); interpreter.ExcludedStartRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.Parameters)); interpreter.ExcludedStartRules.Add(network.GetRule(GoOutliningAtnBuilder.RuleNames.Receiver)); return(interpreter); }
private NetworkInterpreter CreateFullNetworkInterpreter(ITokenStream tokens) { Network network = NetworkBuilder <GoReducedAtnBuilder> .GetOrBuildNetwork(); NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); // make sure we can handle forward walking from 'package' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.PackageClause)); // make sure we can handle forward walking from 'import' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ImportDecl)); // make sure we can handle forward walking from 'type' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.TypeDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.TypeSwitchGuard)); // make sure we can handle forward walking from 'const' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ConstDecl)); // make sure we can handle forward walking from 'var' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.VarDecl)); // make sure we can handle forward walking from 'func' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunctionType)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunctionDeclHeader)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.MethodDeclHeader)); // make sure we can handle forward and backward walking from ':=' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ShortVarDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.SimpleStmt)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.RangeClause)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.CommCase)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Expression)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.PrimaryExpr)); //// make sure we can handle forward and backward walking from ':' //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ExprCaseClause)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.TypeCaseClause)); interpreter.ExcludedStartRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Block)); return(interpreter); }
private NetworkInterpreter CreateNetworkInterpreter(CommonTokenStream tokens) { Network network = NetworkBuilder <AntlrAtnBuilder> .GetOrBuildNetwork(); NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); IToken previousToken = tokens.LT(-1); if (previousToken == null) { return(new NetworkInterpreter(network, new CommonTokenStream())); } switch (previousToken.Type) { case ANTLRLexer.RULE_REF: case ANTLRLexer.TOKEN_REF: case ANTLRLexer.DOLLAR: case ANTLRLexer.ACTION: case ANTLRLexer.FORCED_ACTION: case ANTLRLexer.SEMPRED: case ANTLRLexer.ARG_ACTION: interpreter.BoundaryRules.Add(network.GetRule(AntlrAtnBuilder.RuleNames.Grammar)); interpreter.BoundaryRules.Add(network.GetRule(AntlrAtnBuilder.RuleNames.Option)); interpreter.BoundaryRules.Add(network.GetRule(AntlrAtnBuilder.RuleNames.DelegateGrammar)); interpreter.BoundaryRules.Add(network.GetRule(AntlrAtnBuilder.RuleNames.TokenSpec)); interpreter.BoundaryRules.Add(network.GetRule(AntlrAtnBuilder.RuleNames.AttrScope)); interpreter.BoundaryRules.Add(network.GetRule(AntlrAtnBuilder.RuleNames.Action)); interpreter.BoundaryRules.Add(network.GetRule(AntlrAtnBuilder.RuleNames.Rule)); break; default: return(new NetworkInterpreter(network, new CommonTokenStream())); } return(interpreter); }
public void AugmentQuickInfoSession(IQuickInfoSession session, IList <object> quickInfoContent, out ITrackingSpan applicableToSpan) { applicableToSpan = null; if (session == null || quickInfoContent == null) { return; } if (session.TextView.TextBuffer == this.TextBuffer) { ITextSnapshot currentSnapshot = this.TextBuffer.CurrentSnapshot; SnapshotPoint?triggerPoint = session.GetTriggerPoint(currentSnapshot); if (!triggerPoint.HasValue) { return; } #region experimental /* use the experimental model to locate and process the expression */ Stopwatch stopwatch = Stopwatch.StartNew(); // lex the entire document var input = new SnapshotCharStream(currentSnapshot, new Span(0, currentSnapshot.Length)); var lexer = new AlloyLexer(input); var tokens = new CommonTokenStream(lexer); tokens.Fill(); // locate the last token before the trigger point while (true) { IToken nextToken = tokens.LT(1); if (nextToken.Type == CharStreamConstants.EndOfFile) { break; } if (nextToken.StartIndex > triggerPoint.Value.Position) { break; } tokens.Consume(); } switch (tokens.LA(-1)) { case AlloyLexer.IDENTIFIER: case AlloyLexer.KW_THIS: case AlloyLexer.KW_UNIV: case AlloyLexer.KW_IDEN: case AlloyLexer.KW_INT2: case AlloyLexer.KW_SEQINT: case AlloyLexer.INTEGER: break; default: return; } Network network = NetworkBuilder <AlloySimplifiedAtnBuilder> .GetOrBuildNetwork(); RuleBinding memberSelectRule = network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.BinOpExpr18); #if DEBUG && false HashSet <Transition> memberSelectTransitions = new HashSet <Transition>(ObjectReferenceEqualityComparer <Transition> .Default); GetReachableTransitions(memberSelectRule, memberSelectTransitions); #endif NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); interpreter.BoundaryRules.Add(memberSelectRule); //interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.UnaryExpression)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.LetDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.NameListName)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Ref)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Module)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Open)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.FactDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.AssertDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.FunctionName)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.CmdDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.Typescope)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.EnumDecl)); interpreter.BoundaryRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.ElseClause)); interpreter.ExcludedStartRules.Add(network.GetRule(AlloySimplifiedAtnBuilder.RuleNames.CallArguments)); while (interpreter.TryStepBackward()) { if (interpreter.Contexts.Count == 0) { break; } /* we want all traces to start outside the binOpExpr18 rule, which means all * traces with a transition reachable from binOpExpr18 should contain a push * transition with binOpExpr18's start state as its target. */ if (interpreter.Contexts.All(context => context.BoundedStart)) { break; } } HashSet <InterpretTrace> contexts = new HashSet <InterpretTrace>(BoundedStartInterpretTraceEqualityComparer.Default); if (interpreter.Contexts.Count > 0) { contexts.UnionWith(interpreter.Contexts); } else { contexts.UnionWith(interpreter.BoundedStartContexts); } IOutputWindowPane pane = Provider.OutputWindowService.TryGetPane(PredefinedOutputWindowPanes.TvlIntellisense); if (pane != null) { pane.WriteLine(string.Format("Located {0} QuickInfo expression(s) in {1}ms.", contexts.Count, stopwatch.ElapsedMilliseconds)); } HashSet <Span> spans = new HashSet <Span>(); foreach (var context in contexts) { Span?span = null; foreach (var transition in context.Transitions) { if (!transition.Transition.IsMatch) { continue; } IToken token = transition.Token; Span tokenSpan = new Span(token.StartIndex, token.StopIndex - token.StartIndex + 1); if (span == null) { span = tokenSpan; } else { span = Span.FromBounds(Math.Min(span.Value.Start, tokenSpan.Start), Math.Max(span.Value.End, tokenSpan.End)); } } if (span.HasValue) { spans.Add(span.Value); } } //List<Expression> expressions = new List<Expression>(); //HashSet<string> finalResult = new HashSet<string>(); //SnapshotSpan? contextSpan = null; bool foundInfo = false; foreach (var span in spans) { if (!span.IsEmpty) { VirtualSnapshotSpan selection = new VirtualSnapshotSpan(new SnapshotSpan(currentSnapshot, span)); if (!selection.IsEmpty && selection.Contains(new VirtualSnapshotPoint(triggerPoint.Value))) { try { Expression currentExpression = Provider.IntellisenseCache.ParseExpression(selection); if (currentExpression != null && currentExpression.Span.HasValue && currentExpression.Span.Value.Contains(triggerPoint.Value)) { applicableToSpan = currentExpression.Span.Value.Snapshot.CreateTrackingSpan(currentExpression.Span.Value, SpanTrackingMode.EdgeExclusive); quickInfoContent.Add(currentExpression.ToString()); foundInfo = true; } } catch (Exception ex) { if (ErrorHandler.IsCriticalException(ex)) { throw; } quickInfoContent.Add(ex.Message); } } //try //{ // SnapshotSpan contextSpan = new SnapshotSpan(currentSnapshot, span.Value); // Expression expression = Provider.IntellisenseCache.ParseExpression(contextSpan); // if (expression != null) // expressions.Add(expression); //} //catch (Exception e) //{ // if (ErrorHandler.IsCriticalException(e)) // throw; //} } //if (results.Count > 0) //{ // finalResult.UnionWith(results); // applicableToSpan = currentSnapshot.CreateTrackingSpan(span, SpanTrackingMode.EdgeExclusive); //} } if (!foundInfo && spans.Count > 0) { foreach (var span in spans) { if (!span.IsEmpty) { VirtualSnapshotSpan selection = new VirtualSnapshotSpan(new SnapshotSpan(currentSnapshot, span)); if (!selection.IsEmpty && selection.Contains(new VirtualSnapshotPoint(triggerPoint.Value))) { applicableToSpan = selection.Snapshot.CreateTrackingSpan(selection.SnapshotSpan, SpanTrackingMode.EdgeExclusive); break; } } } quickInfoContent.Add("Could not parse expression."); } //foreach (var result in finalResult) //{ // quickInfoContent.Add(result); //} #endregion #if false var selection = session.TextView.Selection.StreamSelectionSpan; if (selection.IsEmpty || !selection.Contains(new VirtualSnapshotPoint(triggerPoint.Value))) { SnapshotSpan?expressionSpan = Provider.IntellisenseCache.GetExpressionSpan(triggerPoint.Value); if (expressionSpan.HasValue) { selection = new VirtualSnapshotSpan(expressionSpan.Value); } } #endif //VirtualSnapshotSpan selection = new VirtualSnapshotSpan(); //if (contextSpan.HasValue) // selection = new VirtualSnapshotSpan(contextSpan.Value); //if (!selection.IsEmpty && selection.Contains(new VirtualSnapshotPoint(triggerPoint.Value))) //{ // applicableToSpan = selection.Snapshot.CreateTrackingSpan(selection.SnapshotSpan, SpanTrackingMode.EdgeExclusive); // try // { // Expression currentExpression = Provider.IntellisenseCache.ParseExpression(selection); // if (currentExpression != null) // { // SnapshotSpan? span = currentExpression.Span; // if (span.HasValue) // applicableToSpan = span.Value.Snapshot.CreateTrackingSpan(span.Value, SpanTrackingMode.EdgeExclusive); // quickInfoContent.Add(currentExpression.ToString()); // } // else // { // quickInfoContent.Add("Could not parse expression."); // } // } // catch (Exception ex) // { // if (ErrorHandler.IsCriticalException(ex)) // throw; // quickInfoContent.Add(ex.Message); // } //} } }
private NetworkInterpreter CreateNetworkInterpreter(CommonTokenStream tokens) { Network network = NetworkBuilder <JavaSimplifiedAtnBuilder> .GetOrBuildNetwork(); NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); IToken previousToken = tokens.LT(-1); if (previousToken == null) { return(new NetworkInterpreter(network, new CommonTokenStream())); } switch (previousToken.Type) { case Java2Lexer.IDENTIFIER: // definitions always appear as a single identifier (at least the part of them we care about for Quick Info) interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.SymbolDefinitionIdentifier)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ClassOrInterfaceType)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.QualifiedName)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ElementValuePair)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Statement)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Primary)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.InnerCreator)); break; case Java2Lexer.SUPER: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Primary)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeArgument)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ExplicitConstructorInvocation)); break; case Java2Lexer.THIS: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Primary)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ExplicitConstructorInvocation)); break; case Java2Lexer.CLASS: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Primary)); interpreter.ExcludedStartRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ClassHeader)); break; case Java2Lexer.BOOLEAN: case Java2Lexer.CHAR: case Java2Lexer.BYTE: case Java2Lexer.SHORT: case Java2Lexer.INT: case Java2Lexer.LONG: case Java2Lexer.FLOAT: case Java2Lexer.DOUBLE: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.PrimitiveType)); break; case Java2Lexer.INTLITERAL: case Java2Lexer.LONGLITERAL: case Java2Lexer.FLOATLITERAL: case Java2Lexer.DOUBLELITERAL: case Java2Lexer.CHARLITERAL: case Java2Lexer.STRINGLITERAL: case Java2Lexer.TRUE: case Java2Lexer.FALSE: case Java2Lexer.NULL: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Literal)); break; default: return(new NetworkInterpreter(network, new CommonTokenStream())); } return(interpreter); }
private NetworkInterpreter CreateTopLevelNetworkInterpreter(ITokenStream tokens) { Network network = NetworkBuilder <GoTopLevelSymbolTaggerAtnBuilder> .GetOrBuildNetwork(); NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); //RuleBinding memberSelectRule = network.GetRule(GoSimplifiedAtnBuilder.RuleNames.BinOpExpr18); //interpreter.BoundaryRules.Add(memberSelectRule); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.LetDecl)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.QuantDecls)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Decl)); //////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.NameList)); //////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.NameListName)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Ref)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Open)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FactDecl)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.AssertDecl)); //////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunDecl)); //////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunctionName)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.CmdDecl)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Typescope)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.EnumDecl)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ElseClause)); ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Module)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.LetDecl)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.QuantDecls)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Decl)); ///* adding this rule definitely didn't help! */ ////interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Expr)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Module)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FactDeclHeader)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.AssertDeclHeader)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunFunctionName)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.PredFunctionName)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunctionReturn)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.SigDeclHeader)); //interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.SigExt)); // make sure we can handle forward walking from 'package' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.PackageClause)); // make sure we can handle forward walking from 'import' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ImportDecl)); // make sure we can handle forward walking from 'type' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.TypeDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.TypeSwitchGuard)); // make sure we can handle forward walking from 'const' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ConstDecl)); // make sure we can handle forward walking from 'var' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.VarDecl)); // make sure we can handle forward walking from 'func' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunctionType)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunctionDeclHeader)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.MethodDeclHeader)); // make sure we can handle forward and backward walking from ':=' interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ShortVarDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.SimpleStmt)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.RangeClause)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.CommCase)); interpreter.ExcludedStartRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Block)); interpreter.ExcludedStartRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.LiteralValue)); return(interpreter); }
private NetworkInterpreter CreateFullNetworkInterpreter(ITokenStream tokens, int startToken) { Network network = NetworkBuilder <JavaSimplifiedAtnBuilder> .GetOrBuildNetwork(); NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); switch (startToken) { case Java2Lexer.CLASS: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ClassHeader)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.IdentifierSuffix)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Primary)); break; case Java2Lexer.INTERFACE: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.InterfaceHeader)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.AnnotationInterfaceHeader)); break; case Java2Lexer.ENUM: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.EnumHeader)); break; case Java2Lexer.COMMA: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeParameters)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.EnumBody)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.EnumConstants)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeList)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.FieldDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeArguments)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.QualifiedNameList)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.FormalParameterDecls)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ElementValuePairs)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ElementValueArrayInitializer)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.LocalVariableDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ExpressionList)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ArrayInitializer)); interpreter.ExcludedStartRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.InterfaceFieldDeclaration)); break; case Java2Lexer.COLON: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Statement)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.SwitchLabel)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ForStatement)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.AssignmentOperator)); break; case Java2Lexer.EQ: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.VariableDeclarator)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ElementValuePair)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.AssignmentOperator)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.RelationalOp)); break; case Java2Lexer.EXTENDS: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.NormalClassExtends)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ExtendsTypeList)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeParameter)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeArgument)); break; case Java2Lexer.LPAREN: case Java2Lexer.RPAREN: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.FormalParameters)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Annotation)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.AnnotationMethodDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.CatchClause)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ForStatement)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ParExpression)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.CastExpression)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Arguments)); break; case Java2Lexer.GT: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeParameters)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeArguments)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.AssignmentOperator)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.RelationalOp)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ShiftOp)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.NonWildcardTypeArguments)); break; case Java2Lexer.LBRACKET: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.MethodDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.VariableDeclarator)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Type)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.NormalParameterDecl)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.FormalParameter)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Primary)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.IdentifierSuffix)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Selector)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ArrayCreator)); interpreter.ExcludedStartRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.InterfaceMethodDeclaration)); break; case Java2Lexer.SEMI: interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.PackageDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ImportDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.EnumBodyDeclarations)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ClassBodyDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.MethodDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.FieldDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.InterfaceBodyDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.InterfaceMethodDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.InterfaceFieldDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ExplicitConstructorInvocation)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.AnnotationTypeElementDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.AnnotationMethodDeclaration)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.LocalVariableDeclarationStatement)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Statement)); interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ForStatement)); break; default: break; } //// make sure we can handle forward walking from 'package' //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.PackageClause)); //// make sure we can handle forward walking from 'import' //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ImportDecl)); //// make sure we can handle forward walking from 'type' //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeDecl)); //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.TypeSwitchGuard)); //// make sure we can handle forward walking from 'const' //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ConstDecl)); //// make sure we can handle forward walking from 'var' //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.VarDecl)); //// make sure we can handle forward walking from 'func' //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.FunctionType)); //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.FunctionDeclHeader)); //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.MethodDeclHeader)); //// make sure we can handle forward and backward walking from ':=' //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.ShortVarDecl)); //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.SimpleStmt)); //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.RangeClause)); //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.CommCase)); //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.Expression)); //interpreter.BoundaryRules.Add(network.GetRule(JavaAtnBuilder.RuleNames.PrimaryExpr)); return(interpreter); }
private static void GetLl2SymbolSets() { lock (_lookupTablesLock) { if (_definitionContextSet1 != null) { return; } Network setAnalysisNetwork = NetworkBuilder <JavaSimplifiedAtnBuilder> .GetOrBuildNetwork(); JavaSimplifiedAtnBuilder setAnalysisBuilder = (JavaSimplifiedAtnBuilder)setAnalysisNetwork.Builder; _definitionSourceSet = setAnalysisBuilder.DefinitionSourceSet; _referenceSourceSet = setAnalysisBuilder.ReferenceSourceSet; _definitionFollowSet = setAnalysisBuilder.DefinitionFollowSet; _referenceFollowSet = setAnalysisBuilder.ReferenceFollowSet; _definitionOnlySourceSet = setAnalysisBuilder.DefinitionOnlySourceSet; _referenceOnlySourceSet = setAnalysisBuilder.ReferenceOnlySourceSet; _definitionOnlyFollowSet = setAnalysisBuilder.DefinitionOnlyFollowSet; _referenceOnlyFollowSet = setAnalysisBuilder.ReferenceOnlyFollowSet; _definitionContextSet1 = new Dictionary <int, IntervalSet>(); _referenceContextSet1 = new Dictionary <int, IntervalSet>(); _definitionSourceSet2 = new Dictionary <int, IntervalSet>(); _referenceSourceSet2 = new Dictionary <int, IntervalSet>(); _definitionFollowSet2 = new Dictionary <int, IntervalSet>(); _referenceFollowSet2 = new Dictionary <int, IntervalSet>(); var sharedSourceTokens = setAnalysisBuilder.DefinitionSourceSet.Intersect(setAnalysisBuilder.ReferenceSourceSet); foreach (var sharedSourceToken in sharedSourceTokens) { CommonTokenStream analysisTokenStream = new CommonTokenStream(new ArrayTokenSource(sharedSourceToken, Java2Lexer.IDENTIFIER)); analysisTokenStream.Fill(); analysisTokenStream.Seek(1); // definition context set NetworkInterpreter ll2analyzer = new NetworkInterpreter(setAnalysisNetwork, analysisTokenStream); ll2analyzer.ExcludedStartRules.Add(setAnalysisNetwork.GetRule(JavaAtnBuilder.RuleNames.SymbolReferenceIdentifier)); ll2analyzer.TryStepForward(); ll2analyzer.TryStepBackward(); _definitionContextSet1[sharedSourceToken] = ll2analyzer.GetFollowSet(); _definitionSourceSet2[sharedSourceToken] = ll2analyzer.GetSourceSet(); // reference context set ll2analyzer = new NetworkInterpreter(setAnalysisNetwork, analysisTokenStream); ll2analyzer.ExcludedStartRules.Add(setAnalysisNetwork.GetRule(JavaAtnBuilder.RuleNames.SymbolDefinitionIdentifier)); ll2analyzer.TryStepForward(); ll2analyzer.TryStepBackward(); _referenceContextSet1[sharedSourceToken] = ll2analyzer.GetFollowSet(); _referenceSourceSet2[sharedSourceToken] = ll2analyzer.GetSourceSet(); } var sharedFollowTokens = setAnalysisBuilder.DefinitionFollowSet.Intersect(setAnalysisBuilder.ReferenceFollowSet); foreach (var sharedFollowToken in sharedFollowTokens) { CommonTokenStream analysisTokenStream = new CommonTokenStream(new ArrayTokenSource(Java2Lexer.IDENTIFIER, sharedFollowToken)); analysisTokenStream.Fill(); analysisTokenStream.Seek(0); // definition follow set NetworkInterpreter ll2analyzer = new NetworkInterpreter(setAnalysisNetwork, analysisTokenStream); ll2analyzer.ExcludedStartRules.Add(setAnalysisNetwork.GetRule(JavaAtnBuilder.RuleNames.SymbolReferenceIdentifier)); ll2analyzer.TryStepForward(); ll2analyzer.TryStepBackward(); _definitionFollowSet2[sharedFollowToken] = ll2analyzer.GetFollowSet(); // reference follow set ll2analyzer = new NetworkInterpreter(setAnalysisNetwork, analysisTokenStream); ll2analyzer.ExcludedStartRules.Add(setAnalysisNetwork.GetRule(JavaAtnBuilder.RuleNames.SymbolDefinitionIdentifier)); ll2analyzer.TryStepForward(); ll2analyzer.TryStepBackward(); _referenceFollowSet2[sharedFollowToken] = ll2analyzer.GetFollowSet(); } } }
public void AugmentQuickInfoSession(IQuickInfoSession session, IList <object> quickInfoContent, out ITrackingSpan applicableToSpan) { applicableToSpan = null; if (session == null || quickInfoContent == null) { return; } if (session.TextView.TextBuffer == this.TextBuffer) { ITextSnapshot currentSnapshot = this.TextBuffer.CurrentSnapshot; SnapshotPoint?triggerPoint = session.GetTriggerPoint(currentSnapshot); if (!triggerPoint.HasValue) { return; } #region experimental /* use the experimental model to locate and process the expression */ Stopwatch stopwatch = Stopwatch.StartNew(); // lex the entire document var input = new SnapshotCharStream(currentSnapshot, new Span(0, currentSnapshot.Length)); var lexer = new GoLexer(input); var tokenSource = new GoSemicolonInsertionTokenSource(lexer); var tokens = new CommonTokenStream(tokenSource); tokens.Fill(); // locate the last token before the trigger point while (true) { IToken nextToken = tokens.LT(1); if (nextToken.Type == CharStreamConstants.EndOfFile) { break; } if (nextToken.StartIndex > triggerPoint.Value.Position) { break; } tokens.Consume(); } switch (tokens.LA(-1)) { case GoLexer.IDENTIFIER: //case GoLexer.KW_THIS: //case GoLexer.KW_UNIV: //case GoLexer.KW_IDEN: //case GoLexer.KW_INT2: //case GoLexer.KW_SEQINT: break; default: return; } Network network = NetworkBuilder <GoSimplifiedAtnBuilder> .GetOrBuildNetwork(); RuleBinding memberSelectRule = network.GetRule(GoSimplifiedAtnBuilder.RuleNames.PrimaryExpr); #if false HashSet <Transition> memberSelectTransitions = new HashSet <Transition>(); GetReachableTransitions(memberSelectRule, memberSelectTransitions); #endif NetworkInterpreter interpreter = new NetworkInterpreter(network, tokens); interpreter.BoundaryRules.Add(memberSelectRule); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Label)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.TypeSwitchGuard)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FieldName)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Receiver)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FunctionDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.BaseTypeName)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.TypeSpec)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.IdentifierList)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.MethodName)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.ParameterDecl)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.FieldIdentifierList)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.PackageName)); interpreter.BoundaryRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.TypeName)); interpreter.ExcludedStartRules.Add(network.GetRule(GoSimplifiedAtnBuilder.RuleNames.Block)); while (interpreter.TryStepBackward()) { if (interpreter.Contexts.Count == 0) { break; } /* we want all traces to start outside the binOpExpr18 rule, which means all * traces with a transition reachable from binOpExpr18 should contain a push * transition with binOpExpr18's start state as its target. */ if (interpreter.Contexts.All(context => context.BoundedStart)) { break; } } interpreter.CombineBoundedStartContexts(); IOutputWindowPane pane = Provider.OutputWindowService.TryGetPane(PredefinedOutputWindowPanes.TvlIntellisense); if (pane != null) { pane.WriteLine(string.Format("Located {0} QuickInfo expression(s) in {1}ms.", interpreter.Contexts.Count, stopwatch.ElapsedMilliseconds)); } HashSet <string> finalResult = new HashSet <string>(); SnapshotSpan? contextSpan = null; foreach (var context in interpreter.Contexts) { Span?span = null; //List<string> results = AnalyzeInterpreterTrace(context, memberSelectRule, out span); foreach (var transition in context.Transitions) { if (!transition.Transition.IsMatch) { continue; } IToken token = transition.Token; Span tokenSpan = new Span(token.StartIndex, token.StopIndex - token.StartIndex + 1); if (span == null) { span = tokenSpan; } else { span = Span.FromBounds(Math.Min(span.Value.Start, tokenSpan.Start), Math.Max(span.Value.End, tokenSpan.End)); } } if (span.HasValue && !span.Value.IsEmpty) { contextSpan = new SnapshotSpan(currentSnapshot, span.Value); } //if (results.Count > 0) //{ // finalResult.UnionWith(results); // applicableToSpan = currentSnapshot.CreateTrackingSpan(span, SpanTrackingMode.EdgeExclusive); //} } foreach (var result in finalResult) { quickInfoContent.Add(result); } #endregion #if false var selection = session.TextView.Selection.StreamSelectionSpan; if (selection.IsEmpty || !selection.Contains(new VirtualSnapshotPoint(triggerPoint.Value))) { SnapshotSpan?expressionSpan = Provider.IntellisenseCache.GetExpressionSpan(triggerPoint.Value); if (expressionSpan.HasValue) { selection = new VirtualSnapshotSpan(expressionSpan.Value); } } #endif VirtualSnapshotSpan selection = new VirtualSnapshotSpan(); if (contextSpan.HasValue) { selection = new VirtualSnapshotSpan(contextSpan.Value); } if (!selection.IsEmpty && selection.Contains(new VirtualSnapshotPoint(triggerPoint.Value))) { applicableToSpan = selection.Snapshot.CreateTrackingSpan(selection.SnapshotSpan, SpanTrackingMode.EdgeExclusive); quickInfoContent.Add(selection.GetText()); //try //{ // Expression currentExpression = Provider.IntellisenseCache.ParseExpression(selection); // if (currentExpression != null) // { // SnapshotSpan? span = currentExpression.Span; // if (span.HasValue) // applicableToSpan = span.Value.Snapshot.CreateTrackingSpan(span.Value, SpanTrackingMode.EdgeExclusive); // quickInfoContent.Add(currentExpression.ToString()); // } // else // { // quickInfoContent.Add("Could not parse expression."); // } //} //catch (Exception ex) when (!ErrorHandler.IsCriticalException(ex)) //{ // quickInfoContent.Add(ex.Message); //} } } }