Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Show javac code as the diagnostics code if the problem is generated b…
Browse files Browse the repository at this point in the history
…y Javac (#1)
testforstephen authored and rgrunber committed Oct 15, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent 3785921 commit c0ed19c
Showing 3 changed files with 62 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -20,7 +20,9 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IMarker;
@@ -33,6 +35,7 @@
import org.eclipse.jdt.core.IOpenable;
import org.eclipse.jdt.core.IProblemRequestor;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.internal.compiler.problem.DefaultProblem;
import org.eclipse.jdt.ls.core.internal.JDTUtils;
@@ -59,6 +62,10 @@ public abstract class BaseDiagnosticsHandler implements IProblemRequestor {
public static final int NON_PROJECT_JAVA_FILE = 0x10;
public static final int NOT_ON_CLASSPATH = 0x20;

public static final String DIAG_JAVAC_CODE = "javacCode";
public static final String DIAG_ECJ_PROBLEM_ID = "ecjProblemId";
public static final String DIAG_ARGUMENTS = "arguments";

public BaseDiagnosticsHandler(JavaClientConnection conn, ICompilationUnit cu) {
problems = new ArrayList<>();
this.cu = cu;
@@ -248,12 +255,30 @@ public static List<Diagnostic> toDiagnosticsArray(IOpenable openable, List<IProb
diag.setCode(Integer.toString(problem.getID()));
diag.setSeverity(convertSeverity(problem));
diag.setRange(convertRange(openable, problem));
Map<String, Object> data = new HashMap<>();
if (problem.getID() == IProblem.UndefinedName || problem.getID() == IProblem.UndefinedType || problem.getID() == IProblem.UninitializedBlankFinalField) {
diag.setData(problem.getArguments());
data.put(DIAG_ARGUMENTS, problem.getArguments());
}
if (isDiagnosticTagSupported) {
diag.setTags(getDiagnosticTag(problem.getID()));
}
if (problem instanceof CategorizedProblem javaProblem) {
String[] extraAttributeNames = javaProblem.getExtraMarkerAttributeNames();
Object[] extraAttributeValues = javaProblem.getExtraMarkerAttributeValues();
if (extraAttributeNames != null && extraAttributeValues != null
&& extraAttributeNames.length == extraAttributeValues.length) {
for (int i = 0; i < extraAttributeNames.length; i++) {
if (DIAG_JAVAC_CODE.equals(extraAttributeNames[i])) {
diag.setCode(String.valueOf(extraAttributeValues[i]));
data.put(DIAG_ECJ_PROBLEM_ID, Integer.toString(problem.getID()));
break;
}
}
}
}
if (!data.isEmpty()) {
diag.setData(data);
}
array.add(diag);
}
return array;
Original file line number Diff line number Diff line change
@@ -42,6 +42,7 @@
import org.eclipse.jdt.internal.ui.text.correction.proposals.NewVariableCorrectionProposalCore;
import org.eclipse.jdt.ls.core.internal.ChangeUtil;
import org.eclipse.jdt.ls.core.internal.JDTUtils;
import org.eclipse.jdt.ls.core.internal.JSONUtility;
import org.eclipse.jdt.ls.core.internal.JavaCodeActionKind;
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
import org.eclipse.jdt.ls.core.internal.corrections.DiagnosticsHelper;
@@ -349,14 +350,19 @@ public static IProblemLocation[] getProblemLocationCores(ICompilationUnit unit,
boolean isError = diagnostic.getSeverity() == DiagnosticSeverity.Error;
int problemId = getProblemId(diagnostic);
List<String> arguments = new ArrayList<>();
if (diagnostic.getData() instanceof JsonArray data) {
for (JsonElement e : data) {
arguments.add(e.getAsString());
if (diagnostic.getData() != null) {
Map<String, Object> data = JSONUtility.toModel(diagnostic.getData(), Map.class);
Object args = data.get(BaseDiagnosticsHandler.DIAG_ARGUMENTS);
if (args instanceof JsonArray args1) {
for (JsonElement e : args1) {
arguments.add(e.getAsString());
}
} else if (args instanceof String[] args1) {
arguments = Arrays.asList(args1);
}
}
if (diagnostic.getData() instanceof String[] data) {
for (String s : data) {
arguments.add(s);
Object ecjProblemId = data.get(BaseDiagnosticsHandler.DIAG_ECJ_PROBLEM_ID);
if (ecjProblemId instanceof String id) {
problemId = Integer.valueOf(id);
}
}
locations[i] = new ProblemLocation(start, end - start, problemId, arguments.toArray(new String[0]), isError, IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER);
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -410,6 +411,17 @@ private static Diagnostic toDiagnostic(Range range, IMarker marker, boolean isDi
d.setTags(DiagnosticsHandler.getDiagnosticTag(problemId));
}
d.setRange(range);
try {
if (marker.getAttribute(BaseDiagnosticsHandler.DIAG_JAVAC_CODE) != null) {
String javacCode = (String) marker.getAttribute(BaseDiagnosticsHandler.DIAG_JAVAC_CODE);
Map<String, Object> data = new HashMap<>();
data.put(BaseDiagnosticsHandler.DIAG_ECJ_PROBLEM_ID, String.valueOf(problemId));
d.setCode(javacCode);
d.setData(data);
}
} catch (CoreException e) {
// do nothing
}
return d;
}

@@ -459,6 +471,17 @@ private static Diagnostic toDiagnostic(IDocument document, IMarker marker, boole
if (isDiagnosticTagSupported) {
d.setTags(DiagnosticsHandler.getDiagnosticTag(problemId));
}
try {
if (marker.getAttribute(BaseDiagnosticsHandler.DIAG_JAVAC_CODE) != null) {
String javacCode = (String) marker.getAttribute(BaseDiagnosticsHandler.DIAG_JAVAC_CODE);
Map<String, Object> data = new HashMap<>();
data.put(BaseDiagnosticsHandler.DIAG_ECJ_PROBLEM_ID, String.valueOf(problemId));
d.setCode(javacCode);
d.setData(data);
}
} catch (CoreException e) {
// do nothing
}
return d;
}

0 comments on commit c0ed19c

Please sign in to comment.