From 8c5366b47b8620c9bc744d49a8723ec657e9e4e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93lafur=20P=C3=A1ll=20Geirsson?= Date: Tue, 19 Oct 2021 16:47:08 +0200 Subject: [PATCH] Fix #319 - prevent IndexOutOfBoundsException --- .../semanticdb_javac/CompilationUnitException.java | 12 ++++++++++++ .../semanticdb_javac/SemanticdbTaskListener.java | 10 ++++++++-- .../semanticdb_javac/SemanticdbVisitor.java | 7 +++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/CompilationUnitException.java 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),