Skip to content
Merged
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
2 changes: 0 additions & 2 deletions bin/packagehub.sh

This file was deleted.

52 changes: 2 additions & 50 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ lazy val V =
val gradle = "7.0"
val scala213 = "2.13.13"
val scalameta = "4.9.3"
val requests = "0.8.0"
val kotlinVersion = "2.2.0"
val kotest = "4.6.3"
val kctfork = "0.7.1"
Expand Down Expand Up @@ -86,25 +85,6 @@ lazy val semanticdbShared = project
libraryDependencies += "com.google.protobuf" % "protobuf-java" % V.protobuf
)

lazy val agent = project
.in(file("semanticdb-agent"))
.settings(
fatjarPackageSettings,
javaOnlySettings,
moduleName := "semanticdb-agent",
libraryDependencies ++=
List(
"net.bytebuddy" % "byte-buddy" % "1.15.11",
"net.bytebuddy" % "byte-buddy-agent" % "1.15.11"
),
Compile / packageBin / packageOptions +=
Package.ManifestAttributes(
"Agent-Class" -> "com.sourcegraph.semanticdb_javac.SemanticdbAgent",
"Can-Redefine-Classes" -> "true",
"Can-Retransform-Classes" -> "true",
"Premain-Class" -> "com.sourcegraph.semanticdb_javac.SemanticdbAgent"
)
)
lazy val gradlePlugin = project
.in(file("semanticdb-gradle-plugin"))
.settings(
Expand Down Expand Up @@ -155,10 +135,6 @@ lazy val javacPlugin = project
// referenced from META-INF/services/com.sun.source.util.Plugin
"com.sourcegraph.semanticdb_javac.SemanticdbPlugin" ->
"com.sourcegraph.semanticdb_javac.SemanticdbPlugin",
// Don't rename PrintJavaVersion because we load it via FQN to
// detect the Java of a JVM installation.
"com.sourcegraph.semanticdb_javac.PrintJavaVersion" ->
"com.sourcegraph.semanticdb_javac.PrintJavaVersion",
// Don't rename InjectSemanticdbOptions because we load it via FQN to
// process a list of Java compiler options.
"com.sourcegraph.semanticdb_javac.InjectSemanticdbOptions" ->
Expand Down Expand Up @@ -243,7 +219,6 @@ lazy val cli = project
libraryDependencies ++=
List(
"org.scala-lang.modules" %% "scala-xml" % V.scalaXml,
"com.lihaoyi" %% "requests" % V.requests,
"org.scalameta" %% "moped" % V.moped,
"org.jetbrains.kotlin" % "kotlin-compiler-embeddable" % V.kotlinVersion,
"org.jetbrains.kotlin" % "kotlin-scripting-common" % V.kotlinVersion,
Expand All @@ -267,10 +242,6 @@ lazy val cli = project
(javacPlugin / Compile / Keys.`package`).value,
"semanticdb-plugin.jar"
)
addJar(
(agent / Compile / Keys.`package`).value,
"semanticdb-agent.jar"
)
addJar((gradlePlugin / Compile / assembly).value, "gradle-plugin.jar")
addJar(
(semanticdbKotlinc / Compile / Keys.`package`).value,
Expand Down Expand Up @@ -532,16 +503,6 @@ lazy val semanticdbKotlincMinimized = project
.value
)

commands +=
Command.command("nativeImageProfiled") { s =>
val targetroot =
file("tests/minimized/.j11/target/scala-2.13/meta").absolutePath
val output = Files.createTempFile("scip-java", "index.scip")
"minimized/compile" ::
s"""nativeImageRunAgent " index-semanticdb --output=$output $targetroot"""" ::
"nativeImage" :: s
}

def minimizedSourceDirectory =
file("tests/minimized/src/main/java").getAbsoluteFile

Expand Down Expand Up @@ -577,7 +538,7 @@ lazy val minimizedSettings = List[Def.Setting[_]](
lazy val minimized = project
.in(file("tests/minimized/.j11"))
.settings(minimizedSettings, javaOnlySettings)
.dependsOn(agent, javacPlugin)
.dependsOn(javacPlugin)
.disablePlugins(JavaFormatterPlugin)

def javacModuleOptions = List(
Expand Down Expand Up @@ -617,15 +578,6 @@ lazy val buildTools = project
.in(file("tests/buildTools"))
.settings(
testSettings,
(Test / javaOptions) ++=
List(
s"-javaagent:${(agent / Compile / Keys.`package`).value}",
s"-Dsemanticdb.pluginpath=${(javacPlugin / Compile / Keys.`package`)
.value}",
s"-Dsemanticdb.sourceroot=${(ThisBuild / baseDirectory).value}",
s"-Dsemanticdb.targetroot=${(agent / Compile / target).value /
"semanticdb-targetroot"}"
),
Test / envVars ++=
Map(
"SCIP_JAVA_CLI" -> ((cli / pack).value / "bin" / "scip-java").toString
Expand All @@ -635,7 +587,7 @@ lazy val buildTools = project
// everything worse
Test / testForkedParallel := !sys.env.contains("CI")
)
.dependsOn(agent, unit)
.dependsOn(unit)

lazy val snapshots = project
.in(file("tests/snapshots"))
Expand Down
17 changes: 4 additions & 13 deletions scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,14 @@ object Embedded {
"gradle-plugin.jar"
)

def agentJar(tmpDir: Path): Path = copyFile(tmpDir, "semanticdb-agent.jar")

def semanticdbKotlincJar(tmpDir: Path): Path = copyFile(
tmpDir,
"semanticdb-kotlinc.jar"
)

private def javacErrorpath(tmp: Path) = tmp.resolve("errorpath.txt")

def customJavac(
sourceroot: Path,
targetroot: Path,
tmp: Path,
javaAtLeast17: Boolean
): Path = {
def customJavac(sourceroot: Path, targetroot: Path, tmp: Path): Path = {
val bin = tmp.resolve("bin")
val javac = bin.resolve("javac")
val java = bin.resolve("java")
Expand All @@ -51,11 +44,9 @@ object Embedded {
|""".stripMargin.getBytes(StandardCharsets.UTF_8)
)
val newJavacopts = tmp.resolve("javac_newarguments")
val javacModuleOptions =
if (javaAtLeast17)
BuildInfo.javacModuleOptions.mkString(" ")
else
""
// --add-exports flags required to access internal javac APIs from our
// SemanticDB plugin. Always set; Java 11+ is the supported baseline.
val javacModuleOptions = BuildInfo.javacModuleOptions.mkString(" ")
val injectSemanticdbArguments = List[String](
"java",
s"-Dsemanticdb.errorpath=$errorpath",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import scala.collection.mutable
import scala.jdk.CollectionConverters.CollectionHasAsScala
import scala.math.Ordering.Implicits.seqOrdering

import com.sourcegraph.scip_java.commands.CommentSyntax
import moped.reporters.Input
import moped.reporters.Position
import org.scip_code.scip.Document
Expand All @@ -20,11 +19,10 @@ object ScipPrinters {
*/
val sourceIndent = " "

def printTextDocument(
doc: Document,
text: String,
comments: CommentSyntax = CommentSyntax.default
): String = {
// scip-java only indexes Java and Kotlin sources, both of which use `//`.
private val commentSyntax = "//"

def printTextDocument(doc: Document, text: String): String = {
val out = new mutable.StringBuilder()
val occurrencesByLine = doc
.getOccurrencesList
Expand Down Expand Up @@ -56,8 +54,6 @@ object ScipPrinters {
}
)
.toMap
val extension = doc.getRelativePath.split("\\.").lastOption.getOrElse("")
val commentSyntax = comments.extensionSyntax(extension)
val input = Input.filename(doc.getRelativePath, text)

// Collect enclosing ranges from all occurrences, grouped by start/end line.
Expand Down Expand Up @@ -118,7 +114,7 @@ object ScipPrinters {
(o.getRangeList.asScala.toList.map(_.toInt), o.getSymbol)
)
occurrences.foreach { occ =>
formatOccurrence(input, out, occ, line, symtab, commentSyntax)
formatOccurrence(input, out, occ, line, symtab)
if ((occ.getSymbolRoles & SymbolRole.Definition_VALUE) > 0) {
syntheticDefinitions
.getOrElse(occ.getSymbol, Nil)
Expand All @@ -129,7 +125,6 @@ object ScipPrinters {
occ,
line,
symtab,
commentSyntax,
syntheticDefinition = Some(syntheticDefinition)
)
}
Expand Down Expand Up @@ -177,7 +172,6 @@ object ScipPrinters {
occ: Occurrence,
line: String,
symtab: Map[String, SymbolInformation],
comment: String,
syntheticDefinition: Option[SymbolInformation] = None
): Unit = {
val pos = mopedPosition(input, occ)
Expand All @@ -199,8 +193,8 @@ object ScipPrinters {
else
"reference"
val indent =
if (pos.startColumn + sourceIndent.length > comment.length)
" " * (pos.startColumn + sourceIndent.length - comment.length)
if (pos.startColumn + sourceIndent.length > commentSyntax.length)
" " * (pos.startColumn + sourceIndent.length - commentSyntax.length)
else
""
val caretCharacter =
Expand All @@ -220,7 +214,7 @@ object ScipPrinters {
val _ = ScipSymbol.parseOrThrowExceptionIfInvalid(symbol)

out
.append(comment)
.append(commentSyntax)
.append(indent)
.append(carets)
.append(" ")
Expand All @@ -235,7 +229,7 @@ object ScipPrinters {
syntheticDefinition.orElse(symtab.get(occ.getSymbol)) match {
case Some(info) if isDefinition =>
val prefix =
comment + (" " * indent.length) + (" " * carets.length) + " "
commentSyntax + (" " * indent.length) + (" " * carets.length) + " "
if (!info.getDisplayName.isEmpty) {
out
.append(prefix)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ object BuildTool {
.copy(
output = index.finalOutput,
targetroot = List(targetroot),
packagehub = index.packagehub,
app = index.app
)
.run()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ case class ClasspathEntry(
artifactId: String,
version: String
) {
def toPackageHubId: String = s"maven:$groupId:$artifactId:$version"
def mavenCoordinate: String = s"maven:$groupId:$artifactId:$version"
def toPackageInformation: MavenPackage =
new MavenPackage(entry, groupId, artifactId, version)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import java.nio.file._

import scala.collection.mutable.ListBuffer
import scala.util.Properties
import scala.util.Try

import com.sourcegraph.io.DeleteVisitor
import com.sourcegraph.scip_java.Embedded
Expand All @@ -26,13 +27,60 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
}

override def generateScip(): Int = {
BuildTool.generateScipFromTargetroot(
generateSemanticdb(),
targetroot,
index
)
val gradleResult = generateSemanticdb()
if (gradleResult.exitCode == 0) {
reportMissingSemanticdbOutput()
}
BuildTool.generateScipFromTargetroot(gradleResult, targetroot, index)
}

/**
* Diagnose the case where Gradle finished successfully but our SemanticDB
* compiler plugin never produced any `.semanticdb` files. This used to be
* silently rescued by a `-javaagent` fallback; now it surfaces as a clear
* error pointing at the two known causes.
*/
private def reportMissingSemanticdbOutput(): Unit = {
if (containsFileWithSuffix(targetroot, ".semanticdb"))
return
if (!containsFileWithSuffix(index.workingDirectory, ".class"))
// Project produced no compiled JVM output — nothing to index, stay quiet.
return
index
.app
.reporter
.error(
s"""scip-java: Gradle finished successfully but produced no SemanticDB output in $targetroot.
|
|This means our SemanticDB compiler plugin was not attached to one or more JavaCompile tasks. Two known causes:
|
| 1. The 'compileOnly' configuration was already resolved before our init script ran.
| Check the Gradle output above for warnings of the form:
| "scip-java: failed to attach SemanticDB compiler plugin to project '<name>'"
| Workaround: apply the SemanticDB plugin earlier (e.g. via a settings plugin),
| or restructure the build so that 'compileOnly' is not resolved at evaluation time.
|
| 2. Another Gradle plugin is replacing the compiler arguments we add (rather than appending).
| Verify with: ./gradlew compileJava --info | grep -- '-Xplugin:semanticdb'
| If '-Xplugin:semanticdb' is missing from the printed javac command, another plugin
| is overwriting JavaCompile.options.compilerArgs.
|""".stripMargin
)
}

private def containsFileWithSuffix(root: Path, suffix: String): Boolean =
Files.isDirectory(root) &&
Try {
val stream = Files.find(
root,
Integer.MAX_VALUE,
(p, attrs) =>
attrs.isRegularFile && p.getFileName.toString.endsWith(suffix)
)
try stream.findFirst().isPresent
finally stream.close()
}.getOrElse(false)

def targetroot: Path = index.finalTargetroot(defaultTargetroot)

private def defaultTargetroot: Path = Paths.get(
Expand Down Expand Up @@ -62,7 +110,6 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
}

private def runCompileCommand(
// toolchains: GradleJavaToolchains,
tmp: Path,
gradleCommand: String
): CommandResult = {
Expand All @@ -81,27 +128,14 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {

Files.walkFileTree(targetroot, new DeleteVisitor())
val result = index.process(buildCommand, env = Map("TERM" -> "dumb"))
printDebugLogs(tmp)
Embedded
.reportUnexpectedJavacErrors(index.app.reporter, tmp)
.getOrElse(result)
}

private def scipJavaDependencies = "scipJavaDependencies"

private def printDebugLogs(tmp: Path): Unit = {
val path = GradleJavaCompiler.debugPath(tmp)
if (index.verbose && Files.isRegularFile(path)) {
Files
.readAllLines(path)
.forEach { line =>
index.app.info(line)
}
}
}

private def initScript(tmp: Path): Path = {
val agentpath = Embedded.agentJar(tmp)
val pluginpath = Embedded.semanticdbJar(tmp)
val gradlePluginPath = Embedded.gradlePluginJar(tmp)
val semanticdbKotlincPath = Embedded.semanticdbKotlincJar(tmp)
Expand All @@ -122,7 +156,6 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) {
| project.ext["semanticdbTarget"] = "$targetroot"
| project.ext["javacPluginJar"] = "$pluginpath"
| project.ext["dependenciesOut"] = "$dependenciesPath"
| project.ext["javacAgentPath"] = "$agentpath"
| project.ext["semanticdbKotlincJar"] = "$semanticdbKotlincPath"
| apply plugin: SemanticdbGradlePlugin
| }
Expand Down
Loading
Loading