protected void AssertCanBeLexedAs(string source, TokenType rule) { using (RootNode rootNode = new RootNode()) { SyntaxMatcher matcher = new SyntaxMatcher(Tokenizer.Tokenize(source, rootNode), rootNode); var tree = matcher.Match(new[] { new Condition(rule, ConditionType.One) }); AssertContainsNoUnknowns(tree); } }
public override Task <CommandOrCodeActionContainer> Handle(CodeActionParams request, CancellationToken cancellationToken) { var documentUri = request.TextDocument.Uri; var compilationContext = this.compilationManager.GetCompilation(documentUri); if (compilationContext == null) { return(Task.FromResult(new CommandOrCodeActionContainer())); } var requestStartOffset = PositionHelper.GetOffset(compilationContext.LineStarts, request.Range.Start); var requestEndOffset = request.Range.Start != request.Range.End ? PositionHelper.GetOffset(compilationContext.LineStarts, request.Range.End) : requestStartOffset; var compilation = compilationContext.Compilation; var semanticModel = compilation.GetEntrypointSemanticModel(); var diagnostics = semanticModel.GetAllDiagnostics(); var quickFixes = diagnostics .Where(fixable => fixable.Span.ContainsInclusive(requestStartOffset) || fixable.Span.ContainsInclusive(requestEndOffset) || (requestStartOffset <= fixable.Span.Position && fixable.GetEndPosition() <= requestEndOffset)) .OfType <IFixable>() .SelectMany(fixable => fixable.Fixes.Select(fix => CreateCodeFix(request.TextDocument.Uri, compilationContext, fix))); List <CommandOrCodeAction> commandOrCodeActions = new(); commandOrCodeActions.AddRange(quickFixes); var coreCompilerErrors = diagnostics .Where(diagnostic => !diagnostic.CanBeSuppressed()); var diagnosticsThatCanBeSuppressed = diagnostics .Where(diagnostic => (diagnostic.Span.ContainsInclusive(requestStartOffset) || diagnostic.Span.ContainsInclusive(requestEndOffset) || (requestStartOffset <= diagnostic.Span.Position && diagnostic.GetEndPosition() <= requestEndOffset))) .Except(coreCompilerErrors); HashSet <string> diagnosticCodesToSuppressInline = new(); foreach (IDiagnostic diagnostic in diagnosticsThatCanBeSuppressed) { if (!diagnosticCodesToSuppressInline.Contains(diagnostic.Code)) { diagnosticCodesToSuppressInline.Add(diagnostic.Code); var commandOrCodeAction = DisableDiagnostic(documentUri, diagnostic.Code, semanticModel.SourceFile, diagnostic.Span, compilationContext.LineStarts); if (commandOrCodeAction is not null) { commandOrCodeActions.Add(commandOrCodeAction); } } } var matchingNodes = SyntaxMatcher.FindNodesInRange(compilationContext.ProgramSyntax, requestStartOffset, requestEndOffset); var codeFixes = codeFixProviders .SelectMany(provider => provider.GetFixes(semanticModel, matchingNodes)) .Select(fix => CreateCodeFix(request.TextDocument.Uri, compilationContext, fix)); commandOrCodeActions.AddRange(codeFixes); return(Task.FromResult(new CommandOrCodeActionContainer(commandOrCodeActions))); }