Skip to content

Commit 425e7c4

Browse files
committed
Make sbt unit tests pass under JDK 11, 17, and 21
After dropping JavaToolchainPlugin the Tests matrix (11/17/21) started to actually exercise the matrix JDK instead of silently pinning every compile to JDK 11. Three things needed real fixes: 1. In-process javac tests (JavacClassesDirectorySuite, TestCompiler) reflect into com.sun.tools.javac.api.BasicJavacTask#getContext, which is closed on JDK 17+ unless the host JVM is launched with --add-exports. Add the existing javacModuleOptions (sans -J) to Test / javaOptions in the shared testSettings so every forked test JVM gets the required exports. 2. SemanticdbVisitor#scan inherits TreePathScanner's traversal, which on JDK 17+ recurses into the identifiers of 'package X.Y;' and emits an extra self-reference for the package declaration. JDK 11 does not. Override visitPackage to stop at the package node, so semanticdb output is stable across JDKs and matches the long-standing JDK 8/11 behavior. 3. The runtime JDK leaks into indexer output as 'jdk N' inside SCIP symbols (JdkPackage.forRuntime). Normalize 'jdk \d+' -> 'jdk N' in the snapshot assertion + save handlers and the inline expected string in SnapshotCommandSuite, then bulk-replace the existing 'jdk 11' literals in committed snapshots. Snapshots now match regardless of the indexer's runtime JDK. Also pin Java bytecode to release 11 in semanticdbKotlinc — its protobuf-generated Java code feeds sbt-assembly's shader which can't parse class major 61 emitted by JDK 17 javac and was silently skipping shading, breaking the shaded fat jar consumed by snapshot tests.
1 parent 1453de7 commit 425e7c4

28 files changed

Lines changed: 301 additions & 258 deletions

