Skip to content
Open
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 All @@ -28,12 +30,15 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.security.CodeSource;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
Expand All @@ -43,6 +48,7 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.WeakHashMap;
Expand Down Expand Up @@ -959,7 +965,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 @@ -1003,18 +1009,16 @@ 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()));
classLoaderCache = null; // in case of static initializer failure (e.g lombok); clear the loader so that next time it fails again in the same way
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 @@ -1026,17 +1030,40 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
throw err;
} catch (Throwable t) {
processFailed = true;
classLoaderCache = null; // in case of static initializer failure (e.g lombok); clear the loader so that next time it fails again in the same way
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 jar",
"# {2} - processor exception",
"# {3} - javac version",
"ERR_ProcessorException=An annotation processor failed on embedded javac {3}.\n class: {0}\n location: {1}\n{2}",
"# {0} - processor name",
"# {1} - processor jar",
"# {2} - processor exception",
"# {3} - javac version",
"ERR_ProcessorException_UpdateAdvice=An annotation processor failed on embedded javac {3}. Try updating to a newer version.\n class: {0}\n location: {1}\n{2}"
})
private void reportError(ProcessingEnvironment processingEnv, Throwable t, Element targetEl) {
StringWriter exception = new StringWriter();
try (PrintWriter pw = new PrintWriter(exception)) {
t.printStackTrace(pw);
}
String name = delegate.getClass().getName();
CodeSource codeSource = delegate.getClass().getProtectionDomain().getCodeSource();
String location = Objects.toString(codeSource != null ? codeSource.getLocation() : null, "none");
int javacVersion = SourceVersion.latest().runtimeVersion().feature();
String message = name.startsWith(JavacParser.LOMBOK_ANNOTATION_PROCESSOR_PREFIX)
? Bundle.ERR_ProcessorException_UpdateAdvice(name, location, exception.toString(), javacVersion)
: Bundle.ERR_ProcessorException(name, location, exception.toString(), javacVersion);
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 @@ -155,6 +155,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 @@ -997,7 +998,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