Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
*/
package org.netbeans.modules.java.source.indexing;

import com.sun.tools.javac.comp.Enter;
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
import com.sun.tools.javac.util.Abort;
import com.sun.tools.javac.util.ClientCodeException;
import com.sun.tools.javac.util.Context;
Expand Down Expand Up @@ -77,6 +79,7 @@
import org.netbeans.api.project.ui.OpenProjects;
import org.netbeans.modules.classfile.ClassFile;
import org.netbeans.modules.classfile.Module;
import org.netbeans.modules.java.source.NoJavacHelper;
import org.netbeans.modules.java.source.parsing.CachingArchiveClassLoader;
import org.netbeans.modules.java.source.parsing.JavacParser;
import org.netbeans.modules.java.source.usages.LongHashMap;
Expand Down Expand Up @@ -961,7 +964,7 @@ private void save() {
}
}

private static final class ErrorToleratingProcessor implements Processor {
private final class ErrorToleratingProcessor implements Processor {

private final Processor delegate;
private ProcessingEnvironment processingEnv;
Expand Down Expand Up @@ -1005,18 +1008,15 @@ public void init(ProcessingEnvironment processingEnv) {
throw err;
} catch (Throwable t) {
initFailed = true;
StringBuilder exception = new StringBuilder();
exception.append(t.getMessage()).append("\n");
for (StackTraceElement ste : t.getStackTrace()) {
exception.append(ste).append("\n");
}
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, Bundle.ERR_ProcessorException(delegate.getClass().getName(), exception.toString()));
Enter enter = Enter.instance(((JavacProcessingEnvironment) processingEnv).getContext());
Element topLevel = enter.getEnvs().iterator().hasNext() ? enter.getEnvs().iterator().next().enclClass.sym
: null;
reportError(processingEnv, t, topLevel);
}
this.processingEnv = processingEnv;
}

@Override
@Messages("ERR_ProcessorException=Annotation processor {0} failed with an exception: {1}")
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (initFailed || processFailed) {
return false;
Expand All @@ -1029,16 +1029,35 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
} catch (Throwable t) {
processFailed = true;
Element el = roundEnv.getRootElements().isEmpty() ? null : roundEnv.getRootElements().iterator().next();
StringBuilder exception = new StringBuilder();
exception.append(t.getMessage()).append("\n");
for (StackTraceElement ste : t.getStackTrace()) {
exception.append(ste).append("\n");
}
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, Bundle.ERR_ProcessorException(delegate.getClass().getName(), exception.toString()), el);
reportError(processingEnv, t, el);
return false;
}
}

@Messages({
"# {0} - processor name",
"# {1} - processor exception",
"ERR_ProcessorException=Annotation processor {0} failed with an exception: {1}",
"# {0} - JDK version",
"# {1} - processor exception",
"ERR_LombokException=Lombok failed, does your version of Lombok support javac from JDK {0}? Exception: {1}"
})
private void reportError(ProcessingEnvironment processingEnv, Throwable t, Element targetEl) {
StringBuilder exception = new StringBuilder();
exception.append(t.getMessage()).append("\n");
for (StackTraceElement ste : t.getStackTrace()) {
exception.append(ste).append("\n");
}
String message;
if (delegate.getClass().getName().startsWith(JavacParser.LOMBOK_ANNOTATION_PROCESSOR_PREFIX)) {
message = Bundle.ERR_LombokException(NoJavacHelper.REQUIRED_JAVAC_VERSION, exception.toString());
classLoaderCache = null; //Lombok may only crash with the exception out of `init` once per ClassLoader; clear the loader so that next time it fails again in the same way
} else {
message = Bundle.ERR_ProcessorException(delegate.getClass().getName(), exception.toString());
}
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, message, targetEl);
}

@Override
public Iterable<? extends Completion> getCompletions(Element element, AnnotationMirror annotation, ExecutableElement member, String userText) {
if (initFailed) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ public class JavacParser extends Parser {
private static final boolean DISABLE_PARAMETER_NAMES_READING = Boolean.getBoolean("org.netbeans.modules.java.source.parsing.JavacParser.no_parameter_names"); //NOI18N
private static final Set<Reference<Object>> HUGE_SNAPSHOTS = new HashSet<>();
private static final LowMemoryWatcher LOW_MEMORY_WATCHER = LowMemoryWatcher.getInstance();
public static final String LOMBOK_ANNOTATION_PROCESSOR_PREFIX = "lombok.";
public static final String LOMBOK_DETECTED = "lombokDetected";

/**
Expand Down Expand Up @@ -1012,7 +1013,7 @@ private static JavacTaskImpl createJavacTask(
aptEnabled = false;
} else {
for (Processor p : processors) {
if ("lombok.core.AnnotationProcessor".equals(p.getClass().getName())) {
if (p.getClass().getName().startsWith(LOMBOK_ANNOTATION_PROCESSOR_PREFIX)) {
options.add("-XD" + LOMBOK_DETECTED);
break;
}
Expand Down
Loading