build.sbt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,10 @@ lazy val semanticdbKotlinc = project
347347
description := "A kotlinc plugin to emit SemanticDB information",
348348
crossPaths := false,
349349
autoScalaLibrary := false,
350+
// Pin Java bytecode to 11 — sbt-assembly's shader can't read class
351+
// major 61+ emitted by JDK 17 javac and would silently skip shading,
352+
// leaving the fat jar mixing shaded and un-shaded classes.
353+
Compile / javacOptions ++= Seq("--release", "11"),
350354
kotlinVersion := V.kotlinVersion,
351355
kotlincJvmTarget := "1.8",
352356
kotlincOptions ++= Seq("-Xinline-classes", "-Xcontext-parameters"),
@@ -662,6 +666,10 @@ val testSettings = List(
662666
(publish / skip) := true,
663667
autoScalaLibrary := true,
664668
Test / fork := true,
669+
// Open the JDK-internal javac packages to in-process tests that drive
670+
// javac via reflection (e.g. JavacClassesDirectorySuite, TestCompiler).
671+
// On JDK 17+ this is required or the reflective access fails.
672+
Test / javaOptions ++= javacModuleOptions.map(_.stripPrefix("-J")),
665673
testFrameworks := List(TestFrameworks.MUnit),
666674
testOptions ++= {
667675
if (!(Test / testForkedParallel).value)

semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.sun.source.tree.ExpressionTree;
1616
import com.sun.source.tree.NewClassTree;
1717
import com.sun.source.tree.MemberSelectTree;
18+
import com.sun.source.tree.PackageTree;
1819
import com.sun.source.tree.TypeCastTree;
1920
import com.sun.source.tree.TypeParameterTree;
2021
import com.sun.source.tree.ParameterizedTypeTree;
@@ -249,6 +250,17 @@ public Void scan(Tree tree, Void unused) {
249250
return super.scan(tree, unused);
250251
}
251252

253+
@Override
254+
public Void visitPackage(PackageTree node, Void unused) {
255+
// Stop traversal at the package declaration. JDK 17+ TreePathScanner
256+
// recurses into the package name's identifiers and would emit a
257+
// self-reference for `package X.Y;`; JDK 11 does not. Skipping the
258+
// whole package subtree keeps semanticdb output stable across JDKs and
259+
// matches the long-standing JDK 8/11 behavior of not emitting a
260+
// reference for the package declaration itself.
261+
return null;
262+
}
263+
252264
private boolean isAnonymous(Element sym) {
253265
return sym.getSimpleName().length() == 0;
254266
}

tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AbstractClasses.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public abstract class AbstractClasses {
1212
// kind Constructor
1313
// ⌄ enclosing_range_start semanticdb maven . . minimized/AbstractClasses#defaultImplementation().
1414
public String defaultImplementation() {
15-
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#
15+
// ^^^^^^ reference semanticdb maven jdk N java/lang/String#
1616
// ^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AbstractClasses#defaultImplementation().
1717
// display_name defaultImplementation
1818
// signature_documentation java public String defaultImplementation()
@@ -23,7 +23,7 @@ public String defaultImplementation() {
2323

2424
// ⌄ enclosing_range_start semanticdb maven . . minimized/AbstractClasses#abstractImplementation().
2525
public abstract String abstractImplementation();
26-
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#
26+
// ^^^^^^ reference semanticdb maven jdk N java/lang/String#
2727
// ^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AbstractClasses#abstractImplementation().
2828
// display_name abstractImplementation
2929
// signature_documentation java public abstract String abstractImplementation()

tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationParameters.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// display_name Bar
77
// signature_documentation java @interface Bar
88
// kind Interface
9-
// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation#
9+
// relationship is_implementation semanticdb maven jdk N java/lang/annotation/Annotation#
1010
// ⌄ enclosing_range_start semanticdb maven . . minimized/Bar#value().
1111
double value();
1212
// ^^^^^ definition semanticdb maven . . minimized/Bar#value().
@@ -23,7 +23,7 @@
2323
// display_name BarB
2424
// signature_documentation java @interface BarB
2525
// kind Interface
26-
// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation#
26+
// relationship is_implementation semanticdb maven jdk N java/lang/annotation/Annotation#
2727
// ⌄ enclosing_range_start semanticdb maven . . minimized/BarB#value().
2828
boolean value();
2929
// ^^^^^ definition semanticdb maven . . minimized/BarB#value().
@@ -40,10 +40,10 @@
4040
// display_name Nullable
4141
// signature_documentation java @interface Nullable
4242
// kind Interface
43-
// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation#
43+
// relationship is_implementation semanticdb maven jdk N java/lang/annotation/Annotation#
4444
// ⌄ enclosing_range_start semanticdb maven . . minimized/Nullable#value().
4545
String value() default "";
46-
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#
46+
// ^^^^^^ reference semanticdb maven jdk N java/lang/String#
4747
// ^^^^^ definition semanticdb maven . . minimized/Nullable#value().
4848
// display_name value
4949
// signature_documentation java public abstract String value()
@@ -59,10 +59,10 @@
5959
// display_name BarRef
6060
// signature_documentation java @interface BarRef
6161
// kind Interface
62-
// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation#
62+
// relationship is_implementation semanticdb maven jdk N java/lang/annotation/Annotation#
6363
// ⌄ enclosing_range_start semanticdb maven . . minimized/BarRef#value().
6464
SuppressWarnings value();
65-
// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#
65+
// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk N java/lang/SuppressWarnings#
6666
// ^^^^^ definition semanticdb maven . . minimized/BarRef#value().
6767
// display_name value
6868
// signature_documentation java public abstract SuppressWarnings value()
@@ -91,8 +91,8 @@ interface Foo {
9191
@Bar(~5)
9292
// ^^^ reference semanticdb maven . . minimized/Bar#
9393
@SuppressWarnings(value = "unchecked")
94-
// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#
95-
// ^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#value().
94+
// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk N java/lang/SuppressWarnings#
95+
// ^^^^^ reference semanticdb maven jdk N java/lang/SuppressWarnings#value().
9696
double test2();
9797
// ^^^^^ definition semanticdb maven . . minimized/Foo#test2().
9898
// display_name test2
@@ -142,8 +142,8 @@ interface TestRef {
142142
// ⌄ enclosing_range_start semanticdb maven . . minimized/TestRef#testCase().
143143
@BarRef(@SuppressWarnings(value = "unchecked"))
144144
// ^^^^^^ reference semanticdb maven . . minimized/BarRef#
145-
// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#
146-
// ^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#value().
145+
// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk N java/lang/SuppressWarnings#
146+
// ^^^^^ reference semanticdb maven jdk N java/lang/SuppressWarnings#value().
147147
abstract double testCase();
148148
// ^^^^^^^^ definition semanticdb maven . . minimized/TestRef#testCase().
149149
// display_name testCase

tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Annotations.java

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,63 +4,63 @@
44
// ^^^^ reference semanticdb maven . . java/
55
// ^^^^ reference semanticdb maven . . java/lang/
66
// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/
7-
// ^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Documented#
7+
// ^^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/Documented#
88
import java.lang.annotation.Retention;
99
// ^^^^ reference semanticdb maven . . java/
1010
// ^^^^ reference semanticdb maven . . java/lang/
1111
// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/
12-
// ^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Retention#
12+
// ^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/Retention#
1313
import java.lang.annotation.RetentionPolicy;
1414
// ^^^^ reference semanticdb maven . . java/
1515
// ^^^^ reference semanticdb maven . . java/lang/
1616
// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/
17-
// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/RetentionPolicy#
17+
// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/RetentionPolicy#
1818
import java.lang.annotation.Target;
1919
// ^^^^ reference semanticdb maven . . java/
2020
// ^^^^ reference semanticdb maven . . java/lang/
2121
// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/
22-
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target#
22+
// ^^^^^^ reference semanticdb maven jdk N java/lang/annotation/Target#
2323

2424
import static java.lang.annotation.ElementType.*;
2525
// ^^^^ reference semanticdb maven . . java/
2626
// ^^^^ reference semanticdb maven . . java/lang/
2727
// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/
28-
// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#
28+
// ^^^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/ElementType#
2929

3030
//⌄ enclosing_range_start semanticdb maven . . minimized/Annotations#
3131
@Documented
32-
// ^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Documented#
32+
// ^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/Documented#
3333
@Retention(RetentionPolicy.RUNTIME)
34-
// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Retention#
35-
// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/RetentionPolicy#
36-
// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/RetentionPolicy#RUNTIME.
34+
// ^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/Retention#
35+
// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/RetentionPolicy#
36+
// ^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/RetentionPolicy#RUNTIME.
3737
@Target(value = {CONSTRUCTOR,
38-
// ^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target#
39-
// ^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target#value().
40-
// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#CONSTRUCTOR.
38+
// ^^^^^ reference semanticdb maven jdk N java/lang/annotation/Target#
39+
// ^^^^^ reference semanticdb maven jdk N java/lang/annotation/Target#value().
40+
// ^^^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/ElementType#CONSTRUCTOR.
4141
FIELD,
42-
// ^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#FIELD.
42+
// ^^^^^ reference semanticdb maven jdk N java/lang/annotation/ElementType#FIELD.
4343
LOCAL_VARIABLE,
44-
// ^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#LOCAL_VARIABLE.
44+
// ^^^^^^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/ElementType#LOCAL_VARIABLE.
4545
METHOD,
46-
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#METHOD.
46+
// ^^^^^^ reference semanticdb maven jdk N java/lang/annotation/ElementType#METHOD.
4747
PACKAGE,
48-
// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#PACKAGE.
48+
// ^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/ElementType#PACKAGE.
4949
PARAMETER,
50-
// ^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#PARAMETER.
50+
// ^^^^^^^^^ reference semanticdb maven jdk N java/lang/annotation/ElementType#PARAMETER.
5151
TYPE}
52-
// ^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#TYPE.
52+
// ^^^^ reference semanticdb maven jdk N java/lang/annotation/ElementType#TYPE.
5353
)
5454
public @interface Annotations {
5555
// ^^^^^^^^^^^ definition semanticdb maven . . minimized/Annotations#
5656
// display_name Annotations
5757
// signature_documentation java @Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target({CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})\npublic @interface Annotations
5858
// kind Interface
59-
// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation#
59+
// relationship is_implementation semanticdb maven jdk N java/lang/annotation/Annotation#
6060

6161
// ⌄ enclosing_range_start semanticdb maven . . minimized/Annotations#value().
6262
String value() default "";
63-
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#
63+
// ^^^^^^ reference semanticdb maven jdk N java/lang/String#
6464
// ^^^^^ definition semanticdb maven . . minimized/Annotations#value().
6565
// display_name value
6666
// signature_documentation java public abstract String value()
@@ -69,7 +69,7 @@
6969

7070
// ⌄ enclosing_range_start semanticdb maven . . minimized/Annotations#format().
7171
String format() default "";
72-
// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#
72+
// ^^^^^^ reference semanticdb maven jdk N java/lang/String#
7373
// ^^^^^^ definition semanticdb maven . . minimized/Annotations#format().
7474
// display_name format
7575
// signature_documentation java public abstract String format()

0 commit comments

Comments
 (0)