@Override public CompletableFuture<List<Either<Command, CodeAction>>> codeAction(CodeActionParams params) { logInfo(">> document/codeAction"); CodeActionHandler handler = new CodeActionHandler(this.preferenceManager); return computeAsync((monitor) -> { waitForLifecycleJobs(monitor); return handler.getCodeActionCommands(params, monitor); }); }
private IProblemLocationCore[] getProblemLocationCores(ICompilationUnit unit, List<Diagnostic> diagnostics) { IProblemLocationCore[] locations = new IProblemLocationCore[diagnostics.size()]; for (int i = 0; i < diagnostics.size(); i++) { Diagnostic diagnostic = diagnostics.get(i); int problemId = getProblemId(diagnostic); int start = DiagnosticsHelper.getStartOffset(unit, diagnostic.getRange()); int end = DiagnosticsHelper.getEndOffset(unit, diagnostic.getRange()); boolean isError = diagnostic.getSeverity() == DiagnosticSeverity.Error; locations[i] = new ProblemLocationCore(start, end - start, problemId, new String[0], isError, IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER); } return locations; }
int end = DiagnosticsHelper.getEndOffset(unit, params.getRange()); InnovationContext context = new InnovationContext(unit, start, end - start); context.setASTRoot(getASTRoot(unit)); IProblemLocationCore[] locations = this.getProblemLocationCores(unit, params.getContext().getDiagnostics()); Optional<Either<Command, CodeAction>> codeActionFromProposal = getCodeActionFromProposal(proposal, params.getContext()); if (codeActionFromProposal.isPresent() && !$.contains(codeActionFromProposal.get())) { $.add(codeActionFromProposal.get());
private Optional<Either<Command, CodeAction>> getCodeActionFromProposal(CUCorrectionProposal proposal, CodeActionContext context) throws CoreException { String name = proposal.getName(); ICompilationUnit unit = proposal.getCompilationUnit(); WorkspaceEdit edit = convertChangeToWorkspaceEdit(unit, proposal.getChange()); if (!ChangeUtil.hasChanges(edit)) { return Optional.empty(); } Command command = new Command(name, COMMAND_ID_APPLY_EDIT, Collections.singletonList(edit)); if (preferenceManager.getClientPreferences().isSupportedCodeActionKind(proposal.getKind())) { CodeAction codeAction = new CodeAction(name); codeAction.setKind(proposal.getKind()); codeAction.setCommand(command); codeAction.setDiagnostics(context.getDiagnostics()); return Optional.of(Either.forRight(codeAction)); } else { return Optional.of(Either.forLeft(command)); } }