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);
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); } }