示例#1
0
        internal async Task <(RegexTree tree, SyntaxToken token)> TryGetTreeAndTokenAtPositionAsync(
            Document document, int position, CancellationToken cancellationToken)
        {
            var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);

            var token       = root.FindToken(position);
            var syntaxFacts = document.GetLanguageService <ISyntaxFactsService>();

            if (!RegexPatternDetector.IsPossiblyPatternToken(token, syntaxFacts))
            {
                return(default);
示例#2
0
        public override void AddClassifications(
            Workspace workspace,
            SyntaxToken token,
            SemanticModel semanticModel,
            ArrayBuilder <ClassifiedSpan> result,
            CancellationToken cancellationToken
            )
        {
            if (_info.StringLiteralTokenKind != token.RawKind)
            {
                return;
            }

            if (
                !workspace.Options.GetOption(
                    RegularExpressionsOptions.ColorizeRegexPatterns,
                    semanticModel.Language
                    )
                )
            {
                return;
            }

            // Do some quick syntactic checks before doing any complex work.
            if (!RegexPatternDetector.IsPossiblyPatternToken(token, _info.SyntaxFacts))
            {
                return;
            }

            var detector = RegexPatternDetector.TryGetOrCreate(semanticModel.Compilation, _info);
            var tree     = detector?.TryParseRegexPattern(token, semanticModel, cancellationToken);

            if (tree == null)
            {
                return;
            }

            var visitor = s_visitorPool.Allocate();

            try
            {
                visitor.Result = result;
                AddClassifications(tree.Root, visitor, result);
            }
            finally
            {
                visitor.Result = null;
                s_visitorPool.Free(visitor);
            }
        }