Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        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);
        }