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);
     }
 }
コード例 #2
0
ファイル: BicepCodeActionHandler.cs プロジェクト: miqm/bicep
        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)));
        }