public override void ExitIfStmt([NotNull] XSharpParser.IfStmtContext context) { TagRegion(context, context.ChildCount - 2); // try { XSharpParser.StatementBlockContext elseBlock = null; XSharpParser.IfElseBlockContext stmt = null; if (context.IfStmt.ElseBlock != null) { elseBlock = context.IfStmt.ElseBlock; stmt = context.IfStmt; } else if (context.IfStmt.ElseIfBlock != null) { if (context.IfStmt.ElseIfBlock.ElseBlock != null) { elseBlock = context.IfStmt.ElseIfBlock.ElseBlock; stmt = context.IfStmt.ElseIfBlock; } } // if (elseBlock != null) { // Search the ELSE block, if Any int i = 0; LanguageService.SyntaxTree.Tree.IParseTree token = null; for (i = 0; i < stmt.ChildCount; i++) { token = stmt.GetChild(i); String tokenText = token.GetText().ToUpper(); if (tokenText == "ELSE") { break; } else { token = null; } } // if (token is LanguageService.SyntaxTree.Tree.TerminalNodeImpl) { LanguageService.SyntaxTree.IToken sym = ((LanguageService.SyntaxTree.Tree.TerminalNodeImpl)token).Symbol; var tokenSpan = new TextSpan(sym.StartIndex, sym.StopIndex - sym.StartIndex + 1); _regionTags.Add(tokenSpan.ToClassificationSpan(_snapshot, xsharpRegionStartType)); // XSharpParser.StatementBlockContext lastTokenInContext = elseBlock as LanguageService.CodeAnalysis.XSharp.SyntaxParser.XSharpParser.StatementBlockContext; tokenSpan = new TextSpan(lastTokenInContext.Stop.StopIndex - 1, 1); _regionTags.Add(tokenSpan.ToClassificationSpan(_snapshot, xsharpRegionStopType)); } } } catch (Exception e) { XSharpClassifier.Debug("Tagregion failed: " + e.Message); } }
private void TagRegion(RuleContext _context, int endChild) { try { var context = _context as XSharpParserRuleContext; var endToken = context.GetChild(endChild); if (endToken is LanguageService.SyntaxTree.Tree.TerminalNodeImpl) { LanguageService.SyntaxTree.IToken sym = ((LanguageService.SyntaxTree.Tree.TerminalNodeImpl)endToken).Symbol; var tokenSpan = new TextSpan(context.Start.StartIndex, 1); // Attribute ? if (context.Start.Text == "[") { // Skip it int newStart = getStatementForAttribute(_snapshot, context.Start.StartIndex); tokenSpan = new TextSpan(newStart, 1); } _regionTags.Add(tokenSpan.ToClassificationSpan(_snapshot, xsharpRegionStartType)); tokenSpan = new TextSpan(sym.StartIndex, sym.StopIndex - sym.StartIndex + 1); _regionTags.Add(tokenSpan.ToClassificationSpan(_snapshot, xsharpRegionStopType)); } else if (endToken is LanguageService.CodeAnalysis.XSharp.SyntaxParser.XSharpParser.StatementBlockContext) { XSharpParser.StatementBlockContext lastTokenInContext = endToken as LanguageService.CodeAnalysis.XSharp.SyntaxParser.XSharpParser.StatementBlockContext; var tokenSpan = new TextSpan(context.Start.StartIndex, 1); // Attribute on top of Function/Method/... ? if (context.Start.Text == "[") { // Skip it int newStart = getStatementForAttribute(_snapshot, context.Start.StartIndex); tokenSpan = new TextSpan(newStart, 1); } // _regionTags.Add(tokenSpan.ToClassificationSpan(_snapshot, xsharpRegionStartType)); tokenSpan = new TextSpan(lastTokenInContext.Stop.StopIndex - 1, 1); _regionTags.Add(tokenSpan.ToClassificationSpan(_snapshot, xsharpRegionStopType)); } else if (endToken is ParserRuleContext) { var lastTokenInContext = endToken as ParserRuleContext; var tokenSpan = new TextSpan(context.Start.StartIndex, 1); _regionTags.Add(tokenSpan.ToClassificationSpan(_snapshot, xsharpRegionStartType)); tokenSpan = new TextSpan(lastTokenInContext.Stop.StartIndex - 1, 1); _regionTags.Add(tokenSpan.ToClassificationSpan(_snapshot, xsharpRegionStopType)); } } catch (Exception e) { XSharpClassifier.Debug("Tagregion failed: " + e.Message); } }