/// <summary> /// "Mark" a Token, specifying it's type and the span it covers /// </summary> /// <param name="token"></param> /// <param name="snapshot"></param> /// <param name="type"></param> /// <returns></returns> private ClassificationSpan Token2ClassificationSpan(IToken token, ITextSnapshot snapshot, IClassificationType type) { TextSpan tokenSpan = new TextSpan(token.StartIndex, token.StopIndex - token.StartIndex + 1); XsClassificationSpan span = tokenSpan.ToClassificationSpan(snapshot, type); span.startTokenType = token.Type; span.endTokenType = -1; return(span); }
/// <summary> /// Group several Tokens in a special span, specifying it's type /// </summary> /// <param name="start"></param> /// <param name="stop"></param> /// <param name="snapshot"></param> /// <param name="type"></param> /// <returns></returns> private ClassificationSpan Token2ClassificationSpan(IToken start, IToken stop, ITextSnapshot snapshot, IClassificationType type) { TextSpan tokenSpan = new TextSpan(start.StartIndex, stop.StopIndex - start.StartIndex + 1); XsClassificationSpan span = tokenSpan.ToClassificationSpan(snapshot, type); span.startTokenType = start.Type; span.endTokenType = stop.Type; return(span); }
private void BuildColorClassifications(ITokenStream tokenStream, ITextSnapshot snapshot) { Debug("Start building Classifications at {0}, version {1}", DateTime.Now, snapshot.Version.ToString()); XClassificationSpans newtags; //, texttags; var regionTags = new List <ClassificationSpan>(); if (tokenStream != null) { int iLastInclude = -1; int iLastPPDefine = -1; int iLastDefine = -1; int iLastSLComment = -1; int iLastDocComment = -1; int iLastUsing = -1; newtags = new XClassificationSpans(); //texttags = new XClassificationSpans(); keywordContext = null; IToken lastToken = null; for (var iToken = 0; iToken < tokenStream.Size; iToken++) { var token = tokenStream.Get(iToken); // Orphan End ? if ((keywordContext != null) && (keywordContext.Line != token.Line) && (keywordContext.Type == XSharpLexer.END)) { newtags.Add(Token2ClassificationSpan(keywordContext, snapshot, xsharpKwCloseType)); keywordContext = null; } if (token.Type == XSharpParser.PRAGMA) { var start = token; var stop = token; while (true) { iToken++; token = tokenStream.Get(iToken); if (token.Type == XSharpParser.EOS || token.Type == XSharpParser.Eof) { break; } stop = token; } TextSpan tokenSpan = new TextSpan(start.StartIndex, stop.StopIndex - start.StartIndex + 1); XsClassificationSpan span1 = tokenSpan.ToClassificationSpan(snapshot, xsharpPPType); span1.startTokenType = start.Type; span1.endTokenType = stop.Type; newtags.Add(span1); iToken--; continue; } var span = ClassifyToken(token, regionTags, snapshot, lastToken); if ((span != null)) { // don't forget the current one newtags.Add(span); // We can have some Open/Close keyword ( FOR..NEXT; WHILE...ENDDO; IF...ENDIF) if (span.ClassificationType == xsharpKeywordType) { var list = ClassifyKeyword(token, snapshot); foreach (var item in list) { newtags.Add(item); } } if (!XSettings.DisableRegions) { // now look for Regions of similar code lines switch (token.Type) { case XSharpLexer.PP_INCLUDE: scanForRegion(token, iToken, tokenStream, ref iLastInclude, snapshot, regionTags); break; case XSharpLexer.PP_DEFINE: scanForRegion(token, iToken, tokenStream, ref iLastPPDefine, snapshot, regionTags); break; case XSharpLexer.DEFINE: scanForRegion(token, iToken, tokenStream, ref iLastDefine, snapshot, regionTags); break; case XSharpLexer.SL_COMMENT: scanForRegion(token, iToken, tokenStream, ref iLastSLComment, snapshot, regionTags); break; case XSharpLexer.DOC_COMMENT: scanForRegion(token, iToken, tokenStream, ref iLastDocComment, snapshot, regionTags); break; case XSharpLexer.USING: scanForRegion(token, iToken, tokenStream, ref iLastUsing, snapshot, regionTags); break; default: break; } } } if (token.Channel != XSharpLexer.Hidden) { lastToken = token; } } // Orphan End ? if ((keywordContext != null) && (keywordContext.Type == XSharpLexer.END)) { newtags.Add(Token2ClassificationSpan(keywordContext, snapshot, xsharpKwCloseType)); keywordContext = null; } } else { newtags = _colorTags; } Trace.WriteLine("-->> XSharpClassifier.BuildColorClassifications()"); lock (gate) { _snapshot = snapshot; _colorTags = newtags; _lexerRegions = regionTags; } Trace.WriteLine("<<-- XSharpClassifier.BuildColorClassifications()"); Debug("End building Classifications at {0}, version {1}", DateTime.Now, snapshot.Version.ToString()); triggerRepaint(snapshot); }