예제 #1
0
 public ClassificationParseResult(ITextSnapshot snapshot, Token tokens, Comment[] comments, Directive[] directives)
 {
     Snapshot = snapshot;
       Tokens = tokens;
       Comments = comments;
       Directives = directives;
 }
예제 #2
0
        public static bool TryParse(ITextBuffer textBuffer, out ClassificationParseResult parseResult)
        {
            var snapshot = textBuffer.CurrentSnapshot;

              ClassificationParseResult lastParseResult;
              if (textBuffer.Properties.TryGetProperty(typeof(ClassificationParseResult), out lastParseResult) && lastParseResult.Snapshot.Version == snapshot.Version)
              {
            parseResult = lastParseResult;
            return true;
              }

              NemerleSource source;
              if (!textBuffer.Properties.TryGetProperty(typeof(NemerleSource), out source))
              {
            parseResult = null;
            return false;
              }

              var engine = source.GetEngine();
              if (!engine.RequestOnInitEngine())
              {
            parseResult = null;
            return false;
              }

              var timer = Stopwatch.StartNew();

              var code       = snapshot.GetText();
              var lexer      = new HighlightingLexer(engine, code);
              var preParser  = new PreParser(lexer);
              var tokens     = preParser.ParseTopLevel();
              var _comments  = lexer.GetComments();
              var directives = lexer.GetDirectives();

              var comments = new Comment[_comments.Length];
              for (var i = 0; i < _comments.Length; ++i)
              {
            var c = _comments[i];
            var type = CommentType.Normal;
            var pos = 0;
            var commentParser = c.IsMultiline ? _multiLineCommentParser : _singleLineCommentParser;
            var match = commentParser.Match(code, c.Position, c.Length);
            if (match.Success)
            {
              if (match.Groups[1].Success)
              {
            pos = match.Groups[1].Index;
            type = CommentType.ToDo;
              }
              else if (match.Groups[2].Success)
              {
            pos = match.Groups[2].Index;
            type = CommentType.Bug;
              }
              else if (match.Groups[3].Success)
              {
            pos = match.Groups[3].Index;
            type = CommentType.Hack;
              }
            }
            comments[i] = new Comment(c, type, pos);
              }

              timer.Stop();
              Debug.Print("SyntaxClassifier.TryParse: {0}", timer.Elapsed);

              parseResult = new ClassificationParseResult(snapshot, tokens.Child, comments, directives);
              textBuffer.Properties[typeof(ClassificationParseResult)] = parseResult;
              return true;
        }