diff --git a/build.sbt b/build.sbt
index d255dfaf5..e1eeca85d 100644
--- a/build.sbt
+++ b/build.sbt
@@ -550,10 +550,20 @@ lazy val minimizedSettings = List[Def.Setting[_]](
(run / fork) := true,
(Compile / unmanagedSourceDirectories) += minimizedSourceDirectory,
libraryDependencies ++= List("org.projectlombok" % "lombok" % "1.18.22"),
+ // Fork javac so it receives real file paths instead of sbt's `vf://` virtual-file URIs
+ // (see the comment on `semanticdbKotlincMinimized` for the long story).
+ javaHome := Some(file(System.getProperty("java.home"))),
+ Compile / javacOptions ++=
+ Seq(
+ "-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+ "-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
+ "-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED",
+ "-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
+ "-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"
+ ),
javacOptions +=
List(
s"-Xplugin:semanticdb",
- s"-build-tool:sbt",
s"-text:on",
s"-verbose",
s"-sourceroot:${(ThisBuild / baseDirectory).value}",
diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/GlobalSymbolsCache.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/GlobalSymbolsCache.java
index d32efa3ae..72c9b887d 100644
--- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/GlobalSymbolsCache.java
+++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/GlobalSymbolsCache.java
@@ -1,7 +1,6 @@
package com.sourcegraph.semanticdb_javac;
import javax.lang.model.element.Element;
-import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.PackageElement;
@@ -36,12 +35,8 @@ public String semanticdbSymbol(Element sym, LocalSymbolsCache locals) {
return result;
}
- public boolean isNone(Element sym) {
- return sym == null;
- }
-
private String uncachedSemanticdbSymbol(Element sym, LocalSymbolsCache locals) {
- if (isNone(sym)) return SemanticdbSymbols.ROOT_PACKAGE;
+ if (sym == null) return SemanticdbSymbols.ROOT_PACKAGE;
if (sym instanceof PackageElement) {
if (((PackageElement) sym).isUnnamed()) return SemanticdbSymbols.ROOT_PACKAGE;
diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/Result.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/Result.java
index 75ec4b144..03597bc34 100644
--- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/Result.java
+++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/Result.java
@@ -1,8 +1,6 @@
package com.sourcegraph.semanticdb_javac;
import java.util.NoSuchElementException;
-import java.util.Objects;
-import java.util.function.Function;
/**
* A Java implementation of Rust's Result[T, E] type, or Scala's Either[A, B]
@@ -17,7 +15,7 @@ private enum Kind {
Error;
}
- private Kind kind;
+ private final Kind kind;
private final T ok;
private final E error;
@@ -31,61 +29,15 @@ private Result(Kind kind, T ok, E error) {
this.ok = ok;
}
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Result, ?> result = (Result, ?>) o;
- return kind == result.kind
- && Objects.equals(error, result.error)
- && Objects.equals(ok, result.ok);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(kind, error, ok);
- }
-
- @Override
- public String toString() {
- switch (kind) {
- case Ok:
- return "Error(" + error + ")";
- case Error:
- return "Ok(" + ok + ")";
- default:
- return "Result{" + "kind=" + kind + ", error=" + error + ", ok=" + ok + '}';
- }
- }
-
- public C fold(Function onOk, Function onError) {
- switch (kind) {
- case Ok:
- return onOk.apply(ok);
- case Error:
- return onError.apply(error);
- default:
- throw new IllegalArgumentException(this.toString());
- }
- }
-
- public Result map(Function fn) {
- return this.fold(left -> Result.ok(fn.apply(left)), Result::error);
- }
-
public boolean isOk() {
return kind == Kind.Ok;
}
- public boolean isError() {
- return kind == Kind.Error;
- }
-
public T getOrThrow() {
if (kind == Kind.Ok) {
return ok;
} else {
- throw new NoSuchElementException("no left value on " + this.toString());
+ throw new NoSuchElementException("no ok value on Result.Error(" + error + ")");
}
}
@@ -93,7 +45,7 @@ public E getErrorOrThrow() {
if (kind == Kind.Error) {
return error;
} else {
- throw new NoSuchElementException("no left value on " + this.toString());
+ throw new NoSuchElementException("no error value on Result.Ok(" + ok + ")");
}
}
diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbJavacOptions.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbJavacOptions.java
index 672813a47..75387d4ff 100644
--- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbJavacOptions.java
+++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbJavacOptions.java
@@ -58,8 +58,6 @@ public static SemanticdbJavacOptions parse(String[] args, JavacTask task) {
}
} else if (arg.startsWith("-sourceroot:")) {
result.sourceroot = Paths.get(arg.substring("-sourceroot:".length())).normalize();
- } else if (arg.equals("-build-tool:sbt")) {
- result.uriScheme = UriScheme.ZINC;
} else if (arg.startsWith("-no-relative-path:")) {
String value = arg.substring("-no-relative-path:".length());
switch (value) {
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 7c5238f65..bba83849f 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
@@ -208,16 +208,7 @@ private void appendSemanticdb(
public static Path absolutePathFromUri(SemanticdbJavacOptions options, JavaFileObject file) {
URI uri = file.toUri();
- if ((options.uriScheme == UriScheme.SBT || options.uriScheme == UriScheme.ZINC)
- && uri.getScheme().equals("vf")
- && uri.toString().startsWith("vf://tmp/")) {
- String[] parts = uri.toString().split("/", 5);
- if (parts.length == 5) {
- return options.sourceroot.resolve(Paths.get(parts[4]));
- } else {
- throw new IllegalArgumentException("unsupported URI: " + uri);
- }
- } else if (options.uriScheme == UriScheme.BAZEL) {
+ if (options.uriScheme == UriScheme.BAZEL) {
String toString = file.toString().replace(":", "/");
// This solution is hacky, and it would be very nice to use a dedicated API
// instead.
diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/UriScheme.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/UriScheme.java
index b88bb6669..5977760d1 100644
--- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/UriScheme.java
+++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/UriScheme.java
@@ -2,9 +2,5 @@
public enum UriScheme {
DEFAULT,
- /** @deprecated Use ZINC instead */
- @Deprecated
- SBT,
BAZEL,
- ZINC
}
diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCheckers.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCheckers.kt
index 6bd76c76a..f4952b276 100644
--- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCheckers.kt
+++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCheckers.kt
@@ -2,7 +2,6 @@ package com.sourcegraph.semanticdb_kotlinc
import java.nio.file.Path
import kotlin.contracts.ExperimentalContracts
-import kotlin.math.exp
import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.com.intellij.lang.LighterASTNode
import org.jetbrains.kotlin.com.intellij.util.diff.FlyweightCapableTreeStructure
@@ -12,17 +11,13 @@ import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.*
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
-import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirBasicExpressionChecker
-import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirClassReferenceExpressionChecker
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirQualifiedAccessExpressionChecker
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirTypeOperatorCallChecker
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
import org.jetbrains.kotlin.fir.analysis.checkers.toClassLikeSymbol
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
import org.jetbrains.kotlin.fir.declarations.*
-import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
-import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticFunctionSymbol
@@ -30,8 +25,6 @@ import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
import org.jetbrains.kotlin.fir.resolve.toClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
-import org.jetbrains.kotlin.fir.types.coneType
-import org.jetbrains.kotlin.fir.types.resolvedType
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName