diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/CompilationUnitException.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/CompilationUnitException.java new file mode 100644 index 00000000..e6d6d376 --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/CompilationUnitException.java @@ -0,0 +1,12 @@ +package com.sourcegraph.semanticdb_javac; + +public class CompilationUnitException extends Throwable { + public CompilationUnitException(String compilationUnit, Throwable cause) { + super(compilationUnit, cause); + } + + @Override + public Throwable fillInStackTrace() { + return this; + } +} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTaskListener.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTaskListener.java index 4ebcc7e1..d464e68c 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTaskListener.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTaskListener.java @@ -44,11 +44,17 @@ public void finished(TaskEvent e) { if (e.getKind() != TaskEvent.Kind.ANALYZE) return; try { onFinishedAnalyze(e); - } catch (Exception ex) { + } catch (Throwable ex) { // Catch exceptions because we don't want to stop the compilation even if this plugin has a // bug. We report the full stack trace because it's helpful for bug reports. Exceptions // should only happen in *exceptional* situations and they should be reported upstream. - reporter.exception(ex); + Throwable throwable = ex; + if (e.getSourceFile() != null) { + throwable = + new CompilationUnitException( + String.valueOf(e.getSourceFile().toUri().toString()), throwable); + } + reporter.exception(throwable); } } diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java index 3b97d690..a50102cb 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java @@ -153,6 +153,13 @@ public Void visitClass(ClassTree node, Void unused) { List typeParameters = cls.getTypeParameters(); int i = 0; for (Symbol.TypeVariableSymbol typeSym : cls.sym.getTypeParameters()) { + if (i >= typeParameters.size()) { + // Happens in testcontainers/testcontainers-java, see + // https://github.com/sourcegraph/lsif-java/issues/319 + // Failed to reproduce with a minimal source file so we don't have a test case that hits + // this branch. + break; + } emitSymbolOccurrence( typeSym, typeParameters.get(i),