From 03c337519069bafb46f6a0170454b22b835346f1 Mon Sep 17 00:00:00 2001 From: jupblb Date: Wed, 27 May 2026 13:48:30 +0200 Subject: [PATCH 01/21] PR1 (M1+M2): Add passive SCIP shard infrastructure and opt-in dual emission First two milestones of dropping the intermediate SemanticDB step in favour of direct SCIP shard output from the Java compiler plugin. Adds, with no behaviour change in the default config: semanticdb-javac: - ScipSymbols: helper that maps SemanticDB symbol strings to SCIP symbol strings. Globals get the '. . . . ' placeholder prefix that the aggregator later rewrites into 'scip-java maven g a v ...'. Locals are normalised to the canonical 'local N' form. - ScipShardWriter: write-or-merge helper for *.scip shards that deduplicates documents/symbols/occurrences across compiler rounds. - ScipShardFromSemanticdb: intermediate translator that converts the in-memory Semanticdb.TextDocument into a single-document Scip.Index shard. To be replaced by a direct-from-AST ScipVisitor in Milestone 3. - SemanticdbJavacOptions: new -emit-scip:on|off flag (default off). - SemanticdbTaskListener: when -emit-scip:on is set, also writes a *.scip shard under META-INF/scip/ alongside the existing *.semanticdb file, reusing the already-built TextDocument. scip-semanticdb: - ScipShardWalker: recursively collects *.scip shards under the configured targetroots, mirroring SemanticdbWalker. - SymbolRewriter: rewrites placeholder global symbols into the final 'scip-java maven ...' form using PackageTable. Locals and already rewritten symbols pass through unchanged. build.sbt: - javacPlugin now depends on scipProto so the plugin can emit Scip.* protobuf messages directly. - Discard top-level Bazel BUILD files from fat-jar merge so the new scipProto resources don't collide with semanticdb-java. tests/unit: - ScipSymbolsSuite: unit tests for ScipSymbols and SymbolRewriter, including the local/global discrimination and Package.EMPTY fallback. - ScipShardEmissionSuite: end-to-end test that drives javac with the semanticdb plugin and -emit-scip:on, then parses the produced Scip.Index shard to assert the document layout and that every emitted symbol either uses the placeholder prefix or is a 'local N'. All 29 unit tests pass. --- build.sbt | 7 +- .../scip_semanticdb/ScipShardWalker.java | 55 +++++ .../scip_semanticdb/SymbolRewriter.java | 58 ++++++ .../ScipShardFromSemanticdb.java | 189 ++++++++++++++++++ .../semanticdb_javac/ScipShardWriter.java | 119 +++++++++++ .../semanticdb_javac/ScipSymbols.java | 57 ++++++ .../SemanticdbJavacOptions.java | 11 + .../SemanticdbTaskListener.java | 53 +++++ .../scala/tests/ScipShardEmissionSuite.scala | 90 +++++++++ .../test/scala/tests/ScipSymbolsSuite.scala | 94 +++++++++ 10 files changed, 732 insertions(+), 1 deletion(-) create mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardWalker.java create mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SymbolRewriter.java create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardFromSemanticdb.java create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSymbols.java create mode 100644 tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala create mode 100644 tests/unit/src/test/scala/tests/ScipSymbolsSuite.scala diff --git a/build.sbt b/build.sbt index 9430dd380..b754d3b93 100644 --- a/build.sbt +++ b/build.sbt @@ -169,7 +169,7 @@ lazy val javacPlugin = project .inAll ) ) - .dependsOn(semanticdb) + .dependsOn(semanticdb, scipProto) lazy val scipProto = project .in(file("scip-java-proto")) @@ -695,6 +695,11 @@ lazy val fatjarPackageSettings = List[Def.Setting[_]]( MergeStrategy.discard case PathList("META-INF", "versions", "9", "module-info.class") => MergeStrategy.discard + // Bazel BUILD files live next to *.proto sources in our subprojects; they are + // not needed at runtime and would conflict when multiple proto modules are + // merged into the same fat jar. + case PathList("BUILD") => + MergeStrategy.discard case x => val oldStrategy = (assembly / assemblyMergeStrategy).value oldStrategy(x) diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardWalker.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardWalker.java new file mode 100644 index 000000000..7122969fe --- /dev/null +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardWalker.java @@ -0,0 +1,55 @@ +package com.sourcegraph.scip_semanticdb; + +import java.io.IOException; +import java.nio.file.FileSystems; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.List; + +/** + * A file visitor that recursively collects all SCIP shard files ({@code *.scip}) under the + * configured targetroots. + */ +public class ScipShardWalker extends SimpleFileVisitor { + private final ArrayList result; + private final ScipSemanticdbOptions options; + private final PathMatcher scipPattern = FileSystems.getDefault().getPathMatcher("glob:**.scip"); + + public ScipShardWalker(ScipSemanticdbOptions options) { + this.options = options; + result = new ArrayList<>(); + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + if (scipPattern.matches(file)) { + result.add(file); + } + return super.visitFile(file, attrs); + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) { + options.reporter.error(exc); + return FileVisitResult.CONTINUE; + } + + /** Returns all {@code *.scip} shard files reachable from {@code options.targetroots}. */ + public static List findScipShards(ScipSemanticdbOptions options) throws IOException { + ScipShardWalker walker = new ScipShardWalker(options); + PathMatcher jarPattern = FileSystems.getDefault().getPathMatcher("glob:**.jar"); + for (Path root : options.targetroots) { + if (jarPattern.matches(root)) { + walker.result.add(root); + } else if (Files.exists(root)) { + Files.walkFileTree(root, walker); + } + } + return walker.result; + } +} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SymbolRewriter.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SymbolRewriter.java new file mode 100644 index 000000000..227ffdcd1 --- /dev/null +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SymbolRewriter.java @@ -0,0 +1,58 @@ +package com.sourcegraph.scip_semanticdb; + +/** + * Rewrites placeholder SCIP global symbols emitted by the compiler plugin into their final form. + * + *

The compiler plugin does not know the Maven coordinates ({@code groupId:artifactId:version}) + * of the source it is compiling, so it emits global symbols with the sentinel prefix {@code ". . . + * . "}. The aggregator resolves the appropriate coordinates via {@link PackageTable} and rewrites + * those symbols to the final {@code "scip-java"} scheme. + * + *

{@code local N} symbols are passed through unchanged. + */ +public final class SymbolRewriter { + + /** + * Sentinel prefix used by the compiler plugin for global symbols whose coordinates are not yet + * known. + */ + public static final String PLACEHOLDER_PREFIX = ". . . . "; + + /** SCIP scheme used for symbols produced by scip-java. */ + public static final String SCIP_JAVA_SCHEME = "scip-java"; + + private final PackageTable packages; + + public SymbolRewriter(PackageTable packages) { + this.packages = packages; + } + + /** + * Returns {@code true} if {@code symbol} is a placeholder global emitted by the compiler plugin. + */ + public static boolean isPlaceholderGlobal(String symbol) { + return symbol != null && symbol.startsWith(PLACEHOLDER_PREFIX); + } + + /** + * Returns {@code true} if {@code symbol} is a SCIP local symbol of the form {@code "local N"}. + */ + public static boolean isLocal(String symbol) { + return symbol != null && symbol.startsWith("local "); + } + + /** + * Rewrites a placeholder global symbol into its final form using the appropriate package + * coordinates from {@link PackageTable}. Local symbols and already-rewritten symbols are returned + * unchanged. + */ + public String rewrite(String symbol) { + if (symbol == null || symbol.isEmpty()) return symbol; + if (isLocal(symbol)) return symbol; + if (!isPlaceholderGlobal(symbol)) return symbol; + + String descriptor = symbol.substring(PLACEHOLDER_PREFIX.length()); + Package pkg = packages.packageForSymbol(descriptor).orElse(Package.EMPTY); + return SCIP_JAVA_SCHEME + " " + pkg.scipTypedEncoding() + " " + descriptor; + } +} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardFromSemanticdb.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardFromSemanticdb.java new file mode 100644 index 000000000..97dfc26c8 --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardFromSemanticdb.java @@ -0,0 +1,189 @@ +package com.sourcegraph.semanticdb_javac; + +import com.sourcegraph.Scip; +import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation; +import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Kind; +import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Property; +import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence; +import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role; + +import java.util.ArrayList; +import java.util.List; + +/** + * Converts an in-memory {@link Semanticdb.TextDocument} into a single-document {@link Scip.Index} + * shard. + * + *

Global SemanticDB symbols are rewritten via {@link ScipSymbols#fromSemanticdbSymbol(String)} + * to use the {@code ". . . . "} placeholder scheme expected by the aggregator. Local symbols are + * normalized to the SCIP {@code "local N"} form. + * + *

This is an intermediate stepping stone: a future {@code ScipVisitor} will build {@link + * Scip.Document} values directly from the javac AST, removing the need for this conversion. + */ +public final class ScipShardFromSemanticdb { + + private ScipShardFromSemanticdb() {} + + /** Builds a single-document {@link Scip.Index} shard from {@code doc}. */ + public static Scip.Index buildShard(Semanticdb.TextDocument doc, String relativePath) { + Scip.Document.Builder document = + Scip.Document.newBuilder() + .setRelativePath(relativePath) + .setLanguage(scipLanguage(doc.getLanguage())); + + for (SymbolOccurrence occ : doc.getOccurrencesList()) { + if (occ.getSymbol().isEmpty()) continue; + document.addOccurrences(toScipOccurrence(occ)); + } + + for (SymbolInformation info : doc.getSymbolsList()) { + if (info.getSymbol().isEmpty()) continue; + document.addSymbols(toScipSymbolInformation(info)); + } + + return Scip.Index.newBuilder().addDocuments(document).build(); + } + + private static String scipLanguage(Semanticdb.Language lang) { + switch (lang) { + case JAVA: + return Scip.Language.Java.name(); + case KOTLIN: + return Scip.Language.Kotlin.name(); + case SCALA: + return Scip.Language.Scala.name(); + default: + return ""; + } + } + + private static Scip.Occurrence toScipOccurrence(SymbolOccurrence occ) { + Scip.Occurrence.Builder builder = + Scip.Occurrence.newBuilder() + .addAllRange(scipRange(occ.getRange())) + .setSymbol(ScipSymbols.fromSemanticdbSymbol(occ.getSymbol())) + .setSymbolRoles(scipRoles(occ.getRole())); + if (occ.hasEnclosingRange()) { + builder.addAllEnclosingRange(scipRange(occ.getEnclosingRange())); + } + return builder.build(); + } + + private static int scipRoles(Role role) { + if (role == Role.DEFINITION || role == Role.SYNTHETIC_DEFINITION) { + return Scip.SymbolRole.Definition_VALUE; + } + return 0; + } + + private static List scipRange(Semanticdb.Range range) { + List result = new ArrayList<>(4); + result.add(range.getStartLine()); + result.add(range.getStartCharacter()); + if (range.getStartLine() == range.getEndLine()) { + result.add(range.getEndCharacter()); + } else { + result.add(range.getEndLine()); + result.add(range.getEndCharacter()); + } + return result; + } + + private static Scip.SymbolInformation toScipSymbolInformation(SymbolInformation info) { + Scip.SymbolInformation.Builder builder = + Scip.SymbolInformation.newBuilder() + .setSymbol(ScipSymbols.fromSemanticdbSymbol(info.getSymbol())) + .setDisplayName(info.getDisplayName()) + .setKind(scipKind(info)); + + if (!info.getEnclosingSymbol().isEmpty()) { + builder.setEnclosingSymbol(ScipSymbols.fromSemanticdbSymbol(info.getEnclosingSymbol())); + } + + for (int i = 0; i < info.getOverriddenSymbolsCount(); i++) { + String overridden = info.getOverriddenSymbols(i); + if (overridden.isEmpty()) continue; + if (isIgnoredOverriddenSymbol(overridden)) continue; + builder.addRelationships( + Scip.Relationship.newBuilder() + .setSymbol(ScipSymbols.fromSemanticdbSymbol(overridden)) + .setIsImplementation(true) + .setIsReference(supportsReferenceRelationship(info))); + } + + String documentation = info.getDocumentation().getMessage(); + if (!documentation.isEmpty()) { + builder.addDocumentation(documentation); + } + + return builder.build(); + } + + private static boolean isIgnoredOverriddenSymbol(String symbol) { + return symbol.equals("java/lang/Object#"); + } + + private static boolean supportsReferenceRelationship(SymbolInformation info) { + switch (info.getKind()) { + case INTERFACE: + case TYPE: + case CLASS: + case OBJECT: + case PACKAGE_OBJECT: + return false; + default: + return true; + } + } + + private static Scip.SymbolInformation.Kind scipKind(SymbolInformation info) { + Kind kind = info.getKind(); + int properties = info.getProperties(); + boolean isStatic = (properties & Property.STATIC_VALUE) > 0; + boolean isAbstract = (properties & Property.ABSTRACT_VALUE) > 0; + boolean isEnum = (properties & Property.ENUM_VALUE) > 0; + + switch (kind) { + case CLASS: + return isEnum ? Scip.SymbolInformation.Kind.Enum : Scip.SymbolInformation.Kind.Class; + case CONSTRUCTOR: + return Scip.SymbolInformation.Kind.Constructor; + case FIELD: + return isStatic + ? Scip.SymbolInformation.Kind.StaticField + : Scip.SymbolInformation.Kind.Field; + case INTERFACE: + return Scip.SymbolInformation.Kind.Interface; + case LOCAL: + return isStatic + ? Scip.SymbolInformation.Kind.StaticVariable + : Scip.SymbolInformation.Kind.Variable; + case MACRO: + return Scip.SymbolInformation.Kind.Macro; + case METHOD: + if (isStatic) return Scip.SymbolInformation.Kind.StaticMethod; + if (isAbstract) return Scip.SymbolInformation.Kind.AbstractMethod; + return Scip.SymbolInformation.Kind.Method; + case OBJECT: + return Scip.SymbolInformation.Kind.Object; + case PACKAGE: + return Scip.SymbolInformation.Kind.Package; + case PACKAGE_OBJECT: + return Scip.SymbolInformation.Kind.PackageObject; + case PARAMETER: + return Scip.SymbolInformation.Kind.Parameter; + case SELF_PARAMETER: + return Scip.SymbolInformation.Kind.SelfParameter; + case TRAIT: + return Scip.SymbolInformation.Kind.Trait; + case TYPE: + return isEnum ? Scip.SymbolInformation.Kind.Enum : Scip.SymbolInformation.Kind.Type; + case TYPE_PARAMETER: + return Scip.SymbolInformation.Kind.TypeParameter; + case UNKNOWN_KIND: + default: + return Scip.SymbolInformation.Kind.UnspecifiedKind; + } + } +} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java new file mode 100644 index 000000000..f3e19f417 --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java @@ -0,0 +1,119 @@ +package com.sourcegraph.semanticdb_javac; + +import com.sourcegraph.Scip; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Writes and merges per-source SCIP shards produced by the compiler plugin. + * + *

Each source file produces a self-contained {@link Scip.Index} shard containing a single {@link + * Scip.Document}. When a shard already exists on disk (e.g. during annotation processing rounds), + * the new document is merged into the existing one, deduplicating occurrences, symbols and + * relationships. + */ +public final class ScipShardWriter { + + private ScipShardWriter() {} + + /** + * Writes the given {@code shard} to {@code output}, creating parent directories as needed. If + * {@code output} already exists, the existing shard is parsed and merged with the new one. + */ + public static void writeOrMerge(Path output, Scip.Index shard) throws IOException { + Files.createDirectories(output.getParent()); + if (Files.exists(output)) { + Scip.Index existing; + try (InputStream is = Files.newInputStream(output)) { + existing = Scip.Index.parseFrom(is); + } + shard = merge(existing, shard); + } + Files.write(output, shard.toByteArray()); + } + + /** + * Merges two SCIP shards by combining their document lists. Documents that share a {@code + * relative_path} have their occurrences, symbols and external symbols deduplicated. + */ + static Scip.Index merge(Scip.Index a, Scip.Index b) { + Scip.Index.Builder builder = Scip.Index.newBuilder(); + if (b.hasMetadata()) { + builder.setMetadata(b.getMetadata()); + } else if (a.hasMetadata()) { + builder.setMetadata(a.getMetadata()); + } + + LinkedHashMap byPath = new LinkedHashMap<>(); + for (Scip.Document doc : a.getDocumentsList()) { + byPath.put(doc.getRelativePath(), doc); + } + for (Scip.Document doc : b.getDocumentsList()) { + Scip.Document existing = byPath.get(doc.getRelativePath()); + if (existing == null) { + byPath.put(doc.getRelativePath(), doc); + } else { + byPath.put(doc.getRelativePath(), mergeDocuments(existing, doc)); + } + } + builder.addAllDocuments(byPath.values()); + + // External symbols: deduplicate by symbol string. Last writer wins to keep latest data. + LinkedHashMap externals = new LinkedHashMap<>(); + for (Scip.SymbolInformation s : a.getExternalSymbolsList()) externals.put(s.getSymbol(), s); + for (Scip.SymbolInformation s : b.getExternalSymbolsList()) externals.put(s.getSymbol(), s); + builder.addAllExternalSymbols(externals.values()); + + return builder.build(); + } + + private static Scip.Document mergeDocuments(Scip.Document a, Scip.Document b) { + Scip.Document.Builder builder = b.toBuilder().clearOccurrences().clearSymbols(); + // Use the most recent metadata for language/relative_path/text/encoding which already + // come from b via toBuilder(). + + // Deduplicate occurrences by structural equality. + LinkedHashMap occurrences = new LinkedHashMap<>(); + for (Scip.Occurrence occ : a.getOccurrencesList()) occurrences.put(occ, occ); + for (Scip.Occurrence occ : b.getOccurrencesList()) occurrences.put(occ, occ); + builder.addAllOccurrences(occurrences.values()); + + // Deduplicate symbols by symbol string; merge relationships and documentation. + Map bySymbol = new LinkedHashMap<>(); + for (Scip.SymbolInformation info : a.getSymbolsList()) bySymbol.put(info.getSymbol(), info); + for (Scip.SymbolInformation info : b.getSymbolsList()) { + Scip.SymbolInformation existing = bySymbol.get(info.getSymbol()); + bySymbol.put(info.getSymbol(), existing == null ? info : mergeSymbol(existing, info)); + } + builder.addAllSymbols(bySymbol.values()); + + return builder.build(); + } + + private static Scip.SymbolInformation mergeSymbol( + Scip.SymbolInformation a, Scip.SymbolInformation b) { + Scip.SymbolInformation.Builder builder = b.toBuilder(); + // Merge relationships, deduplicating by structural equality. + Map rels = new HashMap<>(); + for (Scip.Relationship r : a.getRelationshipsList()) rels.put(r, r); + for (Scip.Relationship r : b.getRelationshipsList()) rels.put(r, r); + builder.clearRelationships().addAllRelationships(rels.values()); + + // Merge documentation, preserving order and avoiding duplicates. + List docs = new ArrayList<>(a.getDocumentationList()); + for (String d : b.getDocumentationList()) { + if (!docs.contains(d)) docs.add(d); + } + builder.clearDocumentation().addAllDocumentation(docs); + + return builder.build(); + } +} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSymbols.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSymbols.java new file mode 100644 index 000000000..bcc4b9153 --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSymbols.java @@ -0,0 +1,57 @@ +package com.sourcegraph.semanticdb_javac; + +/** + * Helpers for emitting SCIP symbol strings from the compiler plugin. + * + *

Because the compiler plugin does not know the final Maven coordinates ({@code + * groupId:artifactId:version}) at compile time, it emits global symbols using a sentinel + * placeholder scheme that is rewritten by the aggregator to its final form: + * + *

+ *   ". . . . " + <semanticdb-style descriptor path>
+ *     ->  "scip-java maven <groupId> <artifactId> <version> <descriptor path>"
+ * 
+ * + *

Local symbols are emitted using the canonical SCIP {@code "local N"} form (with the space) and + * are not rewritten by the aggregator. + */ +public final class ScipSymbols { + + /** + * Prefix marking a global symbol whose package coordinates must be filled in by the aggregator. + * The trailing space matches the SCIP grammar requirement of separating the scheme from the + * package fields. + */ + public static final String PLACEHOLDER_PREFIX = ". . . . "; + + private ScipSymbols() {} + + /** + * Converts a SemanticDB-style symbol string (as produced by {@link GlobalSymbolsCache} and {@link + * LocalSymbolsCache}) into the SCIP symbol form expected by the aggregator. + * + *

    + *
  • Empty strings stay empty. + *
  • Local symbols of the form {@code "local42"} become {@code "local 42"}. + *
  • Everything else is prefixed with {@link #PLACEHOLDER_PREFIX}. + *
+ */ + public static String fromSemanticdbSymbol(String symbol) { + if (symbol == null || symbol.isEmpty()) return ""; + if (SemanticdbSymbols.isLocal(symbol)) { + return "local " + symbol.substring("local".length()); + } + return PLACEHOLDER_PREFIX + symbol; + } + + /** Returns {@code true} if {@code symbol} is a placeholder global symbol. */ + public static boolean isPlaceholderGlobal(String symbol) { + return symbol != null && symbol.startsWith(PLACEHOLDER_PREFIX); + } + + /** Strips the placeholder prefix, returning just the SemanticDB descriptor path. */ + public static String descriptorPath(String placeholderSymbol) { + if (!isPlaceholderGlobal(placeholderSymbol)) return placeholderSymbol; + return placeholderSymbol.substring(PLACEHOLDER_PREFIX.length()); + } +} 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..4bd335b57 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 @@ -24,6 +24,13 @@ public class SemanticdbJavacOptions { public Path sourceroot; public boolean includeText = false; public boolean verboseEnabled = false; + /** + * When {@code true}, the plugin also emits {@code *.scip} shards under {@code META-INF/scip/...} + * alongside the existing {@code *.semanticdb} files. Defaults to {@code false} during the + * SemanticDB→SCIP transition. + */ + public boolean emitScip = false; + public final ArrayList errors; public boolean alreadyReportedErrors = false; public UriScheme uriScheme = UriScheme.DEFAULT; @@ -97,6 +104,10 @@ public static SemanticdbJavacOptions parse(String[] args, JavacTask task) { result.verboseEnabled = true; } else if (arg.equals("-verbose:off")) { result.verboseEnabled = false; + } else if (arg.equals("-emit-scip:on")) { + result.emitScip = true; + } else if (arg.equals("-emit-scip:off")) { + result.emitScip = false; } else if (arg.startsWith("-randomtimestamp")) { } else { result.errors.add(String.format("unknown flag '%s'\n", arg)); 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..09e475dfb 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 @@ -117,12 +117,65 @@ private void onFinishedAnalyze(TaskEvent e) { Path output = path.getOrThrow(); if (Files.exists(output)) appendSemanticdb(e, output, textDocument); else writeSemanticdb(e, output, textDocument); + + if (options.emitScip) { + emitScipShard(e, output, textDocument); + } } else { reporter.error(path.getErrorOrThrow(), e); } } } + /** + * Mirrors {@link #writeSemanticdb}/{@link #appendSemanticdb} but for the {@code *.scip} shard + * layout under {@code META-INF/scip/}. Reuses the in-memory {@link Semanticdb.TextDocument} built + * by {@link SemanticdbVisitor} so we do not pay for a second AST walk. + */ + private void emitScipShard(TaskEvent event, Path semanticdbPath, Semanticdb.TextDocument doc) { + try { + Path shardPath = scipShardPath(semanticdbPath); + com.sourcegraph.Scip.Index shard = ScipShardFromSemanticdb.buildShard(doc, doc.getUri()); + ScipShardWriter.writeOrMerge(shardPath, shard); + } catch (IOException ex) { + this.reportException(ex, event); + } + } + + /** + * Converts a {@code META-INF/semanticdb/.semanticdb} path into the matching {@code + * META-INF/scip/.scip} path. + */ + static Path scipShardPath(Path semanticdbPath) { + Path filename = semanticdbPath.getFileName(); + String name = filename.toString(); + if (name.endsWith(".semanticdb")) { + name = name.substring(0, name.length() - ".semanticdb".length()) + ".scip"; + } else { + name = name + ".scip"; + } + // Replace the trailing ".../META-INF/semanticdb/" prefix with ".../META-INF/scip/" + Path withoutFile = semanticdbPath.getParent(); + Path scipParent = rewriteSemanticdbToScip(withoutFile); + return scipParent.resolve(name); + } + + private static Path rewriteSemanticdbToScip(Path dir) { + // Walk up looking for a `semanticdb` segment immediately under `META-INF` and replace it. + Path root = dir.getRoot(); + java.util.ArrayList parts = new java.util.ArrayList<>(); + for (Path p : dir) parts.add(p.getFileName().toString()); + for (int i = parts.size() - 1; i > 0; i--) { + if (parts.get(i).equals("semanticdb") && parts.get(i - 1).equals("META-INF")) { + parts.set(i, "scip"); + break; + } + } + Path result = root == null ? Paths.get("") : root; + for (String part : parts) result = result.resolve(part); + return result; + } + private void writeSemanticdb(TaskEvent event, Path output, Semanticdb.TextDocument textDocument) { try { byte[] bytes = diff --git a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala new file mode 100644 index 000000000..19639c8b7 --- /dev/null +++ b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala @@ -0,0 +1,90 @@ +package tests + +import java.nio.file.Files + +import scala.jdk.CollectionConverters._ +import scala.meta.Input + +import com.sourcegraph.Scip +import com.sourcegraph.semanticdb_javac.ScipSymbols +import munit.FunSuite + +/** + * Verifies that the `-emit-scip:on` plugin flag produces a parseable `*.scip` + * shard alongside the existing `*.semanticdb` file. + */ +class ScipShardEmissionSuite extends FunSuite { + + private val source = Input.VirtualFile( + "example/Foo.java", + """package example; + | + |public class Foo { + | public int bar() { + | int x = 1; + | return x; + | } + |} + |""".stripMargin + ) + + test("compiler emits a parseable SCIP shard when -emit-scip:on is set") { + val targetroot = Files.createTempDirectory("scip-shard-emission-") + val sourceroot = Files.createTempDirectory("scip-shard-emission-src-") + val compiler = + new TestCompiler(TestCompiler.PROCESSOR_PATH, Nil, targetroot, sourceroot) + val result = compiler.compile( + Seq(source), + Seq( + s"-Xplugin:semanticdb -emit-scip:on -text:on -sourceroot:$sourceroot -targetroot:$targetroot" + ) + ) + assert(result.isSuccess, s"javac failed:\n${result.stdout}") + + val semanticdbPath = targetroot.resolve( + "META-INF/semanticdb/example/Foo.java.semanticdb" + ) + val scipPath = targetroot.resolve("META-INF/scip/example/Foo.java.scip") + + assert(Files.isRegularFile(semanticdbPath), s"missing $semanticdbPath") + assert(Files.isRegularFile(scipPath), s"missing $scipPath") + + val shard = Scip.Index.parseFrom(Files.readAllBytes(scipPath)) + assertEquals(shard.getDocumentsCount, 1) + val doc = shard.getDocuments(0) + assertEquals(doc.getRelativePath, "example/Foo.java") + assertEquals(doc.getLanguage, "Java") + + val symbols = doc.getSymbolsList.asScala + assert(symbols.nonEmpty, "expected at least one symbol") + + // Globals must use the placeholder prefix; locals must use "local N". + symbols.foreach { info => + val s = info.getSymbol + val ok = + s.startsWith(ScipSymbols.PLACEHOLDER_PREFIX) || s.startsWith("local ") + assert(ok, s"unexpected symbol form: $s") + } + + val occurrences = doc.getOccurrencesList.asScala + assert(occurrences.nonEmpty, "expected at least one occurrence") + occurrences.foreach { occ => + val s = occ.getSymbol + val ok = + s.startsWith(ScipSymbols.PLACEHOLDER_PREFIX) || s.startsWith("local ") + assert(ok, s"unexpected occurrence symbol: $s") + } + } + + test("compiler does not emit SCIP shards when -emit-scip is off") { + val targetroot = Files.createTempDirectory("scip-shard-off-") + val sourceroot = Files.createTempDirectory("scip-shard-off-src-") + val compiler = + new TestCompiler(TestCompiler.PROCESSOR_PATH, Nil, targetroot, sourceroot) + val result = compiler.compileSemanticdb(Seq(source)) + assert(result.isSuccess, s"javac failed:\n${result.stdout}") + + val scipPath = targetroot.resolve("META-INF/scip/example/Foo.java.scip") + assert(!Files.exists(scipPath), s"unexpected scip shard at $scipPath") + } +} diff --git a/tests/unit/src/test/scala/tests/ScipSymbolsSuite.scala b/tests/unit/src/test/scala/tests/ScipSymbolsSuite.scala new file mode 100644 index 000000000..cf9708ddd --- /dev/null +++ b/tests/unit/src/test/scala/tests/ScipSymbolsSuite.scala @@ -0,0 +1,94 @@ +package tests + +import java.nio.file.Paths +import java.util.{Collections, Optional} + +import com.sourcegraph.Scip +import com.sourcegraph.scip_semanticdb.{ + Package, + PackageTable, + ScipOutputFormat, + ScipSemanticdbOptions, + ScipSemanticdbReporter, + SymbolRewriter +} +import com.sourcegraph.semanticdb_javac.ScipSymbols +import munit.FunSuite + +class ScipSymbolsSuite extends FunSuite { + + test("global symbol gets placeholder prefix") { + assertEquals( + ScipSymbols.fromSemanticdbSymbol("com/example/Foo#bar()."), + ". . . . com/example/Foo#bar()." + ) + } + + test("local symbol gets canonical SCIP form") { + assertEquals(ScipSymbols.fromSemanticdbSymbol("local42"), "local 42") + } + + test("empty / null symbol stays empty") { + assertEquals(ScipSymbols.fromSemanticdbSymbol(""), "") + assertEquals(ScipSymbols.fromSemanticdbSymbol(null), "") + } + + test("isPlaceholderGlobal recognises the prefix") { + assert(ScipSymbols.isPlaceholderGlobal(". . . . a/b#")) + assert(!ScipSymbols.isPlaceholderGlobal("local 1")) + assert(!ScipSymbols.isPlaceholderGlobal("scip-java maven g a v a/b#")) + } + + test("descriptorPath strips the placeholder prefix") { + assertEquals(ScipSymbols.descriptorPath(". . . . a/b#"), "a/b#") + assertEquals(ScipSymbols.descriptorPath("local 1"), "local 1") + } + + // A PackageTable built with no packages — packageForSymbol always returns empty + // unless the JDK classfile is on the classpath. Override defensively just in case. + private lazy val emptyPackages: PackageTable = + new PackageTable( + new ScipSemanticdbOptions( + Collections.emptyList(), + Paths.get("/tmp"), + Paths.get("/tmp"), + new ScipSemanticdbReporter() {}, + Scip + .ToolInfo + .newBuilder() + .setName("scip-java") + .setVersion("test") + .build(), + ScipOutputFormat.TYPED_PROTOBUF, + false, + Collections.emptyList(), + false, + true, + false + ) + ) { + override def packageForSymbol(symbol: String): Optional[Package] = + Optional.empty() + } + + test("SymbolRewriter leaves locals and final symbols alone") { + val rewriter = new SymbolRewriter(emptyPackages) + assertEquals(rewriter.rewrite("local 1"), "local 1") + assertEquals( + rewriter.rewrite("scip-java maven g a v com/example/Foo#"), + "scip-java maven g a v com/example/Foo#" + ) + assertEquals(rewriter.rewrite(""), "") + assertEquals(rewriter.rewrite(null), null) + } + + test( + "SymbolRewriter falls back to empty package when no metadata available" + ) { + val rewriter = new SymbolRewriter(emptyPackages) + assertEquals( + rewriter.rewrite(". . . . com/example/Foo#bar()."), + "scip-java maven . . com/example/Foo#bar()." + ) + } +} From 7b9b9da861fd33ed1facfa0c856d55eb9e074ba2 Mon Sep 17 00:00:00 2001 From: jupblb Date: Wed, 27 May 2026 13:54:20 +0200 Subject: [PATCH 02/21] PR1 (M3): Fork SemanticdbVisitor into native ScipVisitor Milestone 3 of the SemanticDB->SCIP migration: replace the bridge that went through ScipShardFromSemanticdb with a direct AST walk that produces Scip.Document values. - ScipVisitor: fork of SemanticdbVisitor with identical traversal semantics. Emits Scip.Occurrence, Scip.SymbolInformation, and Scip.Relationship directly. Symbols still come from the existing GlobalSymbolsCache/LocalSymbolsCache and are translated to the placeholder SCIP form via ScipSymbols.fromSemanticdbSymbol at the emission boundary. Skips signatures and annotations for now - ScipSignatureFormatter in Milestone 4 will add signature_documentation. - SemanticdbTaskListener: when -emit-scip:on is set, runs ScipVisitor directly instead of converting from Semanticdb.TextDocument. This is a second AST walk during the transition; SemanticdbVisitor remains the sole producer of legacy *.semanticdb files until Milestone 8. - ScipShardFromSemanticdb: deleted; no longer needed now that ScipVisitor produces the same shard format natively. All 29 unit tests pass, including the end-to-end ScipShardEmissionSuite that exercises the new ScipVisitor through real javac invocations. --- .../ScipShardFromSemanticdb.java | 189 ----- .../semanticdb_javac/ScipVisitor.java | 700 ++++++++++++++++++ .../SemanticdbTaskListener.java | 15 +- 3 files changed, 709 insertions(+), 195 deletions(-) delete mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardFromSemanticdb.java create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardFromSemanticdb.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardFromSemanticdb.java deleted file mode 100644 index 97dfc26c8..000000000 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardFromSemanticdb.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.sourcegraph.semanticdb_javac; - -import com.sourcegraph.Scip; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Kind; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Property; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role; - -import java.util.ArrayList; -import java.util.List; - -/** - * Converts an in-memory {@link Semanticdb.TextDocument} into a single-document {@link Scip.Index} - * shard. - * - *

Global SemanticDB symbols are rewritten via {@link ScipSymbols#fromSemanticdbSymbol(String)} - * to use the {@code ". . . . "} placeholder scheme expected by the aggregator. Local symbols are - * normalized to the SCIP {@code "local N"} form. - * - *

This is an intermediate stepping stone: a future {@code ScipVisitor} will build {@link - * Scip.Document} values directly from the javac AST, removing the need for this conversion. - */ -public final class ScipShardFromSemanticdb { - - private ScipShardFromSemanticdb() {} - - /** Builds a single-document {@link Scip.Index} shard from {@code doc}. */ - public static Scip.Index buildShard(Semanticdb.TextDocument doc, String relativePath) { - Scip.Document.Builder document = - Scip.Document.newBuilder() - .setRelativePath(relativePath) - .setLanguage(scipLanguage(doc.getLanguage())); - - for (SymbolOccurrence occ : doc.getOccurrencesList()) { - if (occ.getSymbol().isEmpty()) continue; - document.addOccurrences(toScipOccurrence(occ)); - } - - for (SymbolInformation info : doc.getSymbolsList()) { - if (info.getSymbol().isEmpty()) continue; - document.addSymbols(toScipSymbolInformation(info)); - } - - return Scip.Index.newBuilder().addDocuments(document).build(); - } - - private static String scipLanguage(Semanticdb.Language lang) { - switch (lang) { - case JAVA: - return Scip.Language.Java.name(); - case KOTLIN: - return Scip.Language.Kotlin.name(); - case SCALA: - return Scip.Language.Scala.name(); - default: - return ""; - } - } - - private static Scip.Occurrence toScipOccurrence(SymbolOccurrence occ) { - Scip.Occurrence.Builder builder = - Scip.Occurrence.newBuilder() - .addAllRange(scipRange(occ.getRange())) - .setSymbol(ScipSymbols.fromSemanticdbSymbol(occ.getSymbol())) - .setSymbolRoles(scipRoles(occ.getRole())); - if (occ.hasEnclosingRange()) { - builder.addAllEnclosingRange(scipRange(occ.getEnclosingRange())); - } - return builder.build(); - } - - private static int scipRoles(Role role) { - if (role == Role.DEFINITION || role == Role.SYNTHETIC_DEFINITION) { - return Scip.SymbolRole.Definition_VALUE; - } - return 0; - } - - private static List scipRange(Semanticdb.Range range) { - List result = new ArrayList<>(4); - result.add(range.getStartLine()); - result.add(range.getStartCharacter()); - if (range.getStartLine() == range.getEndLine()) { - result.add(range.getEndCharacter()); - } else { - result.add(range.getEndLine()); - result.add(range.getEndCharacter()); - } - return result; - } - - private static Scip.SymbolInformation toScipSymbolInformation(SymbolInformation info) { - Scip.SymbolInformation.Builder builder = - Scip.SymbolInformation.newBuilder() - .setSymbol(ScipSymbols.fromSemanticdbSymbol(info.getSymbol())) - .setDisplayName(info.getDisplayName()) - .setKind(scipKind(info)); - - if (!info.getEnclosingSymbol().isEmpty()) { - builder.setEnclosingSymbol(ScipSymbols.fromSemanticdbSymbol(info.getEnclosingSymbol())); - } - - for (int i = 0; i < info.getOverriddenSymbolsCount(); i++) { - String overridden = info.getOverriddenSymbols(i); - if (overridden.isEmpty()) continue; - if (isIgnoredOverriddenSymbol(overridden)) continue; - builder.addRelationships( - Scip.Relationship.newBuilder() - .setSymbol(ScipSymbols.fromSemanticdbSymbol(overridden)) - .setIsImplementation(true) - .setIsReference(supportsReferenceRelationship(info))); - } - - String documentation = info.getDocumentation().getMessage(); - if (!documentation.isEmpty()) { - builder.addDocumentation(documentation); - } - - return builder.build(); - } - - private static boolean isIgnoredOverriddenSymbol(String symbol) { - return symbol.equals("java/lang/Object#"); - } - - private static boolean supportsReferenceRelationship(SymbolInformation info) { - switch (info.getKind()) { - case INTERFACE: - case TYPE: - case CLASS: - case OBJECT: - case PACKAGE_OBJECT: - return false; - default: - return true; - } - } - - private static Scip.SymbolInformation.Kind scipKind(SymbolInformation info) { - Kind kind = info.getKind(); - int properties = info.getProperties(); - boolean isStatic = (properties & Property.STATIC_VALUE) > 0; - boolean isAbstract = (properties & Property.ABSTRACT_VALUE) > 0; - boolean isEnum = (properties & Property.ENUM_VALUE) > 0; - - switch (kind) { - case CLASS: - return isEnum ? Scip.SymbolInformation.Kind.Enum : Scip.SymbolInformation.Kind.Class; - case CONSTRUCTOR: - return Scip.SymbolInformation.Kind.Constructor; - case FIELD: - return isStatic - ? Scip.SymbolInformation.Kind.StaticField - : Scip.SymbolInformation.Kind.Field; - case INTERFACE: - return Scip.SymbolInformation.Kind.Interface; - case LOCAL: - return isStatic - ? Scip.SymbolInformation.Kind.StaticVariable - : Scip.SymbolInformation.Kind.Variable; - case MACRO: - return Scip.SymbolInformation.Kind.Macro; - case METHOD: - if (isStatic) return Scip.SymbolInformation.Kind.StaticMethod; - if (isAbstract) return Scip.SymbolInformation.Kind.AbstractMethod; - return Scip.SymbolInformation.Kind.Method; - case OBJECT: - return Scip.SymbolInformation.Kind.Object; - case PACKAGE: - return Scip.SymbolInformation.Kind.Package; - case PACKAGE_OBJECT: - return Scip.SymbolInformation.Kind.PackageObject; - case PARAMETER: - return Scip.SymbolInformation.Kind.Parameter; - case SELF_PARAMETER: - return Scip.SymbolInformation.Kind.SelfParameter; - case TRAIT: - return Scip.SymbolInformation.Kind.Trait; - case TYPE: - return isEnum ? Scip.SymbolInformation.Kind.Enum : Scip.SymbolInformation.Kind.Type; - case TYPE_PARAMETER: - return Scip.SymbolInformation.Kind.TypeParameter; - case UNKNOWN_KIND: - default: - return Scip.SymbolInformation.Kind.UnspecifiedKind; - } - } -} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java new file mode 100644 index 000000000..9f880bc03 --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java @@ -0,0 +1,700 @@ +package com.sourcegraph.semanticdb_javac; + +import com.sourcegraph.Scip; +import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Property; +import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role; +import com.sun.source.tree.AnnotatedTypeTree; +import com.sun.source.tree.ClassTree; +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.ExpressionTree; +import com.sun.source.tree.IdentifierTree; +import com.sun.source.tree.LineMap; +import com.sun.source.tree.MemberReferenceTree; +import com.sun.source.tree.MemberSelectTree; +import com.sun.source.tree.MethodTree; +import com.sun.source.tree.NewClassTree; +import com.sun.source.tree.ParameterizedTypeTree; +import com.sun.source.tree.Tree; +import com.sun.source.tree.TypeParameterTree; +import com.sun.source.tree.VariableTree; +import com.sun.source.util.SourcePositions; +import com.sun.source.util.TreePath; +import com.sun.source.util.TreePathScanner; +import com.sun.source.util.Trees; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.NoType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; +import javax.tools.Diagnostic; + +/** + * Walks the AST of a typechecked compilation unit and generates a {@link Scip.Document} directly. + * + *

Structurally this is a fork of {@link SemanticdbVisitor} that emits SCIP types instead of + * SemanticDB ones. Symbols are produced through {@link GlobalSymbolsCache} and then translated to + * the placeholder SCIP form via {@link ScipSymbols#fromSemanticdbSymbol(String)}. + * + *

Signature documentation and SemanticDB-only metadata (access, annotations, full SemanticDB + * type tree) are not yet emitted; those will be added by {@code ScipSignatureFormatter} in a + * follow-up milestone. + */ +public final class ScipVisitor extends TreePathScanner { + + private final GlobalSymbolsCache globals; + private final LocalSymbolsCache locals; + private final Types types; + private final Trees trees; + private final CompilationUnitTree compUnitTree; + private final Elements elements; + private final SemanticdbJavacOptions options; + private final ArrayList occurrences; + private final LinkedHashMap symbols; + private String source; + private final String relativePath; + private final LinkedHashMap nodes; + + public ScipVisitor( + GlobalSymbolsCache globals, + CompilationUnitTree compUnitTree, + SemanticdbJavacOptions options, + Types types, + Trees trees, + Elements elements) { + this.globals = globals; + this.locals = new LocalSymbolsCache(); + this.options = options; + this.types = types; + this.elements = elements; + this.trees = trees; + this.compUnitTree = compUnitTree; + this.occurrences = new ArrayList<>(); + this.symbols = new LinkedHashMap<>(); + this.source = sourceText(); + this.relativePath = sourceRelativePath(compUnitTree, options); + this.nodes = new LinkedHashMap<>(); + } + + /** Builds a single-document {@link Scip.Index} shard for the given compilation unit. */ + public Scip.Index buildShard(CompilationUnitTree tree) { + this.scan(tree, null); + resolveNodes(); + + Scip.Document.Builder document = + Scip.Document.newBuilder() + .setRelativePath(relativePath) + .setLanguage(Scip.Language.Java.name()); + if (options.includeText) { + document.setText(source); + } + document.addAllOccurrences(occurrences); + document.addAllSymbols(symbols.values()); + + return Scip.Index.newBuilder().addDocuments(document).build(); + } + + // ========================== + // Symbol/occurrence emission + // ========================== + + private Optional emitSymbolOccurrence( + Element sym, Tree tree, Name name, Role role, CompilerRange kind) { + if (sym == null || name == null) return Optional.empty(); + Optional range = semanticdbRange(tree, kind, sym, name.toString()); + if (role == Role.DEFINITION) { + emitOccurrence(sym, range, role, computeEnclosingRange(tree)); + emitSymbolInformation(sym, tree); + return range; + } + emitOccurrence(sym, range, role, Optional.empty()); + return range; + } + + private void emitOccurrence( + Element sym, + Optional range, + Role role, + Optional enclosingRange) { + if (sym == null || !range.isPresent()) return; + String semanticdbSymbol = semanticdbSymbol(sym); + if (semanticdbSymbol.equals(SemanticdbSymbols.NONE)) return; + + Scip.Occurrence.Builder occ = + Scip.Occurrence.newBuilder() + .addAllRange(scipRange(range.get())) + .setSymbol(ScipSymbols.fromSemanticdbSymbol(semanticdbSymbol)) + .setSymbolRoles(scipRole(role)); + enclosingRange.ifPresent(r -> occ.addAllEnclosingRange(scipRange(r))); + occurrences.add(occ.build()); + } + + private void emitSymbolInformation(Element sym, Tree tree) { + String semanticdbSymbol = semanticdbSymbol(sym); + if (semanticdbSymbol.equals(SemanticdbSymbols.NONE)) return; + + Scip.SymbolInformation.Builder builder = + Scip.SymbolInformation.newBuilder() + .setSymbol(ScipSymbols.fromSemanticdbSymbol(semanticdbSymbol)) + .setDisplayName(sym.getSimpleName().toString()) + .setKind(scipKind(sym)); + + if (SemanticdbSymbols.isLocal(semanticdbSymbol)) { + String enclosingSymbol = semanticdbSymbol(sym.getEnclosingElement()); + if (enclosingSymbol != null && !enclosingSymbol.equals(SemanticdbSymbols.NONE)) { + builder.setEnclosingSymbol(ScipSymbols.fromSemanticdbSymbol(enclosingSymbol)); + } + } + + String documentation = semanticdbDocumentation(tree); + if (documentation != null && !documentation.isEmpty()) { + builder.addDocumentation(documentation); + } + + boolean supportsReferenceRel = supportsReferenceRelationship(sym); + + switch (sym.getKind()) { + case ENUM: + case CLASS: + addParentRelationships(builder, (TypeElement) sym, supportsReferenceRel); + break; + case INTERFACE: + case ANNOTATION_TYPE: + addParentRelationships(builder, (TypeElement) sym, supportsReferenceRel); + break; + case METHOD: + for (String overridden : + semanticdbOverrides( + (ExecutableElement) sym, sym.getEnclosingElement(), new HashSet<>())) { + if (isIgnoredOverriddenSymbol(overridden)) continue; + builder.addRelationships( + Scip.Relationship.newBuilder() + .setSymbol(ScipSymbols.fromSemanticdbSymbol(overridden)) + .setIsImplementation(true) + .setIsReference(supportsReferenceRel)); + } + break; + case ENUM_CONSTANT: + if (tree instanceof VariableTree && ((VariableTree) tree).getInitializer() != null) { + String args = + ((NewClassTree) ((VariableTree) tree).getInitializer()) + .getArguments().stream() + .map(ExpressionTree::toString) + .collect(Collectors.joining(", ")); + if (!args.isEmpty()) { + builder.setDisplayName(sym.getSimpleName().toString() + "(" + args + ")"); + } + } + break; + default: + break; + } + + // Deduplicate by symbol; last write wins so newly discovered metadata takes precedence. + symbols.put(builder.getSymbol(), builder.build()); + } + + private void addParentRelationships( + Scip.SymbolInformation.Builder builder, TypeElement sym, boolean supportsReferenceRel) { + for (String parent : semanticdbParentSymbols(sym)) { + if (isIgnoredOverriddenSymbol(parent)) continue; + builder.addRelationships( + Scip.Relationship.newBuilder() + .setSymbol(ScipSymbols.fromSemanticdbSymbol(parent)) + .setIsImplementation(true) + .setIsReference(supportsReferenceRel)); + } + } + + private static boolean isIgnoredOverriddenSymbol(String symbol) { + return symbol.equals("java/lang/Object#"); + } + + private static boolean supportsReferenceRelationship(Element sym) { + switch (sym.getKind()) { + case INTERFACE: + case CLASS: + case ANNOTATION_TYPE: + return false; + default: + return true; + } + } + + // ================================================= + // Range / role / kind translation between SemanticDB and SCIP. + // ================================================= + + private static int scipRole(Role role) { + if (role == Role.DEFINITION || role == Role.SYNTHETIC_DEFINITION) { + return Scip.SymbolRole.Definition_VALUE; + } + return 0; + } + + private static List scipRange(Semanticdb.Range range) { + if (range.getStartLine() == range.getEndLine()) { + return Arrays.asList( + range.getStartLine(), range.getStartCharacter(), range.getEndCharacter()); + } + return Arrays.asList( + range.getStartLine(), + range.getStartCharacter(), + range.getEndLine(), + range.getEndCharacter()); + } + + private static Scip.SymbolInformation.Kind scipKind(Element sym) { + int properties = 0; + for (Modifier modifier : sym.getModifiers()) { + if (modifier == Modifier.STATIC) properties |= Property.STATIC_VALUE; + else if (modifier == Modifier.ABSTRACT) properties |= Property.ABSTRACT_VALUE; + else if (modifier == Modifier.DEFAULT) properties |= Property.DEFAULT_VALUE; + } + if (((properties & Property.ABSTRACT_VALUE) > 0) + && ((properties & Property.DEFAULT_VALUE) > 0)) { + properties ^= Property.ABSTRACT_VALUE; + } + boolean isStatic = (properties & Property.STATIC_VALUE) > 0; + boolean isAbstract = (properties & Property.ABSTRACT_VALUE) > 0; + + switch (sym.getKind()) { + case ENUM: + return Scip.SymbolInformation.Kind.Enum; + case ENUM_CONSTANT: + return Scip.SymbolInformation.Kind.EnumMember; + case CLASS: + return Scip.SymbolInformation.Kind.Class; + case INTERFACE: + case ANNOTATION_TYPE: + return Scip.SymbolInformation.Kind.Interface; + case FIELD: + return isStatic + ? Scip.SymbolInformation.Kind.StaticField + : Scip.SymbolInformation.Kind.Field; + case CONSTRUCTOR: + return Scip.SymbolInformation.Kind.Constructor; + case METHOD: + if (isStatic) return Scip.SymbolInformation.Kind.StaticMethod; + if (isAbstract) return Scip.SymbolInformation.Kind.AbstractMethod; + return Scip.SymbolInformation.Kind.Method; + case TYPE_PARAMETER: + return Scip.SymbolInformation.Kind.TypeParameter; + case LOCAL_VARIABLE: + case EXCEPTION_PARAMETER: + case RESOURCE_VARIABLE: + return Scip.SymbolInformation.Kind.Variable; + case PARAMETER: + return Scip.SymbolInformation.Kind.Parameter; + case PACKAGE: + return Scip.SymbolInformation.Kind.Package; + default: + return Scip.SymbolInformation.Kind.UnspecifiedKind; + } + } + + // =========================================== + // Node resolution and traversal (unchanged from SemanticdbVisitor) + // =========================================== + + void resolveNodes() { + HashSet ignoreNodes = new HashSet<>(); + for (Tree node : nodes.keySet()) { + if (node instanceof NewClassTree) { + NewClassTree newClassTree = (NewClassTree) node; + if (newClassTree.getClassBody() == null) { + if (newClassTree.getIdentifier() instanceof ParameterizedTypeTree) { + ParameterizedTypeTree paramNode = (ParameterizedTypeTree) newClassTree.getIdentifier(); + ignoreNodes.add(paramNode.getType()); + } + ignoreNodes.add(newClassTree.getIdentifier()); + } + } + } + + for (Map.Entry entry : nodes.entrySet()) { + Tree node = entry.getKey(); + if (!ignoreNodes.contains(node)) { + if (node instanceof TypeParameterTree) { + resolveTypeParameterTree((TypeParameterTree) node, entry.getValue()); + } else if (node instanceof ClassTree) { + resolveClassTree((ClassTree) node, entry.getValue()); + } else if (node instanceof MethodTree) { + resolveMethodTree((MethodTree) node, entry.getValue()); + } else if (node instanceof VariableTree) { + resolveVariableTree((VariableTree) node, entry.getValue()); + } else if (node instanceof IdentifierTree) { + resolveIdentifierTree((IdentifierTree) node, entry.getValue()); + } else if (node instanceof MemberReferenceTree) { + resolveMemberReferenceTree((MemberReferenceTree) node, entry.getValue()); + } else if (node instanceof MemberSelectTree) { + resolveMemberSelectTree((MemberSelectTree) node, entry.getValue()); + } else if (node instanceof NewClassTree) { + resolveNewClassTree((NewClassTree) node, entry.getValue()); + } + } + } + } + + @Override + public Void scan(Tree tree, Void unused) { + if (tree != null) { + TreePath path = new TreePath(getCurrentPath(), tree); + nodes.put(tree, path); + } + return super.scan(tree, unused); + } + + private boolean isAnonymous(Element sym) { + return sym.getSimpleName().length() == 0; + } + + private void resolveClassTree(ClassTree node, TreePath treePath) { + Element sym = trees.getElement(treePath); + if (sym != null && sym.getSimpleName().length() > 0) { + emitSymbolOccurrence( + sym, + node, + sym.getSimpleName(), + Role.DEFINITION, + CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); + } + } + + private void resolveTypeParameterTree(TypeParameterTree node, TreePath treePath) { + Element sym = trees.getElement(treePath); + if (sym != null && sym.getSimpleName().length() > 0) { + emitSymbolOccurrence( + sym, node, sym.getSimpleName(), Role.DEFINITION, CompilerRange.FROM_POINT_TO_SYMBOL_NAME); + } + } + + private void resolveMethodTree(MethodTree node, TreePath treePath) { + Element sym = trees.getElement(treePath); + if (sym != null) { + Element enclosingElement = sym.getEnclosingElement(); + if (sym.getKind() != ElementKind.CONSTRUCTOR || !isAnonymous(enclosingElement)) { + Name name; + if (sym.getKind() == ElementKind.CONSTRUCTOR) name = enclosingElement.getSimpleName(); + else name = sym.getSimpleName(); + + emitSymbolOccurrence( + sym, node, name, Role.DEFINITION, CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); + } + } + } + + private void resolveVariableTree(VariableTree node, TreePath treePath) { + Element sym = trees.getElement(treePath); + if (sym != null) { + Optional range = + emitSymbolOccurrence( + sym, + node, + sym.getSimpleName(), + Role.DEFINITION, + CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); + if (sym.getKind() == ElementKind.ENUM_CONSTANT) { + TreePath typeTreePath = nodes.get(node.getInitializer()); + Element typeSym = trees.getElement(typeTreePath); + if (typeSym != null) emitOccurrence(typeSym, range, Role.REFERENCE, Optional.empty()); + } + } + } + + private void resolveIdentifierTree(IdentifierTree node, TreePath treePath) { + Name nodeName = node.getName(); + if (nodeName != null) { + Element sym = trees.getElement(treePath); + if (sym != null) { + boolean isThis = nodeName.toString().equals("this"); + boolean isSuper = !isThis && nodeName.toString().equals("super"); + if (((sym.getKind() == ElementKind.CONSTRUCTOR) == isThis) || (isSuper)) { + TreePath parentPath = treePath.getParentPath(); + Element parentSym = trees.getElement(parentPath); + if (parentSym == null || parentSym.getKind() != null) { + emitSymbolOccurrence( + sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_START_TO_END); + } + } + } + } + } + + private void resolveMemberReferenceTree(MemberReferenceTree node, TreePath treePath) { + Element sym = trees.getElement(treePath); + if (sym != null) { + emitSymbolOccurrence( + sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_END_TO_SYMBOL_NAME); + } + } + + private void resolveMemberSelectTree(MemberSelectTree node, TreePath treePath) { + Element sym = trees.getElement(treePath); + if (sym != null) { + emitSymbolOccurrence( + sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_END_TO_SYMBOL_NAME); + } + } + + private void resolveNewClassTree(NewClassTree node, TreePath treePath) { + if (node.getIdentifier() != null && node.getClassBody() == null) { + Element sym = trees.getElement(treePath); + if (sym != null) { + TreePath parentPath = treePath.getParentPath(); + Element parentSym = trees.getElement(parentPath); + if (parentSym == null || parentSym.getKind() != ElementKind.ENUM_CONSTANT) { + TreePath identifierTreePath = nodes.get(node.getIdentifier()); + Element identifierSym = trees.getElement(identifierTreePath); + if (identifierSym != null) { + emitSymbolOccurrence( + sym, + node, + identifierSym.getSimpleName(), + Role.REFERENCE, + CompilerRange.FROM_TEXT_SEARCH); + } else if (node.getIdentifier().getKind() == Tree.Kind.ANNOTATED_TYPE) { + AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier(); + if (annotatedTypeTree.getUnderlyingType() != null + && annotatedTypeTree.getUnderlyingType().getKind() == Tree.Kind.IDENTIFIER) { + IdentifierTree ident = (IdentifierTree) annotatedTypeTree.getUnderlyingType(); + emitSymbolOccurrence( + sym, ident, ident.getName(), Role.REFERENCE, CompilerRange.FROM_TEXT_SEARCH); + } + } + } + } + } + } + + // ================================================= + // Helpers shared with SemanticdbVisitor (range / symbol / parent overrides). + // ================================================= + + private String semanticdbSymbol(Element sym) { + return globals.semanticdbSymbol(sym, locals); + } + + private Optional semanticdbRange( + Tree tree, CompilerRange kind, Element sym, String name) { + if (sym == null) return Optional.empty(); + + SourcePositions sourcePositions = trees.getSourcePositions(); + int start = (int) sourcePositions.getStartPosition(compUnitTree, tree); + int end = (int) sourcePositions.getEndPosition(compUnitTree, tree); + if (kind.isPlusOne()) start++; + + if (name != null) { + if (kind.isFromTextSearch() && name.length() > 0) { + Optional startEndRange = + RangeFinder.findRange(sym, name, start, end, this.source, kind.isFromEnd()); + if (startEndRange.isPresent()) { + start = startEndRange.get().start; + end = startEndRange.get().end; + } + } else if (kind.isFromPoint()) { + if (start != Diagnostic.NOPOS) { + int testEnd = start + name.length(); + if (source.length() > testEnd && source.substring(start, testEnd).equals(name)) { + end = testEnd; + } + } + } else if (kind.isFromEndPoint()) { + if (end != Diagnostic.NOPOS) { + int testStart = end - name.length(); + if (testStart >= 0 + && source.length() > end + && source.substring(testStart, end).equals(name)) { + start = testStart; + } + } + } + } + + if (start != Diagnostic.NOPOS && end != Diagnostic.NOPOS && end > start) { + LineMap lineMap = compUnitTree.getLineMap(); + Semanticdb.Range range = + Semanticdb.Range.newBuilder() + .setStartLine((int) lineMap.getLineNumber(start) - 1) + .setStartCharacter((int) lineMap.getColumnNumber(start) - 1) + .setEndLine((int) lineMap.getLineNumber(end) - 1) + .setEndCharacter((int) lineMap.getColumnNumber(end) - 1) + .build(); + + range = correctForTabs(range, lineMap, start); + return Optional.of(range); + } + return Optional.empty(); + } + + private Semanticdb.Range correctForTabs(Semanticdb.Range range, LineMap lineMap, int start) { + int startLinePos = (int) lineMap.getPosition(lineMap.getLineNumber(start), 0); + if (this.source.charAt(startLinePos) == '\t') { + int count = 1; + while (this.source.charAt(++startLinePos) == '\t') count++; + range = + range + .toBuilder() + .setStartCharacter(range.getStartCharacter() - (count * 7)) + .setEndCharacter(range.getEndCharacter() - (count * 7)) + .build(); + } + return range; + } + + private Optional computeEnclosingRange(Tree tree) { + if (tree == null) return Optional.empty(); + TreePath path = nodes.get(tree); + if (path == null) return Optional.empty(); + + Tree enclosingTree = tree; + if (!(tree instanceof MethodTree + || tree instanceof ClassTree + || tree instanceof VariableTree)) { + TreePath parentPath = path.getParentPath(); + if (parentPath == null) return Optional.empty(); + enclosingTree = parentPath.getLeaf(); + if (enclosingTree == null || enclosingTree == compUnitTree) return Optional.empty(); + } + + SourcePositions sourcePositions = trees.getSourcePositions(); + int start = (int) sourcePositions.getStartPosition(compUnitTree, enclosingTree); + int end = (int) sourcePositions.getEndPosition(compUnitTree, enclosingTree); + + if (start != Diagnostic.NOPOS && end != Diagnostic.NOPOS && end > start) { + LineMap lineMap = compUnitTree.getLineMap(); + Semanticdb.Range range = + Semanticdb.Range.newBuilder() + .setStartLine((int) lineMap.getLineNumber(start) - 1) + .setStartCharacter((int) lineMap.getColumnNumber(start) - 1) + .setEndLine((int) lineMap.getLineNumber(end) - 1) + .setEndCharacter((int) lineMap.getColumnNumber(end) - 1) + .build(); + range = correctForTabs(range, lineMap, start); + return Optional.of(range); + } + return Optional.empty(); + } + + private String sourceText() { + if (source != null) return source; + try { + source = compUnitTree.getSourceFile().getCharContent(true).toString(); + } catch (IOException e) { + source = ""; + } + return source; + } + + private List semanticdbParentSymbols(TypeElement typeElement) { + ArrayList parentSymbols = new ArrayList<>(); + Set parentElements = semanticdbParentTypeElements(typeElement, new HashSet<>()); + for (TypeElement parentElement : parentElements) { + String ssym = semanticdbSymbol(parentElement); + if (!Objects.equals(ssym, SemanticdbSymbols.NONE)) { + parentSymbols.add(ssym); + } + } + return parentSymbols; + } + + private Set semanticdbParentTypeElements( + TypeElement typeElement, Set result) { + TypeMirror superType = typeElement.getSuperclass(); + semanticdbParentSymbol(superType, result); + for (TypeMirror interfaceType : typeElement.getInterfaces()) { + semanticdbParentSymbol(interfaceType, result); + } + return result; + } + + private void semanticdbParentSymbol(TypeMirror elementType, Set result) { + if (!(elementType instanceof NoType)) { + Element superElement = types.asElement(elementType); + if (superElement instanceof TypeElement) { + result.add((TypeElement) superElement); + semanticdbParentTypeElements((TypeElement) superElement, result); + } + } + } + + private Set semanticdbOverrides( + ExecutableElement sym, Element enclosingElement, HashSet overriddenSymbols) { + if (enclosingElement instanceof TypeElement) { + List superTypes = types.directSupertypes(enclosingElement.asType()); + for (TypeMirror superType : superTypes) { + if (superType instanceof DeclaredType) { + Element superElement = ((DeclaredType) superType).asElement(); + if (superElement instanceof TypeElement) { + boolean methodFound = false; + List enclosedElements = + ((TypeElement) superElement).getEnclosedElements(); + for (Element enclosedElement : enclosedElements) { + if (enclosedElement instanceof ExecutableElement) { + ExecutableElement enclosedExecutableElement = (ExecutableElement) enclosedElement; + if (elements.overrides( + sym, enclosedExecutableElement, (TypeElement) sym.getEnclosingElement())) { + String symbol = semanticdbSymbol(enclosedExecutableElement); + overriddenSymbols.add(symbol); + methodFound = true; + semanticdbOverrides(enclosedExecutableElement, superElement, overriddenSymbols); + } + } + } + if (!methodFound) { + semanticdbOverrides(sym, superElement, overriddenSymbols); + } + } + } + } + } + return overriddenSymbols; + } + + private static String sourceRelativePath( + CompilationUnitTree compUnitTree, SemanticdbJavacOptions options) { + Path absolutePath = + SemanticdbTaskListener.absolutePathFromUri(options, compUnitTree.getSourceFile()); + Path uriPath = + absolutePath.startsWith(options.sourceroot) + ? options.sourceroot.relativize(absolutePath) + : absolutePath; + StringBuilder out = new StringBuilder(); + Iterator it = uriPath.iterator(); + if (it.hasNext()) out.append(it.next().getFileName().toString()); + while (it.hasNext()) { + Path part = it.next(); + out.append('/').append(part.getFileName().toString()); + } + return out.toString(); + } + + private String semanticdbDocumentation(Tree tree) { + try { + TreePath treePath = nodes.get(tree); + String doc = trees.getDocComment(treePath); + return doc; + } catch (NullPointerException e) { + return null; + } + } +} 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 09e475dfb..72cc75f4d 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 @@ -119,7 +119,7 @@ private void onFinishedAnalyze(TaskEvent e) { else writeSemanticdb(e, output, textDocument); if (options.emitScip) { - emitScipShard(e, output, textDocument); + emitScipShard(e, output); } } else { reporter.error(path.getErrorOrThrow(), e); @@ -128,14 +128,17 @@ private void onFinishedAnalyze(TaskEvent e) { } /** - * Mirrors {@link #writeSemanticdb}/{@link #appendSemanticdb} but for the {@code *.scip} shard - * layout under {@code META-INF/scip/}. Reuses the in-memory {@link Semanticdb.TextDocument} built - * by {@link SemanticdbVisitor} so we do not pay for a second AST walk. + * Drives {@link ScipVisitor} over the compilation unit to build a {@code *.scip} shard under the + * matching {@code META-INF/scip/} path. During the SemanticDB→SCIP transition this is a second + * AST walk; once the legacy {@code *.semanticdb} output is removed the SCIP walk will be the only + * one. */ - private void emitScipShard(TaskEvent event, Path semanticdbPath, Semanticdb.TextDocument doc) { + private void emitScipShard(TaskEvent event, Path semanticdbPath) { try { Path shardPath = scipShardPath(semanticdbPath); - com.sourcegraph.Scip.Index shard = ScipShardFromSemanticdb.buildShard(doc, doc.getUri()); + com.sourcegraph.Scip.Index shard = + new ScipVisitor(globals, event.getCompilationUnit(), options, types, trees, elements) + .buildShard(event.getCompilationUnit()); ScipShardWriter.writeOrMerge(shardPath, shard); } catch (IOException ex) { this.reportException(ex, event); From 7b5725af7902ca322a7048eda5d9c90614664bfe Mon Sep 17 00:00:00 2001 From: jupblb Date: Wed, 27 May 2026 13:56:32 +0200 Subject: [PATCH 03/21] PR1 (M4): Add in-plugin ScipSignatureFormatter for Java Milestone 4: emit SCIP signature_documentation directly from the compiler plugin, eliminating the need to format signatures from a SemanticDB intermediate representation. - ScipSignatureFormatter: walks javac Element/TypeMirror and produces a readable Java declaration string. Supports classes, interfaces, annotations, enums, methods, constructors, fields, parameters, locals, enum constants, and type parameters with bounds. The internal TypePrinter handles declared types, type arguments, arrays, primitives, type variables, wildcards, intersections, and void. Suppresses implicit 'extends Object' and 'java.lang.Object' supertypes. - ScipVisitor: when a definition is emitted, the formatter is invoked and (when the result is non-empty) the signature is attached to SymbolInformation.signature_documentation with language 'Java' and the current source's relative path. - ScipShardEmissionSuite: extended end-to-end checks. Verifies the shard contains at least one signature_documentation block, that the Foo class symbol's signature contains 'class Foo', and that the bar() method symbol's signature contains 'int bar('. All 29 unit tests pass. --- .../ScipSignatureFormatter.java | 288 ++++++++++++++++++ .../semanticdb_javac/ScipVisitor.java | 9 + .../scala/tests/ScipShardEmissionSuite.scala | 27 ++ 3 files changed, 324 insertions(+) create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSignatureFormatter.java diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSignatureFormatter.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSignatureFormatter.java new file mode 100644 index 000000000..91dd63892 --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSignatureFormatter.java @@ -0,0 +1,288 @@ +package com.sourcegraph.semanticdb_javac; + +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import javax.lang.model.element.AnnotationMirror; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.TypeParameterElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.IntersectionType; +import javax.lang.model.type.NoType; +import javax.lang.model.type.PrimitiveType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeVariable; +import javax.lang.model.type.WildcardType; +import javax.lang.model.util.SimpleTypeVisitor8; + +/** + * Formats a Java {@link Element} as a human-readable declaration string suitable for SCIP's {@code + * SymbolInformation.signature_documentation.text}. + * + *

This is a port of the Java-relevant parts of {@code SignatureFormatter} that runs directly + * over javac's {@link Element}/{@link TypeMirror} APIs, eliminating the need to round-trip through + * SemanticDB signatures. + */ +public final class ScipSignatureFormatter { + + private final Element sym; + + public ScipSignatureFormatter(Element sym) { + this.sym = sym; + } + + /** Returns the formatted signature, or {@code ""} if {@link #sym} has no meaningful signature. */ + public String formatSymbol() { + StringBuilder out = new StringBuilder(); + switch (sym.getKind()) { + case CLASS: + case INTERFACE: + case ANNOTATION_TYPE: + case ENUM: + formatType(out, (TypeElement) sym); + break; + case CONSTRUCTOR: + case METHOD: + formatExecutable(out, (ExecutableElement) sym); + break; + case FIELD: + case ENUM_CONSTANT: + case PARAMETER: + case LOCAL_VARIABLE: + case EXCEPTION_PARAMETER: + case RESOURCE_VARIABLE: + formatVariable(out, (VariableElement) sym); + break; + case TYPE_PARAMETER: + formatTypeParameter(out, (TypeParameterElement) sym); + break; + default: + return ""; + } + return out.toString(); + } + + private static void formatAnnotations(StringBuilder out, Element element) { + for (AnnotationMirror mirror : element.getAnnotationMirrors()) { + out.append('@').append(simpleName(mirror.getAnnotationType())).append('\n'); + } + } + + private static String simpleName(TypeMirror t) { + if (t instanceof DeclaredType) { + Element e = ((DeclaredType) t).asElement(); + return e.getSimpleName().toString(); + } + return t.toString(); + } + + private static void formatModifiers(StringBuilder out, Set modifiers) { + for (Modifier m : modifiers) { + out.append(m.toString()).append(' '); + } + } + + private void formatType(StringBuilder out, TypeElement type) { + formatAnnotations(out, type); + formatModifiers(out, type.getModifiers()); + switch (type.getKind()) { + case ENUM: + out.append("enum "); + break; + case INTERFACE: + out.append("interface "); + break; + case ANNOTATION_TYPE: + out.append("@interface "); + break; + case CLASS: + default: + out.append("class "); + break; + } + out.append(type.getSimpleName()); + formatTypeParameters(out, type.getTypeParameters()); + + TypeMirror superclass = type.getSuperclass(); + if (superclass.getKind() != TypeKind.NONE + && !isJavaLangObject(superclass) + && type.getKind() != ElementKind.INTERFACE) { + out.append(" extends "); + formatTypeMirror(out, superclass); + } + + List interfaces = type.getInterfaces(); + if (!interfaces.isEmpty()) { + out.append(type.getKind() == ElementKind.INTERFACE ? " extends " : " implements "); + formatJoin(out, interfaces, ", "); + } + } + + private void formatExecutable(StringBuilder out, ExecutableElement method) { + formatAnnotations(out, method); + formatModifiers(out, method.getModifiers()); + if (!method.getTypeParameters().isEmpty()) { + formatTypeParameters(out, method.getTypeParameters()); + out.append(' '); + } + if (method.getKind() != ElementKind.CONSTRUCTOR) { + formatTypeMirror(out, method.getReturnType()); + out.append(' '); + out.append(method.getSimpleName()); + } else { + // Constructor: name = enclosing class simple name + out.append(method.getEnclosingElement().getSimpleName()); + } + out.append('('); + Iterator it = method.getParameters().iterator(); + while (it.hasNext()) { + VariableElement p = it.next(); + formatTypeMirror(out, p.asType()); + out.append(' ').append(p.getSimpleName()); + if (it.hasNext()) out.append(", "); + } + out.append(')'); + List thrown = method.getThrownTypes(); + if (!thrown.isEmpty()) { + out.append(" throws "); + formatJoin(out, thrown, ", "); + } + } + + private void formatVariable(StringBuilder out, VariableElement variable) { + formatAnnotations(out, variable); + formatModifiers(out, variable.getModifiers()); + if (variable.getKind() == ElementKind.ENUM_CONSTANT) { + out.append(variable.getSimpleName()); + } else { + formatTypeMirror(out, variable.asType()); + out.append(' ').append(variable.getSimpleName()); + } + } + + private void formatTypeParameter(StringBuilder out, TypeParameterElement tp) { + out.append(tp.getSimpleName()); + List bounds = tp.getBounds(); + if (!bounds.isEmpty()) { + // Skip implicit `extends Object`. + if (bounds.size() != 1 || !isJavaLangObject(bounds.get(0))) { + out.append(" extends "); + formatJoin(out, bounds, " & "); + } + } + } + + private void formatTypeParameters( + StringBuilder out, List typeParameters) { + if (typeParameters.isEmpty()) return; + out.append('<'); + Iterator it = typeParameters.iterator(); + while (it.hasNext()) { + formatTypeParameter(out, it.next()); + if (it.hasNext()) out.append(", "); + } + out.append('>'); + } + + private void formatJoin(StringBuilder out, List types, String separator) { + Iterator it = types.iterator(); + while (it.hasNext()) { + formatTypeMirror(out, it.next()); + if (it.hasNext()) out.append(separator); + } + } + + private void formatTypeMirror(StringBuilder out, TypeMirror type) { + type.accept(new TypePrinter(), out); + } + + private static boolean isJavaLangObject(TypeMirror type) { + if (!(type instanceof DeclaredType)) return false; + Element e = ((DeclaredType) type).asElement(); + return e instanceof TypeElement + && ((TypeElement) e).getQualifiedName().contentEquals("java.lang.Object"); + } + + /** Prints a TypeMirror using simple-names + type arguments + array brackets. */ + private static final class TypePrinter extends SimpleTypeVisitor8 { + + @Override + public Void visitDeclared(DeclaredType t, StringBuilder out) { + out.append(simpleName(t)); + List args = t.getTypeArguments(); + if (!args.isEmpty()) { + out.append('<'); + Iterator it = args.iterator(); + while (it.hasNext()) { + visit(it.next(), out); + if (it.hasNext()) out.append(", "); + } + out.append('>'); + } + return null; + } + + @Override + public Void visitArray(ArrayType t, StringBuilder out) { + visit(t.getComponentType(), out); + out.append("[]"); + return null; + } + + @Override + public Void visitPrimitive(PrimitiveType t, StringBuilder out) { + out.append(t.getKind().name().toLowerCase()); + return null; + } + + @Override + public Void visitTypeVariable(TypeVariable t, StringBuilder out) { + out.append(t.asElement().getSimpleName()); + return null; + } + + @Override + public Void visitWildcard(WildcardType t, StringBuilder out) { + out.append('?'); + if (t.getExtendsBound() != null) { + out.append(" extends "); + visit(t.getExtendsBound(), out); + } else if (t.getSuperBound() != null) { + out.append(" super "); + visit(t.getSuperBound(), out); + } + return null; + } + + @Override + public Void visitIntersection(IntersectionType t, StringBuilder out) { + Iterator it = t.getBounds().iterator(); + while (it.hasNext()) { + visit(it.next(), out); + if (it.hasNext()) out.append(" & "); + } + return null; + } + + @Override + public Void visitNoType(NoType t, StringBuilder out) { + if (t.getKind() == TypeKind.VOID) { + out.append("void"); + } + return null; + } + + @Override + protected Void defaultAction(TypeMirror t, StringBuilder out) { + out.append(t.toString()); + return null; + } + } +} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java index 9f880bc03..2b6016c8a 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java @@ -170,6 +170,15 @@ private void emitSymbolInformation(Element sym, Tree tree) { builder.addDocumentation(documentation); } + String signature = new ScipSignatureFormatter(sym).formatSymbol(); + if (!signature.isEmpty()) { + builder.setSignatureDocumentation( + Scip.Document.newBuilder() + .setLanguage(Scip.Language.Java.name()) + .setRelativePath(relativePath) + .setText(signature)); + } + boolean supportsReferenceRel = supportsReferenceRelationship(sym); switch (sym.getKind()) { diff --git a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala index 19639c8b7..3dbb20482 100644 --- a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala +++ b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala @@ -74,6 +74,33 @@ class ScipShardEmissionSuite extends FunSuite { s.startsWith(ScipSymbols.PLACEHOLDER_PREFIX) || s.startsWith("local ") assert(ok, s"unexpected occurrence symbol: $s") } + + // At least one definition should carry a Java signature_documentation block. + val withSignatures = symbols.filter { info => + info.hasSignatureDocumentation && + info.getSignatureDocumentation.getLanguage == "Java" && + info.getSignatureDocumentation.getText.nonEmpty + } + assert( + withSignatures.nonEmpty, + s"expected signature docs; got: ${symbols.mkString("\n")}" + ) + + val fooClass = symbols.find { info => + info.getKind == Scip.SymbolInformation.Kind.Class && + info.getDisplayName == "Foo" + } + assert(fooClass.isDefined, "expected Foo class symbol") + val text = fooClass.get.getSignatureDocumentation.getText + assert(text.contains("class Foo"), s"unexpected signature: $text") + + val barMethod = symbols.find { info => + info.getKind == Scip.SymbolInformation.Kind.Method && + info.getDisplayName == "bar" + } + assert(barMethod.isDefined, "expected bar method symbol") + val barText = barMethod.get.getSignatureDocumentation.getText + assert(barText.contains("int bar("), s"unexpected bar signature: $barText") } test("compiler does not emit SCIP shards when -emit-scip is off") { From e32667c93f7858f612d8fd61bfe600ac525ea8ef Mon Sep 17 00:00:00 2001 From: jupblb Date: Wed, 27 May 2026 13:59:38 +0200 Subject: [PATCH 04/21] PR1 (M5): Add ScipShardAggregator for .scip shards Milestone 5: parallel aggregator that walks *.scip shards produced by ScipVisitor and emits a final scip-java-scheme index.scip. The existing SemanticDB-based ScipSemanticdb.run() is untouched. - ScipShardAggregator: * walks for *.scip shards (and *.jar files containing them) via ScipShardWalker * parses each shard into a Scip.Index * rewrites placeholder global symbols ('. . . . ' prefix) into the final 'scip-java maven g a v ...' form via SymbolRewriter * deduplicates documents by relative_path, merging occurrences and symbol-info entries from annotation-processor rounds * computes inverse 'is_implementation && is_reference' relationships across the whole project, gated on options.emitInverseRelationships * emits one Metadata Index plus one Index per merged Document via ScipWriter - ScipAggregationSuite: end-to-end test that compiles a Java source with -emit-scip:on, runs ScipShardAggregator over the produced shards, and asserts the final index has metadata with the scip-java tool name and that every emitted symbol/occurrence is either local or starts with 'scip-java maven '. All 30 unit tests pass. --- .../scip_semanticdb/ScipShardAggregator.java | 262 ++++++++++++++++++ .../scala/tests/ScipAggregationSuite.scala | 103 +++++++ 2 files changed, 365 insertions(+) create mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java create mode 100644 tests/unit/src/test/scala/tests/ScipAggregationSuite.scala diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java new file mode 100644 index 000000000..9f443aecf --- /dev/null +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java @@ -0,0 +1,262 @@ +package com.sourcegraph.scip_semanticdb; + +import com.google.protobuf.CodedInputStream; +import com.sourcegraph.Scip; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.FileSystems; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.PathMatcher; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Aggregates per-source {@code *.scip} shards into a single {@link Scip.Index}. + * + *

Steps: + * + *

    + *
  1. Walk all targetroots for {@code *.scip} shards (and {@code *.jar} files containing them). + *
  2. Parse each shard into a {@link Scip.Index} containing exactly one {@link Scip.Document}. + *
  3. Rewrite placeholder global symbols ({@code ". . . . "} prefix) into the final {@code + * "scip-java maven g a v ..."} form via {@link SymbolRewriter}. + *
  4. Deduplicate documents by {@code relative_path}, merging occurrences/symbols. + *
  5. Compute inverse {@code is_implementation+is_reference} relationships across the project. + *
  6. Emit the metadata block and all documents through {@link ScipWriter}. + *
+ */ +public final class ScipShardAggregator { + + private final ScipWriter writer; + private final ScipSemanticdbOptions options; + private final SymbolRewriter rewriter; + + public ScipShardAggregator( + ScipWriter writer, ScipSemanticdbOptions options, SymbolRewriter rewriter) { + this.writer = writer; + this.options = options; + this.rewriter = rewriter; + } + + public static void run(ScipSemanticdbOptions options) throws IOException { + try (ScipWriter writer = new ScipWriter(options)) { + PackageTable packages = new PackageTable(options); + SymbolRewriter rewriter = new SymbolRewriter(packages); + new ScipShardAggregator(writer, options, rewriter).run(); + writer.build(); + } + } + + private void run() throws IOException { + List shards = ScipShardWalker.findScipShards(options); + Collections.sort(shards); + if (options.reporter.hasErrors()) return; + if (shards.isEmpty() && !options.allowEmptyIndex) { + options.reporter.error( + "No SCIP shard files found. " + + "This typically means that `scip-java` is unable to automatically " + + "index this codebase. If you are using Gradle or Maven, please report an issue to " + + "https://github.com/sourcegraph/scip-java and include steps to reproduce. " + + "If you are using a different build tool, make sure that you have followed all " + + "of the steps from https://sourcegraph.github.io/scip-java/docs/manual-configuration.html"); + return; + } + options.reporter.startProcessing(shards.size()); + writer.emitTyped(metadata()); + + // Deduplicate documents by relative_path. We rewrite symbols as we go so all merging happens + // on final-form strings. + LinkedHashMap merged = new LinkedHashMap<>(); + InverseReferenceRelationships inverse = new InverseReferenceRelationships(); + + for (Path shard : shards) { + try { + for (Scip.Index shardIndex : parseShard(shard)) { + for (Scip.Document doc : shardIndex.getDocumentsList()) { + Scip.Document rewritten = rewriteDocument(doc); + inverse.observe(rewritten); + Scip.Document.Builder existing = merged.get(rewritten.getRelativePath()); + if (existing == null) { + merged.put(rewritten.getRelativePath(), rewritten.toBuilder()); + } else { + mergeInto(existing, rewritten); + } + } + } + } catch (IOException e) { + options.reporter.error("invalid SCIP shard: " + shard); + options.reporter.error(e); + } + options.reporter.processedOneItem(); + } + + for (Scip.Document.Builder doc : merged.values()) { + Scip.Document withInverse = inverse.applyTo(doc.build()); + writer.emitTyped(Scip.Index.newBuilder().addDocuments(withInverse).build()); + } + + options.reporter.endProcessing(); + } + + // --- shard parsing ------------------------------------------------------- + + private static final PathMatcher JAR_PATTERN = + FileSystems.getDefault().getPathMatcher("glob:**.jar"); + + private List parseShard(Path shardPath) throws IOException { + if (JAR_PATTERN.matches(shardPath)) { + List out = new ArrayList<>(); + try (JarFile jar = new JarFile(shardPath.toFile())) { + Enumeration entries = jar.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + if (entry.getName().endsWith(".scip")) { + try (InputStream is = jar.getInputStream(entry)) { + byte[] bytes = InputStreamBytes.readAll(is); + out.add(parseBytes(bytes)); + } + } + } + } + return out; + } + return Collections.singletonList(parseBytes(Files.readAllBytes(shardPath))); + } + + private static Scip.Index parseBytes(byte[] bytes) throws IOException { + CodedInputStream in = CodedInputStream.newInstance(bytes); + in.setRecursionLimit(1000); + return Scip.Index.parseFrom(in); + } + + // --- rewriting ----------------------------------------------------------- + + private Scip.Document rewriteDocument(Scip.Document doc) { + Scip.Document.Builder builder = doc.toBuilder().clearOccurrences().clearSymbols(); + for (Scip.Occurrence occ : doc.getOccurrencesList()) { + builder.addOccurrences(occ.toBuilder().setSymbol(rewriter.rewrite(occ.getSymbol())).build()); + } + for (Scip.SymbolInformation info : doc.getSymbolsList()) { + builder.addSymbols(rewriteSymbol(info)); + } + return builder.build(); + } + + private Scip.SymbolInformation rewriteSymbol(Scip.SymbolInformation info) { + Scip.SymbolInformation.Builder builder = info.toBuilder(); + builder.setSymbol(rewriter.rewrite(info.getSymbol())); + if (!info.getEnclosingSymbol().isEmpty()) { + builder.setEnclosingSymbol(rewriter.rewrite(info.getEnclosingSymbol())); + } + builder.clearRelationships(); + for (Scip.Relationship rel : info.getRelationshipsList()) { + builder.addRelationships( + rel.toBuilder().setSymbol(rewriter.rewrite(rel.getSymbol())).build()); + } + return builder.build(); + } + + private void mergeInto(Scip.Document.Builder target, Scip.Document fresh) { + target.addAllOccurrences(fresh.getOccurrencesList()); + target.addAllSymbols(fresh.getSymbolsList()); + } + + // --- metadata ------------------------------------------------------------ + + private Scip.Index metadata() { + return Scip.Index.newBuilder() + .setMetadata( + Scip.Metadata.newBuilder() + .setVersion(Scip.ProtocolVersion.UnspecifiedProtocolVersion) + .setProjectRoot(options.sourceroot.toUri().toString()) + .setTextDocumentEncoding(Scip.TextEncoding.UTF8) + .setToolInfo( + Scip.ToolInfo.newBuilder() + .setName(options.toolInfo.getName()) + .setVersion(options.toolInfo.getVersion()) + .addAllArguments(options.toolInfo.getArgumentsList()))) + .build(); + } + + // --- inverse relationships ---------------------------------------------- + + /** + * Collects symbols that override or implement other symbols, indexed by the overridden symbol. + * When a final document is emitted, the per-symbol entries are augmented with {@code + * is_implementation && is_reference} relationships pointing back to overriders. + */ + private final class InverseReferenceRelationships { + + private final Map> map = new LinkedHashMap<>(); + private final boolean enabled = options.emitInverseRelationships; + + void observe(Scip.Document doc) { + if (!enabled) return; + for (Scip.SymbolInformation info : doc.getSymbolsList()) { + if (info.getSymbol().isEmpty() || SymbolRewriter.isLocal(info.getSymbol())) continue; + if (!supportsReferenceRelationship(info)) continue; + for (Scip.Relationship rel : info.getRelationshipsList()) { + if (!rel.getIsImplementation()) continue; + if (rel.getSymbol().isEmpty() || SymbolRewriter.isLocal(rel.getSymbol())) continue; + map.computeIfAbsent(rel.getSymbol(), k -> new ArrayList<>()).add(info.getSymbol()); + } + } + } + + Scip.Document applyTo(Scip.Document doc) { + if (!enabled || map.isEmpty()) return doc; + Scip.Document.Builder builder = doc.toBuilder().clearSymbols(); + for (Scip.SymbolInformation info : doc.getSymbolsList()) { + List overriders = map.get(info.getSymbol()); + if (overriders == null || overriders.isEmpty()) { + builder.addSymbols(info); + continue; + } + Scip.SymbolInformation.Builder s = info.toBuilder(); + for (String overrider : overriders) { + s.addRelationships( + Scip.Relationship.newBuilder() + .setSymbol(overrider) + .setIsImplementation(true) + .setIsReference(true)); + } + builder.addSymbols(s.build()); + } + return builder.build(); + } + } + + private static boolean supportsReferenceRelationship(Scip.SymbolInformation info) { + switch (info.getKind()) { + case Interface: + case Type: + case Class: + case Object: + case PackageObject: + return false; + default: + return true; + } + } + + // Make the existing flatten-style call available for callers that already have shards in memory. + @SuppressWarnings("unused") + Stream documentsFromShards(List shards) { + return shards.stream().flatMap(s -> s.getDocumentsList().stream()).map(this::rewriteDocument); + } + + @SuppressWarnings("unused") + Stream documentsFromShardsCollected(List shards) { + return documentsFromShards(shards).collect(Collectors.toList()).stream(); + } +} diff --git a/tests/unit/src/test/scala/tests/ScipAggregationSuite.scala b/tests/unit/src/test/scala/tests/ScipAggregationSuite.scala new file mode 100644 index 000000000..d6281a9c8 --- /dev/null +++ b/tests/unit/src/test/scala/tests/ScipAggregationSuite.scala @@ -0,0 +1,103 @@ +package tests + +import java.nio.file.Files +import java.util.Collections + +import scala.jdk.CollectionConverters._ +import scala.meta.Input + +import com.sourcegraph.Scip +import com.sourcegraph.scip_semanticdb.{ + ScipOutputFormat, + ScipSemanticdbOptions, + ScipSemanticdbReporter, + ScipShardAggregator +} +import munit.FunSuite + +// End-to-end test for the SCIP shard aggregation pipeline: compile Java with +// -emit-scip:on, run ScipShardAggregator over the produced META-INF/scip +// shards, and assert the final index.scip is well-formed and uses the +// scip-java symbol scheme. +class ScipAggregationSuite extends FunSuite { + + private val source = + Input.VirtualFile( + "example/Foo.java", + """package example; + | + |public class Foo { + | public int bar() { return 1; } + |} + |""".stripMargin + ) + + test("aggregator produces a scip-java index from compiler shards") { + val targetroot = Files.createTempDirectory("scip-agg-target-") + val sourceroot = Files.createTempDirectory("scip-agg-source-") + val compiler = + new TestCompiler(TestCompiler.PROCESSOR_PATH, Nil, targetroot, sourceroot) + val result = + compiler.compile( + Seq(source), + Seq( + s"-Xplugin:semanticdb -emit-scip:on -text:on -sourceroot:$sourceroot -targetroot:$targetroot" + ) + ) + assert(result.isSuccess, s"javac failed:\n${result.stdout}") + + val output = Files.createTempFile("scip-agg-out-", ".scip") + val options = new ScipSemanticdbOptions( + Collections.singletonList(targetroot), + output, + sourceroot, + new ScipSemanticdbReporter() {}, + Scip + .ToolInfo + .newBuilder() + .setName("scip-java") + .setVersion("test") + .build(), + ScipOutputFormat.TYPED_PROTOBUF, + false, + Collections.emptyList(), + true, + false, + false + ) + + ScipShardAggregator.run(options) + + // SCIP's stream format concatenates multiple Index messages. Protobuf merges concatenated + // messages of the same type when parsed as a single message: singular fields take the last + // value and repeated fields are concatenated, so this gives us the full aggregated view. + val bytes = Files.readAllBytes(output) + val index = Scip.Index.parseFrom(bytes) + + // Metadata is present. + assert(index.hasMetadata, s"expected metadata in index: $index") + assertEquals(index.getMetadata.getToolInfo.getName, "scip-java") + + val docs = index.getDocumentsList.asScala + assert(docs.nonEmpty, "expected at least one document in aggregated index") + val doc = docs.find(_.getRelativePath == "example/Foo.java").get + + // Every symbol/occurrence must be in final form: either local or scip-java. + doc + .getSymbolsList + .asScala + .foreach { info => + val s = info.getSymbol + val ok = s.startsWith("scip-java maven ") || s.startsWith("local ") + assert(ok, s"symbol not in final form: $s") + } + doc + .getOccurrencesList + .asScala + .foreach { occ => + val s = occ.getSymbol + val ok = s.startsWith("scip-java maven ") || s.startsWith("local ") + assert(ok, s"occurrence not in final form: $s") + } + } +} From 7a3faa766f0df96af5ad8da32bffb419c87f1b57 Mon Sep 17 00:00:00 2001 From: jupblb Date: Wed, 27 May 2026 14:03:37 +0200 Subject: [PATCH 05/21] PR1 (M6): Opt-in --use-scip-shards flag wires CLI + build tools Milestone 6: surface the direct-SCIP path through the existing index-semanticdb command and through the Maven / ScipBuildTool paths so end-to-end indexing can use ScipShardAggregator. Default behaviour is unchanged. - IndexSemanticdbCommand: new --use-scip-shards flag. When set, the command runs ScipShardAggregator (walking META-INF/scip/*.scip) instead of ScipSemanticdb (walking META-INF/semanticdb/*.semanticdb). - SemanticdbOptionBuilder: reads -Dsemanticdb.emit-scip and appends '-emit-scip:on' to the injected -Xplugin:semanticdb argument so the custom javac wrapper emits SCIP shards. - Embedded.customJavac: new optional emitScip parameter; when true, propagates -Dsemanticdb.emit-scip=true into the launched javac wrapper. - MavenBuildTool: forwards index.indexSemanticdb.useScipShards to the customJavac wrapper. - ScipBuildTool: when useScipShards is on, appends '-emit-scip:on' to the directly-constructed -Xplugin:semanticdb arguments used by the in-process javac compilation. Not yet wired (deferred): - SemanticdbGradlePlugin propagation - BazelBuildTool / scip_java.bzl - Kotlin guard for projects that mix Java+Kotlin sources All 30 unit tests pass. --- .../scala/com/sourcegraph/scip_java/Embedded.scala | 10 ++++++++-- .../scip_java/buildtools/MavenBuildTool.scala | 3 ++- .../scip_java/buildtools/ScipBuildTool.scala | 7 ++++++- .../scip_java/commands/IndexSemanticdbCommand.scala | 13 ++++++++++++- .../semanticdb_javac/SemanticdbOptionBuilder.java | 6 +++++- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala index 2be327dad..4b3169781 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala @@ -34,7 +34,8 @@ object Embedded { sourceroot: Path, targetroot: Path, tmp: Path, - javaAtLeast17: Boolean + javaAtLeast17: Boolean, + emitScip: Boolean = false ): Path = { val bin = tmp.resolve("bin") val javac = bin.resolve("javac") @@ -56,6 +57,11 @@ object Embedded { BuildInfo.javacModuleOptions.mkString(" ") else "" + val emitScipProp = + if (emitScip) + s"-Dsemanticdb.emit-scip=true " + else + "" val injectSemanticdbArguments = List[String]( "java", s"-Dsemanticdb.errorpath=$errorpath", @@ -64,7 +70,7 @@ object Embedded { s"-Dsemanticdb.targetroot=$targetroot", s"-Dsemanticdb.output=$$NEW_JAVAC_OPTS", s"-Dsemanticdb.old-output=$javacopts", - s"-classpath $pluginpath", + s"${emitScipProp}-classpath $pluginpath", "com.sourcegraph.semanticdb_javac.InjectSemanticdbOptions", """"$@"""" ).mkString(" ") diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala index a0b4f8631..1086d68a3 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala @@ -44,7 +44,8 @@ class MavenBuildTool(index: IndexCommand) extends BuildTool("Maven", index) { index.workingDirectory, index.finalTargetroot(defaultTargetroot), tmp, - GradleJavaToolchains.isJavaAtLeast(SystemJavaVersion.detect(), "11") + GradleJavaToolchains.isJavaAtLeast(SystemJavaVersion.detect(), "11"), + emitScip = index.indexSemanticdb.useScipShards ) buildCommand ++= List( diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala index 7656a8dd0..c00d320e0 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala @@ -342,8 +342,13 @@ class ScipBuildTool(index: IndexCommand) extends BuildTool("SCIP", index) { arguments += "-classpath" arguments += actualClasspath.mkString(File.pathSeparator) } + val emitScipFlag = + if (index.indexSemanticdb.useScipShards) + " -emit-scip:on" + else + "" arguments += - s"-Xplugin:semanticdb -targetroot:$targetroot -sourceroot:$sourceroot" + s"-Xplugin:semanticdb -targetroot:$targetroot -sourceroot:$sourceroot$emitScipFlag" if (config.processorpath.nonEmpty) { arguments += "-processorpath" val processorpath = diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala index 194c1a85c..a8c9cf6cd 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala @@ -14,6 +14,7 @@ import com.sourcegraph.scip_semanticdb.ConsoleScipSemanticdbReporter import com.sourcegraph.scip_semanticdb.ScipOutputFormat import com.sourcegraph.scip_semanticdb.ScipSemanticdb import com.sourcegraph.scip_semanticdb.ScipSemanticdbOptions +import com.sourcegraph.scip_semanticdb.ScipShardAggregator import moped.annotations._ import moped.cli.Application import moped.cli.Command @@ -60,6 +61,13 @@ final case class IndexSemanticdbCommand( "Maven->Maven or Gradle->Gradle projects because those build tools compile sources to classfiles inside directories." ) allowExportingGlobalSymbolsFromDirectoryEntries: Boolean = true, + @Description( + "If true, walk targetroots for *.scip shards (META-INF/scip/...) produced by the " + + "compiler plugin's -emit-scip:on flag instead of *.semanticdb files. The aggregator " + + "rewrites placeholder symbols into the final 'scip-java' scheme and merges per-source " + + "shards into the output index." + ) + useScipShards: Boolean = false, @Inline() app: Application = Application.default ) extends Command { @@ -108,7 +116,10 @@ final case class IndexSemanticdbCommand( allowEmptyIndex, allowExportingGlobalSymbolsFromDirectoryEntries ) - ScipSemanticdb.run(options) + if (useScipShards) + ScipShardAggregator.run(options) + else + ScipSemanticdb.run(options) postPackages(packages) if (!app.reporter.hasErrors()) { app.info(options.output.toString) diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbOptionBuilder.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbOptionBuilder.java index 9a2b15988..0f2e43e24 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbOptionBuilder.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbOptionBuilder.java @@ -23,6 +23,8 @@ public class SemanticdbOptionBuilder { private static final String TARGETROOT = System.getProperty("semanticdb.targetroot", ""); private static final String OUTPUT = System.getProperty("semanticdb.output", ""); private static final String OLD_OUTPUT = System.getProperty("semanticdb.old-output", ""); + private static final boolean EMIT_SCIP = + Boolean.parseBoolean(System.getProperty("semanticdb.emit-scip", "false")); public void processArgument(String arg) { oldArgs.add(arg); @@ -62,8 +64,10 @@ private String wrapQuote(String arg) { } private String xpluginOption() { + String emitScip = EMIT_SCIP ? " -emit-scip:on" : ""; return String.format( - "\"-Xplugin:semanticdb -sourceroot:%s -targetroot:%s\"", SOURCEROOT, TARGETROOT); + "\"-Xplugin:semanticdb -sourceroot:%s -targetroot:%s%s\"", + SOURCEROOT, TARGETROOT, emitScip); } public ArrayList finalResult() { From e8d4473f31a9808893a3115a23014a18c94bd7b6 Mon Sep 17 00:00:00 2001 From: jupblb Date: Wed, 27 May 2026 15:05:20 +0200 Subject: [PATCH 06/21] PR1 (M7): Stabilize ScipVisitor output and regenerate minimized snapshots Drives the minimized snapshot suite through the new SCIP-direct path (via --use-scip-shards) and reconciles the resulting output so it can be locked in as the canonical scheme. semanticdb-javac: - ScipVisitor: lowercase Document.language to 'java' (matching the historical ScipSemanticdb output) and add (range, symbol, roles) dedup of occurrences, preferring the variant that carries an enclosing_range. Multiple ANALYZE rounds otherwise emit a second definition occurrence without enclosing_range that survived the structural-equality dedup in ScipShardWriter. - ScipVisitor: treat ENUM the same as CLASS/INTERFACE/ANNOTATION_TYPE in supportsReferenceRelationship so parent relationships don't get a spurious is_reference flag. - ScipShardWriter: switch occurrence merge to the looser (range, symbol, roles) key, preferring entries with enclosing_range. - SemanticdbTaskListener: delete the stale .scip shard alongside the .semanticdb file on ENTER so re-runs don't accumulate occurrences across builds. scip-semanticdb: - ScipShardAggregator: mergeInto now uses the same (range, symbol, roles) dedup with enclosing_range preference, and merges duplicate symbol relationships across shards. build.sbt: - Add -emit-scip:on to the minimized javac plugin invocation so the tests/minimized targetroot always contains shard files. tests/snapshots: - MinimizedSnapshotScipGenerator now passes --use-scip-shards to drive the snapshot suite through ScipShardAggregator. - Regenerate all 23 minimized snapshots under the new 'scip-java' symbol scheme. tests/unit: - ScipShardEmissionSuite: update assertions to expect the lowercase 'java' language string. Full snapshot suite passes (102 tests). Unit suite passes (30 tests). --- build.sbt | 1 + .../scip_semanticdb/ScipShardAggregator.java | 71 ++- .../semanticdb_javac/ScipShardWriter.java | 51 ++- .../semanticdb_javac/ScipVisitor.java | 65 ++- .../SemanticdbTaskListener.java | 5 +- .../main/java/minimized/AbstractClasses.java | 26 +- .../java/minimized/AnnotationParameters.java | 154 +++---- .../src/main/java/minimized/Annotations.java | 92 ++-- .../AnnotationsOnParameterizedTypes.java | 288 +++++++----- .../main/java/minimized/AnonymousClasses.java | 54 +-- .../src/main/java/minimized/Arrays.java | 28 +- .../src/main/java/minimized/ClassOf.java | 22 +- .../src/main/java/minimized/Docstrings.java | 47 +- .../src/main/java/minimized/Enums.java | 136 +++--- .../src/main/java/minimized/Fields.java | 130 +++--- .../java/minimized/ForComprehensions.java | 43 +- .../src/main/java/minimized/InnerClasses.java | 419 +++++++++--------- .../src/main/java/minimized/Interfaces.java | 72 +-- .../main/java/minimized/LombokBuilder.java | 148 +++---- .../src/main/java/minimized/Methods.java | 98 ++-- .../java/minimized/MinimizedJavaMain.java | 95 ++-- .../java/minimized/ParameterizedTypes.java | 149 ++++--- .../src/main/java/minimized/Primitives.java | 66 +-- .../src/main/java/minimized/RawTypes.java | 36 +- .../src/main/java/minimized/SubClasses.java | 64 +-- .../src/main/java/minimized/TabIndented.java | 41 +- .../main/java/minimized/TypeAnnotations.java | 70 +-- .../main/java/minimized/TypeVariables.java | 105 ++--- .../MinimizedSnapshotScipGenerator.scala | 1 + .../scala/tests/ScipShardEmissionSuite.scala | 4 +- 30 files changed, 1404 insertions(+), 1177 deletions(-) diff --git a/build.sbt b/build.sbt index b754d3b93..459760f1c 100644 --- a/build.sbt +++ b/build.sbt @@ -565,6 +565,7 @@ lazy val minimizedSettings = List[Def.Setting[_]]( s"-build-tool:sbt", s"-text:on", s"-verbose", + s"-emit-scip:on", s"-sourceroot:${(ThisBuild / baseDirectory).value}", s"-targetroot:${(Compile / semanticdbTargetRoot).value}", s"-randomtimestamp=${System.nanoTime()}" diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java index 9f443aecf..6f77a1028 100644 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java @@ -167,8 +167,75 @@ private Scip.SymbolInformation rewriteSymbol(Scip.SymbolInformation info) { } private void mergeInto(Scip.Document.Builder target, Scip.Document fresh) { - target.addAllOccurrences(fresh.getOccurrencesList()); - target.addAllSymbols(fresh.getSymbolsList()); + // Deduplicate occurrences by (range, symbol, roles) so that shards produced by repeated + // compilation rounds (or by multiple targetroots) don't introduce duplicate entries. + // Variants that differ only by enclosing_range are collapsed, preferring the one that has it. + LinkedHashMap occurrences = new LinkedHashMap<>(); + for (Scip.Occurrence occ : target.getOccurrencesList()) putOccurrence(occurrences, occ); + for (Scip.Occurrence occ : fresh.getOccurrencesList()) putOccurrence(occurrences, occ); + target.clearOccurrences().addAllOccurrences(occurrences.values()); + + // Deduplicate symbols by symbol string; merge relationships of duplicates. + LinkedHashMap bySymbol = new LinkedHashMap<>(); + for (Scip.SymbolInformation info : target.getSymbolsList()) { + bySymbol.put(info.getSymbol(), info); + } + for (Scip.SymbolInformation info : fresh.getSymbolsList()) { + Scip.SymbolInformation existing = bySymbol.get(info.getSymbol()); + bySymbol.put(info.getSymbol(), existing == null ? info : mergeSymbol(existing, info)); + } + target.clearSymbols().addAllSymbols(bySymbol.values()); + } + + private static void putOccurrence( + LinkedHashMap out, Scip.Occurrence occ) { + OccurrenceKey key = OccurrenceKey.of(occ); + Scip.Occurrence existing = out.get(key); + if (existing == null) { + out.put(key, occ); + return; + } + if (existing.getEnclosingRangeCount() == 0 && occ.getEnclosingRangeCount() > 0) { + out.put(key, occ); + } + } + + private static final class OccurrenceKey { + final String symbol; + final java.util.List range; + final int roles; + + OccurrenceKey(String symbol, java.util.List range, int roles) { + this.symbol = symbol; + this.range = range; + this.roles = roles; + } + + static OccurrenceKey of(Scip.Occurrence occ) { + return new OccurrenceKey(occ.getSymbol(), occ.getRangeList(), occ.getSymbolRoles()); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof OccurrenceKey)) return false; + OccurrenceKey other = (OccurrenceKey) o; + return roles == other.roles && symbol.equals(other.symbol) && range.equals(other.range); + } + + @Override + public int hashCode() { + return java.util.Objects.hash(symbol, range, roles); + } + } + + private static Scip.SymbolInformation mergeSymbol( + Scip.SymbolInformation a, Scip.SymbolInformation b) { + Scip.SymbolInformation.Builder builder = b.toBuilder(); + LinkedHashMap rels = new LinkedHashMap<>(); + for (Scip.Relationship r : a.getRelationshipsList()) rels.put(r, r); + for (Scip.Relationship r : b.getRelationshipsList()) rels.put(r, r); + builder.clearRelationships().addAllRelationships(rels.values()); + return builder.build(); } // --- metadata ------------------------------------------------------------ diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java index f3e19f417..b5efee165 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java @@ -11,6 +11,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; /** * Writes and merges per-source SCIP shards produced by the compiler plugin. @@ -80,10 +81,11 @@ private static Scip.Document mergeDocuments(Scip.Document a, Scip.Document b) { // Use the most recent metadata for language/relative_path/text/encoding which already // come from b via toBuilder(). - // Deduplicate occurrences by structural equality. - LinkedHashMap occurrences = new LinkedHashMap<>(); - for (Scip.Occurrence occ : a.getOccurrencesList()) occurrences.put(occ, occ); - for (Scip.Occurrence occ : b.getOccurrencesList()) occurrences.put(occ, occ); + // Deduplicate occurrences by (range, symbol, roles). Variants that differ only in + // enclosing_range get collapsed, preferring the one that carries the enclosing range. + LinkedHashMap occurrences = new LinkedHashMap<>(); + for (Scip.Occurrence occ : a.getOccurrencesList()) putOccurrence(occurrences, occ); + for (Scip.Occurrence occ : b.getOccurrencesList()) putOccurrence(occurrences, occ); builder.addAllOccurrences(occurrences.values()); // Deduplicate symbols by symbol string; merge relationships and documentation. @@ -116,4 +118,45 @@ private static Scip.SymbolInformation mergeSymbol( return builder.build(); } + + private static void putOccurrence( + LinkedHashMap out, Scip.Occurrence occ) { + OccurrenceKey key = OccurrenceKey.of(occ); + Scip.Occurrence existing = out.get(key); + if (existing == null) { + out.put(key, occ); + return; + } + if (existing.getEnclosingRangeCount() == 0 && occ.getEnclosingRangeCount() > 0) { + out.put(key, occ); + } + } + + private static final class OccurrenceKey { + final String symbol; + final List range; + final int roles; + + OccurrenceKey(String symbol, List range, int roles) { + this.symbol = symbol; + this.range = range; + this.roles = roles; + } + + static OccurrenceKey of(Scip.Occurrence occ) { + return new OccurrenceKey(occ.getSymbol(), occ.getRangeList(), occ.getSymbolRoles()); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof OccurrenceKey)) return false; + OccurrenceKey other = (OccurrenceKey) o; + return roles == other.roles && symbol.equals(other.symbol) && range.equals(other.range); + } + + @Override + public int hashCode() { + return Objects.hash(symbol, range, roles); + } + } } diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java index 2b6016c8a..4d7048208 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java @@ -103,16 +103,74 @@ public Scip.Index buildShard(CompilationUnitTree tree) { Scip.Document.Builder document = Scip.Document.newBuilder() .setRelativePath(relativePath) - .setLanguage(Scip.Language.Java.name()); + .setLanguage(LANGUAGE_JAVA); if (options.includeText) { document.setText(source); } - document.addAllOccurrences(occurrences); + document.addAllOccurrences(dedupOccurrences(occurrences)); document.addAllSymbols(symbols.values()); return Scip.Index.newBuilder().addDocuments(document).build(); } + /** + * SCIP `Document.language` value. Lowercased to match the canonical scheme used by other + * tooling (see {@link com.sourcegraph.scip_semanticdb.ScipSemanticdb}). + */ + static final String LANGUAGE_JAVA = "java"; + + /** + * Some AST patterns (in particular top-level class definitions touched by both the regular + * declaration walk and downstream resolvers) can produce two occurrences with the same {@code + * (symbol, range, roles)} that differ only by whether {@code enclosing_range} is set. The SCIP + * writer treats those as distinct by structural equality, so we collapse them here, preferring + * the variant that carries an {@code enclosing_range}. + */ + private static List dedupOccurrences(List occurrences) { + LinkedHashMap out = new LinkedHashMap<>(); + for (Scip.Occurrence occ : occurrences) { + OccurrenceKey key = OccurrenceKey.of(occ); + Scip.Occurrence existing = out.get(key); + if (existing == null) { + out.put(key, occ); + continue; + } + // Prefer the variant with a populated enclosing_range. + if (existing.getEnclosingRangeCount() == 0 && occ.getEnclosingRangeCount() > 0) { + out.put(key, occ); + } + } + return new ArrayList<>(out.values()); + } + + private static final class OccurrenceKey { + final String symbol; + final List range; + final int roles; + + OccurrenceKey(String symbol, List range, int roles) { + this.symbol = symbol; + this.range = range; + this.roles = roles; + } + + static OccurrenceKey of(Scip.Occurrence occ) { + return new OccurrenceKey(occ.getSymbol(), occ.getRangeList(), occ.getSymbolRoles()); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof OccurrenceKey)) return false; + OccurrenceKey other = (OccurrenceKey) o; + return roles == other.roles && symbol.equals(other.symbol) && range.equals(other.range); + } + + @Override + public int hashCode() { + return Objects.hash(symbol, range, roles); + } + } + // ========================== // Symbol/occurrence emission // ========================== @@ -174,7 +232,7 @@ private void emitSymbolInformation(Element sym, Tree tree) { if (!signature.isEmpty()) { builder.setSignatureDocumentation( Scip.Document.newBuilder() - .setLanguage(Scip.Language.Java.name()) + .setLanguage(LANGUAGE_JAVA) .setRelativePath(relativePath) .setText(signature)); } @@ -243,6 +301,7 @@ private static boolean supportsReferenceRelationship(Element sym) { case INTERFACE: case CLASS: case ANNOTATION_TYPE: + case ENUM: return false; default: return true; 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 72cc75f4d..7f96fd017 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 @@ -54,7 +54,10 @@ public void started(TaskEvent e) { Result semanticdbPath = semanticdbOutputPath(options, e); if (semanticdbPath.isOk()) { try { - Files.deleteIfExists(semanticdbPath.getOrThrow()); + Path sdb = semanticdbPath.getOrThrow(); + Files.deleteIfExists(sdb); + // Also drop any stale SCIP shard so we don't accumulate occurrences across builds. + Files.deleteIfExists(scipShardPath(sdb)); } catch (IOException ex) { this.reportException(ex, e); } diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AbstractClasses.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AbstractClasses.java index ac2e74c31..fc494c4ac 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AbstractClasses.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AbstractClasses.java @@ -1,34 +1,34 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/AbstractClasses# +//⌄ enclosing_range_start scip-java maven . . minimized/AbstractClasses# public abstract class AbstractClasses { -// ^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AbstractClasses# +// ^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AbstractClasses# // display_name AbstractClasses // signature_documentation java public abstract class AbstractClasses // kind Class -// ^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AbstractClasses#``(). +// ^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AbstractClasses#``(). // display_name // signature_documentation java public AbstractClasses() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/AbstractClasses#defaultImplementation(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AbstractClasses#defaultImplementation(). public String defaultImplementation() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AbstractClasses#defaultImplementation(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AbstractClasses#defaultImplementation(). // display_name defaultImplementation // signature_documentation java public String defaultImplementation() // kind Method return ""; } -// ⌃ enclosing_range_end semanticdb maven . . minimized/AbstractClasses#defaultImplementation(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AbstractClasses#defaultImplementation(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/AbstractClasses#abstractImplementation(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AbstractClasses#abstractImplementation(). public abstract String abstractImplementation(); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AbstractClasses#abstractImplementation(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AbstractClasses#abstractImplementation(). // display_name abstractImplementation // signature_documentation java public abstract String abstractImplementation() // kind AbstractMethod -// relationship is_reference is_implementation semanticdb maven . . minimized/SubClasses#abstractImplementation(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/AbstractClasses#abstractImplementation(). +// relationship is_reference is_implementation scip-java maven . . minimized/SubClasses#abstractImplementation(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AbstractClasses#abstractImplementation(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/AbstractClasses# +//⌃ enclosing_range_end scip-java maven . . minimized/AbstractClasses# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationParameters.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationParameters.java index dbfff8af2..8a9e5d38b 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationParameters.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationParameters.java @@ -1,154 +1,154 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/Bar# +//⌄ enclosing_range_start scip-java maven . . minimized/Bar# @interface Bar { -// ^^^ definition semanticdb maven . . minimized/Bar# +// ^^^ definition scip-java maven . . minimized/Bar# // display_name Bar -// signature_documentation java @interface Bar +// signature_documentation java abstract @interface Bar implements Annotation // kind Interface -// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation# -// ⌄ enclosing_range_start semanticdb maven . . minimized/Bar#value(). +// relationship is_implementation scip-java maven jdk 11 java/lang/annotation/Annotation# +// ⌄ enclosing_range_start scip-java maven . . minimized/Bar#value(). double value(); -// ^^^^^ definition semanticdb maven . . minimized/Bar#value(). +// ^^^^^ definition scip-java maven . . minimized/Bar#value(). // display_name value // signature_documentation java public abstract double value() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Bar#value(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Bar#value(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Bar# +//⌃ enclosing_range_end scip-java maven . . minimized/Bar# -//⌄ enclosing_range_start semanticdb maven . . minimized/BarB# +//⌄ enclosing_range_start scip-java maven . . minimized/BarB# @interface BarB { -// ^^^^ definition semanticdb maven . . minimized/BarB# +// ^^^^ definition scip-java maven . . minimized/BarB# // display_name BarB -// signature_documentation java @interface BarB +// signature_documentation java abstract @interface BarB implements Annotation // kind Interface -// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation# -// ⌄ enclosing_range_start semanticdb maven . . minimized/BarB#value(). +// relationship is_implementation scip-java maven jdk 11 java/lang/annotation/Annotation# +// ⌄ enclosing_range_start scip-java maven . . minimized/BarB#value(). boolean value(); -// ^^^^^ definition semanticdb maven . . minimized/BarB#value(). +// ^^^^^ definition scip-java maven . . minimized/BarB#value(). // display_name value // signature_documentation java public abstract boolean value() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/BarB#value(). +// ⌃ enclosing_range_end scip-java maven . . minimized/BarB#value(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/BarB# +//⌃ enclosing_range_end scip-java maven . . minimized/BarB# -//⌄ enclosing_range_start semanticdb maven . . minimized/Nullable# +//⌄ enclosing_range_start scip-java maven . . minimized/Nullable# @interface Nullable { -// ^^^^^^^^ definition semanticdb maven . . minimized/Nullable# +// ^^^^^^^^ definition scip-java maven . . minimized/Nullable# // display_name Nullable -// signature_documentation java @interface Nullable +// signature_documentation java abstract @interface Nullable implements Annotation // kind Interface -// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation# -// ⌄ enclosing_range_start semanticdb maven . . minimized/Nullable#value(). +// relationship is_implementation scip-java maven jdk 11 java/lang/annotation/Annotation# +// ⌄ enclosing_range_start scip-java maven . . minimized/Nullable#value(). String value() default ""; -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^ definition semanticdb maven . . minimized/Nullable#value(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^ definition scip-java maven . . minimized/Nullable#value(). // display_name value // signature_documentation java public abstract String value() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Nullable#value(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Nullable#value(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Nullable# +//⌃ enclosing_range_end scip-java maven . . minimized/Nullable# -//⌄ enclosing_range_start semanticdb maven . . minimized/BarRef# +//⌄ enclosing_range_start scip-java maven . . minimized/BarRef# @interface BarRef{ -// ^^^^^^ definition semanticdb maven . . minimized/BarRef# +// ^^^^^^ definition scip-java maven . . minimized/BarRef# // display_name BarRef -// signature_documentation java @interface BarRef +// signature_documentation java abstract @interface BarRef implements Annotation // kind Interface -// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation# -// ⌄ enclosing_range_start semanticdb maven . . minimized/BarRef#value(). +// relationship is_implementation scip-java maven jdk 11 java/lang/annotation/Annotation# +// ⌄ enclosing_range_start scip-java maven . . minimized/BarRef#value(). SuppressWarnings value(); -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -// ^^^^^ definition semanticdb maven . . minimized/BarRef#value(). +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings# +// ^^^^^ definition scip-java maven . . minimized/BarRef#value(). // display_name value // signature_documentation java public abstract SuppressWarnings value() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/BarRef#value(). +// ⌃ enclosing_range_end scip-java maven . . minimized/BarRef#value(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/BarRef# +//⌃ enclosing_range_end scip-java maven . . minimized/BarRef# -//⌄ enclosing_range_start semanticdb maven . . minimized/Foo# +//⌄ enclosing_range_start scip-java maven . . minimized/Foo# interface Foo { -// ^^^ definition semanticdb maven . . minimized/Foo# +// ^^^ definition scip-java maven . . minimized/Foo# // display_name Foo -// signature_documentation java interface Foo +// signature_documentation java abstract interface Foo // kind Interface -// ⌄ enclosing_range_start semanticdb maven . . minimized/Foo#test(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Foo#test(). @Bar(-1d) -// ^^^ reference semanticdb maven . . minimized/Bar# +// ^^^ reference scip-java maven . . minimized/Bar# double test(); -// ^^^^ definition semanticdb maven . . minimized/Foo#test(). +// ^^^^ definition scip-java maven . . minimized/Foo#test(). // display_name test -// signature_documentation java @Bar(-1.0)\npublic abstract double test() +// signature_documentation java @Bar\npublic abstract double test() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Foo#test(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Foo#test(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Foo#test2(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Foo#test2(). @Bar(~5) -// ^^^ reference semanticdb maven . . minimized/Bar# +// ^^^ reference scip-java maven . . minimized/Bar# @SuppressWarnings(value = "unchecked") -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -// ^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#value(). +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings# +// ^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings#value(). double test2(); -// ^^^^^ definition semanticdb maven . . minimized/Foo#test2(). +// ^^^^^ definition scip-java maven . . minimized/Foo#test2(). // display_name test2 -// signature_documentation java @Bar(~5)\n@SuppressWarnings("unchecked")\npublic abstract double test2() +// signature_documentation java @Bar\n@SuppressWarnings\npublic abstract double test2() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Foo#test2(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Foo#test2(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Foo#test3(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Foo#test3(). @BarB(!true) -// ^^^^ reference semanticdb maven . . minimized/BarB# +// ^^^^ reference scip-java maven . . minimized/BarB# double test3(); -// ^^^^^ definition semanticdb maven . . minimized/Foo#test3(). +// ^^^^^ definition scip-java maven . . minimized/Foo#test3(). // display_name test3 -// signature_documentation java @BarB(!true)\npublic abstract double test3() +// signature_documentation java @BarB\npublic abstract double test3() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Foo#test3(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Foo#test3(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Foo#test4(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Foo#test4(). @Nullable(("what")) -// ^^^^^^^^ reference semanticdb maven . . minimized/Nullable# +// ^^^^^^^^ reference scip-java maven . . minimized/Nullable# Foo test4(); -// ^^^ reference semanticdb maven . . minimized/Foo# -// ^^^^^ definition semanticdb maven . . minimized/Foo#test4(). +// ^^^ reference scip-java maven . . minimized/Foo# +// ^^^^^ definition scip-java maven . . minimized/Foo#test4(). // display_name test4 -// signature_documentation java @Nullable("what")\npublic abstract Foo test4() +// signature_documentation java @Nullable\npublic abstract Foo test4() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Foo#test4(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Foo#test4(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Foo#testCast(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Foo#testCast(). @Bar((double) -1) -// ^^^ reference semanticdb maven . . minimized/Bar# +// ^^^ reference scip-java maven . . minimized/Bar# double testCast(); -// ^^^^^^^^ definition semanticdb maven . . minimized/Foo#testCast(). +// ^^^^^^^^ definition scip-java maven . . minimized/Foo#testCast(). // display_name testCast -// signature_documentation java @Bar((double) -1)\npublic abstract double testCast() +// signature_documentation java @Bar\npublic abstract double testCast() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Foo#testCast(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Foo#testCast(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Foo# +//⌃ enclosing_range_end scip-java maven . . minimized/Foo# -//⌄ enclosing_range_start semanticdb maven . . minimized/TestRef# +//⌄ enclosing_range_start scip-java maven . . minimized/TestRef# interface TestRef { -// ^^^^^^^ definition semanticdb maven . . minimized/TestRef# +// ^^^^^^^ definition scip-java maven . . minimized/TestRef# // display_name TestRef -// signature_documentation java interface TestRef +// signature_documentation java abstract interface TestRef // kind Interface -// ⌄ enclosing_range_start semanticdb maven . . minimized/TestRef#testCase(). +// ⌄ enclosing_range_start scip-java maven . . minimized/TestRef#testCase(). @BarRef(@SuppressWarnings(value = "unchecked")) -// ^^^^^^ reference semanticdb maven . . minimized/BarRef# -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -// ^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#value(). +// ^^^^^^ reference scip-java maven . . minimized/BarRef# +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings# +// ^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings#value(). abstract double testCase(); -// ^^^^^^^^ definition semanticdb maven . . minimized/TestRef#testCase(). +// ^^^^^^^^ definition scip-java maven . . minimized/TestRef#testCase(). // display_name testCase -// signature_documentation java @BarRef(@SuppressWarnings("unchecked"))\npublic abstract double testCase() +// signature_documentation java @BarRef\npublic abstract double testCase() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/TestRef#testCase(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TestRef#testCase(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/TestRef# +//⌃ enclosing_range_end scip-java maven . . minimized/TestRef# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Annotations.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Annotations.java index 1a6ace917..061c9a401 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Annotations.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Annotations.java @@ -1,79 +1,79 @@ package minimized; import java.lang.annotation.Documented; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ -// ^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Documented# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^^^^ reference scip-java maven . . java/lang/annotation/ +// ^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Documented# import java.lang.annotation.Retention; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ -// ^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Retention# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^^^^ reference scip-java maven . . java/lang/annotation/ +// ^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Retention# import java.lang.annotation.RetentionPolicy; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ -// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/RetentionPolicy# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^^^^ reference scip-java maven . . java/lang/annotation/ +// ^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/RetentionPolicy# import java.lang.annotation.Target; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^^^^ reference scip-java maven . . java/lang/annotation/ +// ^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Target# import static java.lang.annotation.ElementType.*; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^^^^ reference scip-java maven . . java/lang/annotation/ +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType# -//⌄ enclosing_range_start semanticdb maven . . minimized/Annotations# +//⌄ enclosing_range_start scip-java maven . . minimized/Annotations# @Documented -// ^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Documented# +// ^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Documented# @Retention(RetentionPolicy.RUNTIME) -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Retention# -// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/RetentionPolicy# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/RetentionPolicy#RUNTIME. +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Retention# +// ^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/RetentionPolicy# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/RetentionPolicy#RUNTIME. @Target(value = {CONSTRUCTOR, -// ^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target# -// ^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target#value(). -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#CONSTRUCTOR. +// ^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Target# +// ^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Target#value(). +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType#CONSTRUCTOR. FIELD, -// ^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#FIELD. +// ^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType#FIELD. LOCAL_VARIABLE, -// ^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#LOCAL_VARIABLE. +// ^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType#LOCAL_VARIABLE. METHOD, -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#METHOD. +// ^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType#METHOD. PACKAGE, -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#PACKAGE. +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType#PACKAGE. PARAMETER, -// ^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#PARAMETER. +// ^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType#PARAMETER. TYPE} -// ^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#TYPE. +// ^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType#TYPE. ) public @interface Annotations { -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/Annotations# +// ^^^^^^^^^^^ definition scip-java maven . . minimized/Annotations# // display_name Annotations -// signature_documentation java @Documented\n@Retention(RetentionPolicy.RUNTIME)\n@Target({CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})\npublic @interface Annotations +// signature_documentation java @Documented\n@Retention\n@Target\npublic abstract @interface Annotations implements Annotation // kind Interface -// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation# +// relationship is_implementation scip-java maven jdk 11 java/lang/annotation/Annotation# -// ⌄ enclosing_range_start semanticdb maven . . minimized/Annotations#value(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Annotations#value(). String value() default ""; -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^ definition semanticdb maven . . minimized/Annotations#value(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^ definition scip-java maven . . minimized/Annotations#value(). // display_name value // signature_documentation java public abstract String value() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Annotations#value(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Annotations#value(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Annotations#format(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Annotations#format(). String format() default ""; -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^ definition semanticdb maven . . minimized/Annotations#format(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^ definition scip-java maven . . minimized/Annotations#format(). // display_name format // signature_documentation java public abstract String format() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Annotations#format(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Annotations#format(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Annotations# +//⌃ enclosing_range_end scip-java maven . . minimized/Annotations# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java index 926380b42..4465c89df 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnnotationsOnParameterizedTypes.java @@ -1,238 +1,290 @@ package minimized; import java.lang.reflect.Constructor; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^ reference semanticdb maven . . java/lang/reflect/ -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/Constructor# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^ reference scip-java maven . . java/lang/reflect/ +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/reflect/Constructor# import java.lang.reflect.InvocationHandler; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^ reference semanticdb maven . . java/lang/reflect/ -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/InvocationHandler# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^ reference scip-java maven . . java/lang/reflect/ +// ^^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/reflect/InvocationHandler# import java.util.concurrent.ConcurrentHashMap; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^^^^^ reference semanticdb maven . . java/util/concurrent/ -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentHashMap# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^^^^^ reference scip-java maven . . java/util/concurrent/ +// ^^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/concurrent/ConcurrentHashMap# import java.util.concurrent.ConcurrentMap; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^^^^^ reference semanticdb maven . . java/util/concurrent/ -// ^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentMap# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^^^^^ reference scip-java maven . . java/util/concurrent/ +// ^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/concurrent/ConcurrentMap# import java.util.function.Function; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^^^ reference semanticdb maven . . java/util/function/ -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^^^ reference scip-java maven . . java/util/function/ +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/function/Function# -//⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# +//⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypes# public interface AnnotationsOnParameterizedTypes { -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypes# // display_name AnnotationsOnParameterizedTypes -// signature_documentation java public interface AnnotationsOnParameterizedTypes +// signature_documentation java public abstract interface AnnotationsOnParameterizedTypes // kind Interface -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#getInstance(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypes#getInstance(). public static AnnotationsOnParameterizedTypes getInstance() { -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#getInstance(). +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypes# +// ^^^^^^^^^^^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypes#getInstance(). // display_name getInstance // signature_documentation java public static AnnotationsOnParameterizedTypes getInstance() // kind StaticMethod return new AnnotationsOnParameterizedTypesImpl(); -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#``(). +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#``(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#getInstance(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypes#getInstance(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] // ⌄ enclosing_range_start local 0 // ⌄ enclosing_range_start local 1 Function adapter(Class contract, Class wrappedClass); -// ^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] +// ^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] // display_name C // signature_documentation java C // kind TypeParameter -// ^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] +// ^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] // display_name W // signature_documentation java W // kind TypeParameter -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] -// ^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/function/Function# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] +// ^^^^^^^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). // display_name adapter // signature_documentation java public abstract Function adapter(Class contract, Class wrappedClass) // kind AbstractMethod -// relationship is_reference is_implementation semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). -// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] +// relationship is_reference is_implementation scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// ^^^^^ reference scip-java maven jdk 11 java/lang/Class# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] // ^^^^^^^^ definition local 0 // display_name contract // signature_documentation java Class contract -// enclosing_symbol semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). -// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// kind Parameter +// ^^^^^ reference scip-java maven jdk 11 java/lang/Class# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] // ^^^^^^^^^^^^ definition local 1 // display_name wrappedClass // signature_documentation java Class wrappedClass -// enclosing_symbol semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// kind Parameter // ⌃ enclosing_range_end local 0 // ⌃ enclosing_range_end local 1 -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[C] +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter().[W] } -//⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# +//⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypes# -//⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl# +//⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl# class AnnotationsOnParameterizedTypesImpl implements AnnotationsOnParameterizedTypes { -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl# +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl# // display_name AnnotationsOnParameterizedTypesImpl -// signature_documentation java class AnnotationsOnParameterizedTypesImpl +// signature_documentation java class AnnotationsOnParameterizedTypesImpl implements AnnotationsOnParameterizedTypes // kind Class -// relationship is_implementation semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#``(). +// relationship is_implementation scip-java maven . . minimized/AnnotationsOnParameterizedTypes# +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#``(). // display_name // signature_documentation java AnnotationsOnParameterizedTypesImpl() // kind Constructor -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypes# -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypes# +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. private ConcurrentMap, Constructor> proxyConstructors = new ConcurrentHashMap<>(); -// ^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentMap# -// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/Constructor# -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. +// ^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/concurrent/ConcurrentMap# +// ^^^^^ reference scip-java maven jdk 11 java/lang/Class# +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/reflect/Constructor# +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. // display_name proxyConstructors // signature_documentation java private ConcurrentMap, Constructor> proxyConstructors // kind Field -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentHashMap#``(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. +// ^^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/concurrent/ConcurrentHashMap#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# // ⌄ enclosing_range_start local 2 +// ⌄ enclosing_range_start local 0 // ⌄ enclosing_range_start local 3 +// ⌄ enclosing_range_start local 1 public Function adapter(Class contract, Class wrappedClass) { -// ^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] // display_name C // signature_documentation java C // kind TypeParameter -// ^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] +// ^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] // display_name W // signature_documentation java W // kind TypeParameter -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] -// ^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/function/Function# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ^^^^^^^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). // display_name adapter // signature_documentation java @Override\npublic Function adapter(Class contract, Class wrappedClass) // kind Method -// relationship is_reference is_implementation semanticdb maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). -// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] -// ^^^^^^^^ definition local 2 +// relationship is_reference is_implementation scip-java maven . . minimized/AnnotationsOnParameterizedTypes#adapter(). +// ^^^^^ reference scip-java maven jdk 11 java/lang/Class# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ^^^^^^^^ definition local 0 // display_name contract // signature_documentation java Class contract -// enclosing_symbol semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). -// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] -// ^^^^^^^^^^^^ definition local 3 +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// kind Parameter +// ^^^^^^^^ definition local 2 +// display_name constructor +// signature_documentation java Function constructor +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// kind Variable +// ^^^^^ reference scip-java maven jdk 11 java/lang/Class# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] +// ^^^^^^^^^^^^ definition local 1 // display_name wrappedClass // signature_documentation java Class wrappedClass -// enclosing_symbol semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// kind Parameter +// ^^^^^^^^^^^^ definition local 3 +// display_name contract +// signature_documentation java Class contract +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// kind Parameter // ⌃ enclosing_range_end local 2 +// ⌃ enclosing_range_end local 0 // ⌃ enclosing_range_end local 3 +// ⌃ enclosing_range_end local 1 // ⌄ enclosing_range_start local 4 +// ⌄ enclosing_range_start local 2 Function constructor = getConstructor(contract); -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/InvocationHandler# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] -// ^^^^^^^^^^^ definition local 4 +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/function/Function# +// ^^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/reflect/InvocationHandler# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ^^^^^^^^^^^ definition local 2 // display_name constructor // signature_documentation java Function constructor -// enclosing_symbol semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). // kind Variable -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// ^^^^^^^^^^^ definition local 4 +// display_name constructor +// signature_documentation java @SuppressWarnings\nConstructor constructor +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// kind Variable +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// ^^^^^^^^ reference local 0 // ^^^^^^^^ reference local 2 // ⌃ enclosing_range_end local 4 +// ⌃ enclosing_range_end local 2 System.out.println(constructor); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+9). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+9). +// ^^^^^^^^^^^ reference local 2 // ^^^^^^^^^^^ reference local 4 return null; } -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[C] +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#adapter().[W] -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] // ⌄ enclosing_range_start local 5 +// ⌄ enclosing_range_start local 3 private Function getConstructor(Class contract) { -// ^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] // display_name T // signature_documentation java T // kind TypeParameter -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/InvocationHandler# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] -// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/function/Function# +// ^^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/reflect/InvocationHandler# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). // display_name getConstructor // signature_documentation java private Function getConstructor(Class contract) // kind Method -// ^^^^^ reference semanticdb maven jdk 11 java/lang/Class# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] -// ^^^^^^^^ definition local 5 +// ^^^^^ reference scip-java maven jdk 11 java/lang/Class# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^ definition local 3 // display_name contract // signature_documentation java Class contract -// enclosing_symbol semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// kind Parameter +// ^^^^^^^^ definition local 5 +// display_name c +// signature_documentation java Class c +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// kind Parameter // ⌃ enclosing_range_end local 5 +// ⌃ enclosing_range_end local 3 // ⌄ enclosing_range_start local 6 +// ⌄ enclosing_range_start local 4 @SuppressWarnings("unchecked") -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings# // ⌄ enclosing_range_start local 7 +// ⌄ enclosing_range_start local 5 Constructor constructor = (Constructor) proxyConstructors.computeIfAbsent(contract, c -> { -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/Constructor# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/reflect/Constructor# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^^^^ definition local 4 +// display_name constructor +// signature_documentation java @SuppressWarnings\nConstructor constructor +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// kind Variable // ^^^^^^^^^^^ definition local 6 // display_name constructor // signature_documentation java @SuppressWarnings\nConstructor constructor -// enclosing_symbol semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). // kind Variable -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/reflect/Constructor# -// ^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. -// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/concurrent/ConcurrentMap#computeIfAbsent(). +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/reflect/Constructor# +// ^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] +// ^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#proxyConstructors. +// ^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/concurrent/ConcurrentMap#computeIfAbsent(). +// ^^^^^^^^ reference local 3 // ^^^^^^^^ reference local 5 +// ^ definition local 5 +// display_name c +// signature_documentation java Class c +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// kind Parameter // ^ definition local 7 // display_name c // signature_documentation java Class c -// enclosing_symbol semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// enclosing_symbol scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// kind Parameter // ⌃ enclosing_range_end local 7 +// ⌃ enclosing_range_end local 5 return null; }); // ⌃ enclosing_range_end local 6 +// ⌃ enclosing_range_end local 4 System.out.println(constructor); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+9). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+9). +// ^^^^^^^^^^^ reference local 4 // ^^^^^^^^^^^ reference local 6 return null; } -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). - }//⌃ enclosing_range_end semanticdb maven . . minimized/AnnotationsOnParameterizedTypesImpl# +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl#getConstructor().[T] + }//⌃ enclosing_range_end scip-java maven . . minimized/AnnotationsOnParameterizedTypesImpl# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnonymousClasses.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnonymousClasses.java index 5b997a6b4..7d7687db8 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnonymousClasses.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/AnonymousClasses.java @@ -1,66 +1,68 @@ package minimized; import java.util.function.Function; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^^^ reference semanticdb maven . . java/util/function/ -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^^^ reference scip-java maven . . java/util/function/ +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/function/Function# -//⌄ enclosing_range_start semanticdb maven . . minimized/AnonymousClasses# +//⌄ enclosing_range_start scip-java maven . . minimized/AnonymousClasses# @SuppressWarnings("ALL") -// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# +// ^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings# public class AnonymousClasses { -// ^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnonymousClasses# +// ^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AnonymousClasses# // display_name AnonymousClasses -// signature_documentation java @SuppressWarnings("ALL")\npublic class AnonymousClasses +// signature_documentation java @SuppressWarnings\npublic class AnonymousClasses // kind Class -// ^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/AnonymousClasses#``(). +// ^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/AnonymousClasses#``(). // display_name // signature_documentation java public AnonymousClasses() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/AnonymousClasses#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/AnonymousClasses#app(). // ⌄ enclosing_range_start local 0 public static int app(int n) { -// ^^^ definition semanticdb maven . . minimized/AnonymousClasses#app(). +// ^^^ definition scip-java maven . . minimized/AnonymousClasses#app(). // display_name app // signature_documentation java public static int app(int n) // kind StaticMethod // ^ definition local 0 // display_name n // signature_documentation java int n -// enclosing_symbol semanticdb maven . . minimized/AnonymousClasses#app(). +// enclosing_symbol scip-java maven . . minimized/AnonymousClasses#app(). +// kind Parameter // ⌃ enclosing_range_end local 0 // ⌄ enclosing_range_start local 1 Function fn = -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/function/Function# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# // ^^ definition local 1 // display_name fn // signature_documentation java Function fn -// enclosing_symbol semanticdb maven . . minimized/AnonymousClasses#app(). +// enclosing_symbol scip-java maven . . minimized/AnonymousClasses#app(). // kind Variable new Function() { -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/function/Function# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/function/Function# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# // ⌄ enclosing_range_start local 3 @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# // ⌄ enclosing_range_start local 4 public Integer apply(Integer integer) { -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# // ^^^^^ definition local 3 // display_name apply // signature_documentation java @Override\npublic Integer apply(Integer integer) // enclosing_symbol local 2 // kind Method -// relationship is_reference is_implementation semanticdb maven jdk 11 java/util/function/Function#apply(). -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# +// relationship is_reference is_implementation scip-java maven jdk 11 java/util/function/Function#apply(). +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# // ^^^^^^^ definition local 4 // display_name integer // signature_documentation java Integer integer // enclosing_symbol local 3 +// kind Parameter // ⌃ enclosing_range_end local 4 return integer + n; // ^^^^^^^ reference local 4 @@ -72,9 +74,9 @@ public Integer apply(Integer integer) { return fn.apply(n); // ^^ reference local 1 -// ^^^^^ reference semanticdb maven jdk 11 java/util/function/Function#apply(). +// ^^^^^ reference scip-java maven jdk 11 java/util/function/Function#apply(). // ^ reference local 0 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/AnonymousClasses#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/AnonymousClasses#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/AnonymousClasses# +//⌃ enclosing_range_end scip-java maven . . minimized/AnonymousClasses# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Arrays.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Arrays.java index e3a05bc9a..b788cf026 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Arrays.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Arrays.java @@ -1,19 +1,19 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/Arrays# +//⌄ enclosing_range_start scip-java maven . . minimized/Arrays# public class Arrays { -// ^^^^^^ definition semanticdb maven . . minimized/Arrays# +// ^^^^^^ definition scip-java maven . . minimized/Arrays# // display_name Arrays // signature_documentation java public class Arrays // kind Class -// ^^^^^^ definition semanticdb maven . . minimized/Arrays#``(). +// ^^^^^^ definition scip-java maven . . minimized/Arrays#``(). // display_name // signature_documentation java public Arrays() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/Arrays#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Arrays#app(). public static String app() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/Arrays#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/Arrays#app(). // display_name app // signature_documentation java public static String app() // kind StaticMethod @@ -22,16 +22,16 @@ public static String app() { // ^ definition local 0 // display_name a // signature_documentation java int[] a -// enclosing_symbol semanticdb maven . . minimized/Arrays#app(). +// enclosing_symbol scip-java maven . . minimized/Arrays#app(). // kind Variable // ⌃ enclosing_range_end local 0 // ⌄ enclosing_range_start local 1 String[] b = {"1", "2", "3"}; -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^ definition local 1 // display_name b // signature_documentation java String[] b -// enclosing_symbol semanticdb maven . . minimized/Arrays#app(). +// enclosing_symbol scip-java maven . . minimized/Arrays#app(). // kind Variable // ⌃ enclosing_range_end local 1 // ⌄ enclosing_range_start local 2 @@ -39,16 +39,16 @@ public static String app() { // ^ definition local 2 // display_name c // signature_documentation java int[][] c -// enclosing_symbol semanticdb maven . . minimized/Arrays#app(). +// enclosing_symbol scip-java maven . . minimized/Arrays#app(). // kind Variable // ⌃ enclosing_range_end local 2 // ⌄ enclosing_range_start local 3 String[][] d = {{"1"}, {"2"}, {"3"}}; -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^ definition local 3 // display_name d // signature_documentation java String[][] d -// enclosing_symbol semanticdb maven . . minimized/Arrays#app(). +// enclosing_symbol scip-java maven . . minimized/Arrays#app(). // kind Variable // ⌃ enclosing_range_end local 3 return b[0] + a[0] + c[1][0] + d[1][0]; @@ -57,6 +57,6 @@ public static String app() { // ^ reference local 2 // ^ reference local 3 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Arrays#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Arrays#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Arrays# +//⌃ enclosing_range_end scip-java maven . . minimized/Arrays# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ClassOf.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ClassOf.java index b5d2a0718..e69bec052 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ClassOf.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ClassOf.java @@ -1,27 +1,27 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/ClassOf# +//⌄ enclosing_range_start scip-java maven . . minimized/ClassOf# public class ClassOf { -// ^^^^^^^ definition semanticdb maven . . minimized/ClassOf# +// ^^^^^^^ definition scip-java maven . . minimized/ClassOf# // display_name ClassOf // signature_documentation java public class ClassOf // kind Class -// ^^^^^^^ definition semanticdb maven . . minimized/ClassOf#``(). +// ^^^^^^^ definition scip-java maven . . minimized/ClassOf#``(). // display_name // signature_documentation java public ClassOf() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/ClassOf#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/ClassOf#app(). public static String app() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/ClassOf#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/ClassOf#app(). // display_name app // signature_documentation java public static String app() // kind StaticMethod return ClassOf.class.getName(); -// ^^^^^^^ reference semanticdb maven . . minimized/ClassOf# -// ^^^^^ reference semanticdb maven . . minimized/ClassOf#class. -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Class#getName(). +// ^^^^^^^ reference scip-java maven . . minimized/ClassOf# +// ^^^^^ reference scip-java maven . . minimized/ClassOf#class. +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Class#getName(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/ClassOf#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/ClassOf#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/ClassOf# +//⌃ enclosing_range_end scip-java maven . . minimized/ClassOf# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Docstrings.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Docstrings.java index db59496fc..f5476a4d5 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Docstrings.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Docstrings.java @@ -1,43 +1,43 @@ package minimized; /** Example class docstring. */ -//⌄ enclosing_range_start semanticdb maven . . minimized/Docstrings# +//⌄ enclosing_range_start scip-java maven . . minimized/Docstrings# public class Docstrings { -// ^^^^^^^^^^ definition semanticdb maven . . minimized/Docstrings# +// ^^^^^^^^^^ definition scip-java maven . . minimized/Docstrings# // display_name Docstrings // signature_documentation java public class Docstrings // kind Class // documentation Example class docstring. -// ^^^^^^^^^^ definition semanticdb maven . . minimized/Docstrings#``(). +// ^^^^^^^^^^ definition scip-java maven . . minimized/Docstrings#``(). // display_name // signature_documentation java public Docstrings() // kind Constructor /** Example field docstring. */ -// ⌄ enclosing_range_start semanticdb maven . . minimized/Docstrings#field. +// ⌄ enclosing_range_start scip-java maven . . minimized/Docstrings#field. public static int field = 42; -// ^^^^^ definition semanticdb maven . . minimized/Docstrings#field. +// ^^^^^ definition scip-java maven . . minimized/Docstrings#field. // display_name field // signature_documentation java public static int field // kind StaticField // documentation Example field docstring. -// ⌃ enclosing_range_end semanticdb maven . . minimized/Docstrings#field. +// ⌃ enclosing_range_end scip-java maven . . minimized/Docstrings#field. /** * Example method docstring. * * @return 42. */ -// ⌄ enclosing_range_start semanticdb maven . . minimized/Docstrings#method(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Docstrings#method(). public static int method() { -// ^^^^^^ definition semanticdb maven . . minimized/Docstrings#method(). +// ^^^^^^ definition scip-java maven . . minimized/Docstrings#method(). // display_name method // signature_documentation java public static int method() // kind StaticMethod // documentation Example method docstring.\n\n @return 42.\n return 42; } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Docstrings#method(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Docstrings#method(). /** * Example method parameter docstring. @@ -45,10 +45,10 @@ public static int method() { * @param n The parameter. * @return The number + 42. */ -// ⌄ enclosing_range_start semanticdb maven . . minimized/Docstrings#methodParameter(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Docstrings#methodParameter(). // ⌄ enclosing_range_start local 0 public static int methodParameter(int n) { -// ^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Docstrings#methodParameter(). +// ^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Docstrings#methodParameter(). // display_name methodParameter // signature_documentation java public static int methodParameter(int n) // kind StaticMethod @@ -56,27 +56,28 @@ public static int methodParameter(int n) { // ^ definition local 0 // display_name n // signature_documentation java int n -// enclosing_symbol semanticdb maven . . minimized/Docstrings#methodParameter(). +// enclosing_symbol scip-java maven . . minimized/Docstrings#methodParameter(). +// kind Parameter // ⌃ enclosing_range_end local 0 return n + 42; // ^ reference local 0 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Docstrings#methodParameter(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Docstrings#methodParameter(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Docstrings#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Docstrings#app(). public static String app() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/Docstrings#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/Docstrings#app(). // display_name app // signature_documentation java public static String app() // kind StaticMethod return String.format("%s%s%s", field, method(), methodParameter(42)); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#format(). -// ^^^^^ reference semanticdb maven . . minimized/Docstrings#field. -// ^^^^^^ reference semanticdb maven . . minimized/Docstrings#method(). -// ^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Docstrings#methodParameter(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String#format(). +// ^^^^^ reference scip-java maven . . minimized/Docstrings#field. +// ^^^^^^ reference scip-java maven . . minimized/Docstrings#method(). +// ^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Docstrings#methodParameter(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Docstrings#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Docstrings#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Docstrings# +//⌃ enclosing_range_end scip-java maven . . minimized/Docstrings# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Enums.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Enums.java index 2e8cf63ca..ee255d00f 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Enums.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Enums.java @@ -1,123 +1,129 @@ package minimized; import java.util.Arrays; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^ reference semanticdb maven jdk 11 java/util/Arrays# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^ reference scip-java maven jdk 11 java/util/Arrays# import java.util.stream.Collectors; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^ reference semanticdb maven . . java/util/stream/ -// ^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/stream/Collectors# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^ reference scip-java maven . . java/util/stream/ +// ^^^^^^^^^^ reference scip-java maven jdk 11 java/util/stream/Collectors# -//⌄ enclosing_range_start semanticdb maven . . minimized/Enums# +//⌄ enclosing_range_start scip-java maven . . minimized/Enums# enum Enums { -// ^^^^^ definition semanticdb maven . . minimized/Enums# +// ^^^^^ definition scip-java maven . . minimized/Enums# // display_name Enums -// signature_documentation java enum Enums +// signature_documentation java final enum Enums extends Enum // kind Enum -// relationship is_implementation semanticdb maven jdk 11 java/io/Serializable# -// relationship is_implementation semanticdb maven jdk 11 java/lang/Comparable# -// relationship is_implementation semanticdb maven jdk 11 java/lang/Enum# -// ⌄ enclosing_range_start semanticdb maven . . minimized/Enums#A. +// relationship is_implementation scip-java maven jdk 11 java/io/Serializable# +// relationship is_implementation scip-java maven jdk 11 java/lang/Comparable# +// relationship is_implementation scip-java maven jdk 11 java/lang/Enum# +// ⌄ enclosing_range_start scip-java maven . . minimized/Enums#A. A("A", 420), -// ^ definition semanticdb maven . . minimized/Enums#A. +// ^ definition scip-java maven . . minimized/Enums#A. // display_name A("A", 420) -// signature_documentation java Enums.A("A", 420) /* ordinal 0 */ -// ^ reference semanticdb maven . . minimized/Enums#``(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/Enums#A. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Enums#B. +// signature_documentation java public static final A +// kind EnumMember +// ^ reference scip-java maven . . minimized/Enums#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Enums#A. +// ⌄ enclosing_range_start scip-java maven . . minimized/Enums#B. B("B", 1), -// ^ definition semanticdb maven . . minimized/Enums#B. +// ^ definition scip-java maven . . minimized/Enums#B. // display_name B("B", 1) -// signature_documentation java Enums.B("B", 1) /* ordinal 1 */ -// ^ reference semanticdb maven . . minimized/Enums#``(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/Enums#B. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Enums#C. +// signature_documentation java public static final B +// kind EnumMember +// ^ reference scip-java maven . . minimized/Enums#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Enums#B. +// ⌄ enclosing_range_start scip-java maven . . minimized/Enums#C. C("C", 5); -// ^ definition semanticdb maven . . minimized/Enums#C. +// ^ definition scip-java maven . . minimized/Enums#C. // display_name C("C", 5) -// signature_documentation java Enums.C("C", 5) /* ordinal 2 */ -// ^ reference semanticdb maven . . minimized/Enums#``(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/Enums#C. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Enums#value. +// signature_documentation java public static final C +// kind EnumMember +// ^ reference scip-java maven . . minimized/Enums#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Enums#C. +// ⌄ enclosing_range_start scip-java maven . . minimized/Enums#value. public String value; -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^ definition semanticdb maven . . minimized/Enums#value. +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^ definition scip-java maven . . minimized/Enums#value. // display_name value // signature_documentation java public String value // kind Field -// ⌃ enclosing_range_end semanticdb maven . . minimized/Enums#value. +// ⌃ enclosing_range_end scip-java maven . . minimized/Enums#value. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Enums#``(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Enums#``(). // ⌄ enclosing_range_start local 0 // ⌄ enclosing_range_start local 1 Enums(String value, int a) { -// ^^^^^ definition semanticdb maven . . minimized/Enums#``(). +// ^^^^^ definition scip-java maven . . minimized/Enums#``(). // display_name // signature_documentation java private Enums(String value, int a) // kind Constructor -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^^^^ definition local 0 // display_name value // signature_documentation java String value -// enclosing_symbol semanticdb maven . . minimized/Enums#``(). +// enclosing_symbol scip-java maven . . minimized/Enums#``(). +// kind Parameter // ^ definition local 1 // display_name a // signature_documentation java int a -// enclosing_symbol semanticdb maven . . minimized/Enums#``(). +// enclosing_symbol scip-java maven . . minimized/Enums#``(). +// kind Parameter // ⌃ enclosing_range_end local 0 // ⌃ enclosing_range_end local 1 this.value = value; -// ^^^^^ reference semanticdb maven . . minimized/Enums#value. +// ^^^^^ reference scip-java maven . . minimized/Enums#value. // ^^^^^ reference local 0 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Enums#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Enums#``(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Enums#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Enums#app(). public static String app() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/Enums#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/Enums#app(). // display_name app // signature_documentation java public static String app() // kind StaticMethod // ⌄ enclosing_range_start local 2 // ⌄ enclosing_range_start local 3 String all = Arrays.stream(values()).map(e -> e.value).map(Enums::valueOf).collect(Collectors.toList()).toString(); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^^ definition local 2 // display_name all // signature_documentation java String all -// enclosing_symbol semanticdb maven . . minimized/Enums#app(). +// enclosing_symbol scip-java maven . . minimized/Enums#app(). // kind Variable -// ^^^^^^ reference semanticdb maven jdk 11 java/util/Arrays# -// ^^^^^^ reference semanticdb maven jdk 11 java/util/Arrays#stream(). -// ^^^^^^ reference semanticdb maven . . minimized/Enums#values(). -// ^^^ reference semanticdb maven jdk 11 java/util/stream/Stream#map(). +// ^^^^^^ reference scip-java maven jdk 11 java/util/Arrays# +// ^^^^^^ reference scip-java maven jdk 11 java/util/Arrays#stream(). +// ^^^^^^ reference scip-java maven . . minimized/Enums#values(). +// ^^^ reference scip-java maven jdk 11 java/util/stream/Stream#map(). // ^ definition local 3 // display_name e // signature_documentation java Enums e -// enclosing_symbol semanticdb maven . . minimized/Enums#app(). +// enclosing_symbol scip-java maven . . minimized/Enums#app(). +// kind Parameter // ^ reference local 3 -// ^^^^^ reference semanticdb maven . . minimized/Enums#value. -// ^^^ reference semanticdb maven jdk 11 java/util/stream/Stream#map(). -// ^^^^^ reference semanticdb maven . . minimized/Enums# -// ^^^^^^^ reference semanticdb maven . . minimized/Enums#valueOf(). -// ^^^^^^^ reference semanticdb maven jdk 11 java/util/stream/Stream#collect(+1). -// ^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/stream/Collectors# -// ^^^^^^ reference semanticdb maven jdk 11 java/util/stream/Collectors#toList(). -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Object#toString(). +// ^^^^^ reference scip-java maven . . minimized/Enums#value. +// ^^^ reference scip-java maven jdk 11 java/util/stream/Stream#map(). +// ^^^^^ reference scip-java maven . . minimized/Enums# +// ^^^^^^^ reference scip-java maven . . minimized/Enums#valueOf(). +// ^^^^^^^ reference scip-java maven jdk 11 java/util/stream/Stream#collect(+1). +// ^^^^^^^^^^ reference scip-java maven jdk 11 java/util/stream/Collectors# +// ^^^^^^ reference scip-java maven jdk 11 java/util/stream/Collectors#toList(). +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Object#toString(). // ⌃ enclosing_range_end local 3 // ⌃ enclosing_range_end local 2 return all + A.value + B.value + C.value; // ^^^ reference local 2 -// ^ reference semanticdb maven . . minimized/Enums#A. -// ^^^^^ reference semanticdb maven . . minimized/Enums#value. -// ^ reference semanticdb maven . . minimized/Enums#B. -// ^^^^^ reference semanticdb maven . . minimized/Enums#value. -// ^ reference semanticdb maven . . minimized/Enums#C. -// ^^^^^ reference semanticdb maven . . minimized/Enums#value. +// ^ reference scip-java maven . . minimized/Enums#A. +// ^^^^^ reference scip-java maven . . minimized/Enums#value. +// ^ reference scip-java maven . . minimized/Enums#B. +// ^^^^^ reference scip-java maven . . minimized/Enums#value. +// ^ reference scip-java maven . . minimized/Enums#C. +// ^^^^^ reference scip-java maven . . minimized/Enums#value. } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Enums#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Enums#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Enums# +//⌃ enclosing_range_end scip-java maven . . minimized/Enums# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Fields.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Fields.java index 3a9236e2e..903159eb0 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Fields.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Fields.java @@ -1,171 +1,171 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/Fields# +//⌄ enclosing_range_start scip-java maven . . minimized/Fields# public class Fields { -// ^^^^^^ definition semanticdb maven . . minimized/Fields# +// ^^^^^^ definition scip-java maven . . minimized/Fields# // display_name Fields // signature_documentation java public class Fields // kind Class -// ^^^^^^ definition semanticdb maven . . minimized/Fields#``(). +// ^^^^^^ definition scip-java maven . . minimized/Fields#``(). // display_name // signature_documentation java public Fields() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#privateField. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#privateField. private final int privateField = 0; -// ^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#privateField. +// ^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#privateField. // display_name privateField // signature_documentation java private final int privateField // kind Field -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#privateField. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#protectedField. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#privateField. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#protectedField. protected int protectedField = 0; -// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#protectedField. +// ^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#protectedField. // display_name protectedField // signature_documentation java protected int protectedField // kind Field -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#protectedField. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#publicField. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#protectedField. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#publicField. public int publicField = 0; -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#publicField. +// ^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#publicField. // display_name publicField // signature_documentation java public int publicField // kind Field -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#publicField. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#staticPrivateField. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#publicField. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#staticPrivateField. private static final int staticPrivateField = 0; -// ^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#staticPrivateField. +// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#staticPrivateField. // display_name staticPrivateField // signature_documentation java private static final int staticPrivateField // kind StaticField -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#staticPrivateField. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#staticProtectedFields. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#staticPrivateField. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#staticProtectedFields. protected static int staticProtectedFields = 0; -// ^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#staticProtectedFields. +// ^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#staticProtectedFields. // display_name staticProtectedFields // signature_documentation java protected static int staticProtectedFields // kind StaticField -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#staticProtectedFields. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#staticPublicField. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#staticProtectedFields. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#staticPublicField. public static int staticPublicField = 0; -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#staticPublicField. +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#staticPublicField. // display_name staticPublicField // signature_documentation java public static int staticPublicField // kind StaticField -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#staticPublicField. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#staticPublicField. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#InnerFields# +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#InnerFields# public class InnerFields { -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#InnerFields# +// ^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#InnerFields# // display_name InnerFields // signature_documentation java public class InnerFields // kind Class -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#InnerFields#``(). +// ^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#InnerFields#``(). // display_name // signature_documentation java public InnerFields() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#InnerFields#publicInnerField. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#InnerFields#publicInnerField. public int publicInnerField = publicField; -// ^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#InnerFields#publicInnerField. +// ^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#InnerFields#publicInnerField. // display_name publicInnerField // signature_documentation java public int publicInnerField // kind Field -// ^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#publicField. -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#InnerFields#publicInnerField. +// ^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#publicField. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#InnerFields#publicInnerField. } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#InnerFields# +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#InnerFields# -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#InnerStaticFields# +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#InnerStaticFields# public static class InnerStaticFields { -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#InnerStaticFields# +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#InnerStaticFields# // display_name InnerStaticFields // signature_documentation java public static class InnerStaticFields // kind Class -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#InnerStaticFields#``(). +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#InnerStaticFields#``(). // display_name // signature_documentation java public InnerStaticFields() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#InnerStaticFields#publicNonStaticInnerField. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#InnerStaticFields#publicNonStaticInnerField. public int publicNonStaticInnerField = 0; -// ^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#InnerStaticFields#publicNonStaticInnerField. +// ^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#InnerStaticFields#publicNonStaticInnerField. // display_name publicNonStaticInnerField // signature_documentation java public int publicNonStaticInnerField // kind Field -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#InnerStaticFields#publicNonStaticInnerField. -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#InnerStaticFields#publicStaticInnerField. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#InnerStaticFields#publicNonStaticInnerField. +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#InnerStaticFields#publicStaticInnerField. public static int publicStaticInnerField = 0; -// ^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Fields#InnerStaticFields#publicStaticInnerField. +// ^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Fields#InnerStaticFields#publicStaticInnerField. // display_name publicStaticInnerField // signature_documentation java public static int publicStaticInnerField // kind StaticField -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#InnerStaticFields#publicStaticInnerField. +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#InnerStaticFields#publicStaticInnerField. } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#InnerStaticFields# +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#InnerStaticFields# -// ⌄ enclosing_range_start semanticdb maven . . minimized/Fields#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Fields#app(). public static String app() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/Fields#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/Fields#app(). // display_name app // signature_documentation java public static String app() // kind StaticMethod // ⌄ enclosing_range_start local 0 Fields fields = new Fields(); -// ^^^^^^ reference semanticdb maven . . minimized/Fields# +// ^^^^^^ reference scip-java maven . . minimized/Fields# // ^^^^^^ definition local 0 // display_name fields // signature_documentation java Fields fields -// enclosing_symbol semanticdb maven . . minimized/Fields#app(). +// enclosing_symbol scip-java maven . . minimized/Fields#app(). // kind Variable -// ^^^^^^ reference semanticdb maven . . minimized/Fields#``(). +// ^^^^^^ reference scip-java maven . . minimized/Fields#``(). // ⌃ enclosing_range_end local 0 // ⌄ enclosing_range_start local 1 InnerFields innerFields = fields.new InnerFields(); -// ^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#InnerFields# +// ^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#InnerFields# // ^^^^^^^^^^^ definition local 1 // display_name innerFields // signature_documentation java InnerFields innerFields -// enclosing_symbol semanticdb maven . . minimized/Fields#app(). +// enclosing_symbol scip-java maven . . minimized/Fields#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#InnerFields#``(). +// ^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#InnerFields#``(). // ⌃ enclosing_range_end local 1 // ⌄ enclosing_range_start local 2 InnerStaticFields innerStaticFields = new InnerStaticFields(); -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#InnerStaticFields# +// ^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#InnerStaticFields# // ^^^^^^^^^^^^^^^^^ definition local 2 // display_name innerStaticFields // signature_documentation java InnerStaticFields innerStaticFields -// enclosing_symbol semanticdb maven . . minimized/Fields#app(). +// enclosing_symbol scip-java maven . . minimized/Fields#app(). // kind Variable -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#InnerStaticFields#``(). +// ^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#InnerStaticFields#``(). // ⌃ enclosing_range_end local 2 return String.valueOf(fields.privateField) -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/String#valueOf(+5). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/String#valueOf(+5). // ^^^^^^ reference local 0 -// ^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#privateField. +// ^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#privateField. + fields.protectedField // ^^^^^^ reference local 0 -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#protectedField. +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#protectedField. + fields.publicField // ^^^^^^ reference local 0 -// ^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#publicField. +// ^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#publicField. + staticPrivateField -// ^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#staticPrivateField. +// ^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#staticPrivateField. + staticProtectedFields -// ^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#staticProtectedFields. +// ^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#staticProtectedFields. + staticPublicField -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#staticPublicField. +// ^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#staticPublicField. + innerFields.publicInnerField // ^^^^^^^^^^^ reference local 1 -// ^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#InnerFields#publicInnerField. +// ^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#InnerFields#publicInnerField. + InnerStaticFields.publicStaticInnerField -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#InnerStaticFields# -// ^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#InnerStaticFields#publicStaticInnerField. +// ^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#InnerStaticFields# +// ^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#InnerStaticFields#publicStaticInnerField. + innerStaticFields.publicNonStaticInnerField; // ^^^^^^^^^^^^^^^^^ reference local 2 -// ^^^^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Fields#InnerStaticFields#publicNonStaticInnerField. +// ^^^^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Fields#InnerStaticFields#publicNonStaticInnerField. } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Fields#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Fields#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Fields# +//⌃ enclosing_range_end scip-java maven . . minimized/Fields# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ForComprehensions.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ForComprehensions.java index c1164a5c3..18cc6bcb7 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ForComprehensions.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ForComprehensions.java @@ -1,47 +1,48 @@ package minimized; import java.util.Collections; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Collections# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Collections# import java.util.List; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^ reference semanticdb maven jdk 11 java/util/List# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^ reference scip-java maven jdk 11 java/util/List# -//⌄ enclosing_range_start semanticdb maven . . minimized/ForComprehensions# +//⌄ enclosing_range_start scip-java maven . . minimized/ForComprehensions# public class ForComprehensions { -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ForComprehensions# +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/ForComprehensions# // display_name ForComprehensions // signature_documentation java public class ForComprehensions // kind Class -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ForComprehensions#``(). +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/ForComprehensions#``(). // display_name // signature_documentation java public ForComprehensions() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/ForComprehensions#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/ForComprehensions#app(). // ⌄ enclosing_range_start local 0 public static int app(int n) { -// ^^^ definition semanticdb maven . . minimized/ForComprehensions#app(). +// ^^^ definition scip-java maven . . minimized/ForComprehensions#app(). // display_name app // signature_documentation java public static int app(int n) // kind StaticMethod // ^ definition local 0 // display_name n // signature_documentation java int n -// enclosing_symbol semanticdb maven . . minimized/ForComprehensions#app(). +// enclosing_symbol scip-java maven . . minimized/ForComprehensions#app(). +// kind Parameter // ⌃ enclosing_range_end local 0 // ⌄ enclosing_range_start local 1 List integers = Collections.singletonList(n); -// ^^^^ reference semanticdb maven jdk 11 java/util/List# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# +// ^^^^ reference scip-java maven jdk 11 java/util/List# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# // ^^^^^^^^ definition local 1 // display_name integers // signature_documentation java List integers -// enclosing_symbol semanticdb maven . . minimized/ForComprehensions#app(). +// enclosing_symbol scip-java maven . . minimized/ForComprehensions#app(). // kind Variable -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Collections# -// ^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Collections#singletonList(). +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Collections# +// ^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Collections#singletonList(). // ^ reference local 0 // ⌃ enclosing_range_end local 1 // ⌄ enclosing_range_start local 2 @@ -49,7 +50,7 @@ public static int app(int n) { // ^^^^^^ definition local 2 // display_name result // signature_documentation java int result -// enclosing_symbol semanticdb maven . . minimized/ForComprehensions#app(). +// enclosing_symbol scip-java maven . . minimized/ForComprehensions#app(). // kind Variable // ⌃ enclosing_range_end local 2 // ⌄ enclosing_range_start local 3 @@ -57,7 +58,7 @@ public static int app(int n) { // ^ definition local 3 // display_name i // signature_documentation java int i -// enclosing_symbol semanticdb maven . . minimized/ForComprehensions#app(). +// enclosing_symbol scip-java maven . . minimized/ForComprehensions#app(). // kind Variable // ^^^^^^^^ reference local 1 // ⌃ enclosing_range_end local 3 @@ -68,6 +69,6 @@ public static int app(int n) { return result; // ^^^^^^ reference local 2 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/ForComprehensions#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/ForComprehensions#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/ForComprehensions# +//⌃ enclosing_range_end scip-java maven . . minimized/ForComprehensions# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/InnerClasses.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/InnerClasses.java index 90779baed..5a300f7b6 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/InnerClasses.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/InnerClasses.java @@ -1,399 +1,410 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses# +//⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses# public class InnerClasses { -// ^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses# +// ^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses# // display_name InnerClasses // signature_documentation java public class InnerClasses // kind Class -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#exampleField. +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#exampleField. private final int exampleField; -// ^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#exampleField. +// ^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#exampleField. // display_name exampleField // signature_documentation java private final int exampleField // kind Field -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#exampleField. +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#exampleField. -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#STRING. +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#STRING. private static final String STRING = "asdf"; -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^ definition semanticdb maven . . minimized/InnerClasses#STRING. +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^ definition scip-java maven . . minimized/InnerClasses#STRING. // display_name STRING // signature_documentation java private static final String STRING // kind StaticField -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#STRING. +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#STRING. -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#top. +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#top. private static final int top = 5; -// ^^^ definition semanticdb maven . . minimized/InnerClasses#top. +// ^^^ definition scip-java maven . . minimized/InnerClasses#top. // display_name top // signature_documentation java private static final int top // kind StaticField -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#top. -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#bottom. +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#top. +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#bottom. private static final int bottom = 10; -// ^^^^^^ definition semanticdb maven . . minimized/InnerClasses#bottom. +// ^^^^^^ definition scip-java maven . . minimized/InnerClasses#bottom. // display_name bottom // signature_documentation java private static final int bottom // kind StaticField -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#bottom. +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#bottom. -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#``(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#``(). // ⌄ enclosing_range_start local 0 public InnerClasses(int exampleField) { -// ^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#``(). +// ^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#``(). // display_name // signature_documentation java public InnerClasses(int exampleField) // kind Constructor // ^^^^^^^^^^^^ definition local 0 // display_name exampleField // signature_documentation java int exampleField -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#``(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#``(). +// kind Parameter // ⌃ enclosing_range_end local 0 this.exampleField = exampleField; -// ^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#exampleField. +// ^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#exampleField. // ^^^^^^^^^^^^ reference local 0 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#``(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerEnum# +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerEnum# public enum InnerEnum { -// ^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerEnum# +// ^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerEnum# // display_name InnerEnum -// signature_documentation java public enum InnerEnum +// signature_documentation java public static final enum InnerEnum extends Enum // kind Enum -// relationship is_implementation semanticdb maven jdk 11 java/io/Serializable# -// relationship is_implementation semanticdb maven jdk 11 java/lang/Comparable# -// relationship is_implementation semanticdb maven jdk 11 java/lang/Enum# -// ^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerEnum#``(). +// relationship is_implementation scip-java maven jdk 11 java/io/Serializable# +// relationship is_implementation scip-java maven jdk 11 java/lang/Comparable# +// relationship is_implementation scip-java maven jdk 11 java/lang/Enum# +// ^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerEnum#``(). // display_name // signature_documentation java private InnerEnum() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerEnum#A. +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerEnum#A. A, -// ^ definition semanticdb maven . . minimized/InnerClasses#InnerEnum#A. +// ^ definition scip-java maven . . minimized/InnerClasses#InnerEnum#A. // display_name A -// signature_documentation java InnerEnum.A /* ordinal 0 */ -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#``(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerEnum#A. -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerEnum#B. +// signature_documentation java public static final A +// kind EnumMember +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerEnum#A. +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerEnum#B. B, -// ^ definition semanticdb maven . . minimized/InnerClasses#InnerEnum#B. +// ^ definition scip-java maven . . minimized/InnerClasses#InnerEnum#B. // display_name B -// signature_documentation java InnerEnum.B /* ordinal 1 */ -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#``(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerEnum#B. -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerEnum#C. +// signature_documentation java public static final B +// kind EnumMember +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerEnum#B. +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerEnum#C. C -// ^ definition semanticdb maven . . minimized/InnerClasses#InnerEnum#C. +// ^ definition scip-java maven . . minimized/InnerClasses#InnerEnum#C. // display_name C -// signature_documentation java InnerEnum.C /* ordinal 2 */ -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#``(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerEnum#C. +// signature_documentation java public static final C +// kind EnumMember +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerEnum#C. } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerEnum# +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerEnum# -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerInterface# -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerInterface#[A] -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerInterface#[B] +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerInterface# +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerInterface#[A] +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerInterface#[B] public interface InnerInterface { -// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerInterface# +// ^^^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerInterface# // display_name InnerInterface -// signature_documentation java public interface InnerInterface +// signature_documentation java public abstract static interface InnerInterface // kind Interface -// ^ definition semanticdb maven . . minimized/InnerClasses#InnerInterface#[A] +// ^ definition scip-java maven . . minimized/InnerClasses#InnerInterface#[A] // display_name A // signature_documentation java A // kind TypeParameter -// ^ definition semanticdb maven . . minimized/InnerClasses#InnerInterface#[B] +// ^ definition scip-java maven . . minimized/InnerClasses#InnerInterface#[B] // display_name B // signature_documentation java B // kind TypeParameter -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerInterface#apply(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerInterface#apply(). // ⌄ enclosing_range_start local 1 B apply(A a); -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerInterface#[B] -// ^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerInterface#apply(). +// ^ reference scip-java maven . . minimized/InnerClasses#InnerInterface#[B] +// ^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerInterface#apply(). // display_name apply // signature_documentation java public abstract B apply(A a) // kind AbstractMethod -// relationship is_reference is_implementation semanticdb maven . . minimized/InnerClasses#InnerClass#apply(). -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerInterface#[A] +// relationship is_reference is_implementation scip-java maven . . minimized/InnerClasses#InnerClass#apply(). +// ^ reference scip-java maven . . minimized/InnerClasses#InnerInterface#[A] // ^ definition local 1 // display_name a // signature_documentation java A a -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#InnerInterface#apply(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#InnerInterface#apply(). +// kind Parameter // ⌃ enclosing_range_end local 1 -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerInterface#apply(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerInterface#apply(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerInterface# -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerInterface#[A] -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerInterface#[B] +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerInterface# +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerInterface#[A] +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerInterface#[B] -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerAnnotation# +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerAnnotation# public @interface InnerAnnotation { -// ^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerAnnotation# +// ^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerAnnotation# // display_name InnerAnnotation -// signature_documentation java public @interface InnerAnnotation +// signature_documentation java public abstract static @interface InnerAnnotation implements Annotation // kind Interface -// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation# -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerAnnotation#value(). +// relationship is_implementation scip-java maven jdk 11 java/lang/annotation/Annotation# +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerAnnotation#value(). int value(); -// ^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerAnnotation#value(). +// ^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerAnnotation#value(). // display_name value // signature_documentation java public abstract int value() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerAnnotation#value(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerAnnotation#value(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerAnnotation# +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerAnnotation# -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerStaticClass# +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerStaticClass# @SuppressWarnings(STRING + " ") -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -// ^^^^^^ reference semanticdb maven . . minimized/InnerClasses#STRING. +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings# +// ^^^^^^ reference scip-java maven . . minimized/InnerClasses#STRING. @InnerAnnotation(top / bottom) -// ^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerAnnotation# -// ^^^ reference semanticdb maven . . minimized/InnerClasses#top. -// ^^^^^^ reference semanticdb maven . . minimized/InnerClasses#bottom. +// ^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerAnnotation# +// ^^^ reference scip-java maven . . minimized/InnerClasses#top. +// ^^^^^^ reference scip-java maven . . minimized/InnerClasses#bottom. public static class InnerStaticClass { -// ^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerStaticClass# +// ^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerStaticClass# // display_name InnerStaticClass -// signature_documentation java @SuppressWarnings(STRING + " ")\n@InnerAnnotation(top / bottom)\npublic static class InnerStaticClass +// signature_documentation java @SuppressWarnings\n@InnerAnnotation\npublic static class InnerStaticClass // kind Class -// ^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerStaticClass#``(). +// ^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerStaticClass#``(). // display_name // signature_documentation java public InnerStaticClass() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerStaticClass#innerStaticMethod(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerStaticClass#innerStaticMethod(). public static void innerStaticMethod() {} -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerStaticClass#innerStaticMethod(). +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerStaticClass#innerStaticMethod(). // display_name innerStaticMethod // signature_documentation java public static void innerStaticMethod() // kind StaticMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerStaticClass#innerStaticMethod(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerStaticClass#innerStaticMethod(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerStaticClass# +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerStaticClass# -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerClass# +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerClass# public class InnerClass implements InnerInterface { -// ^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerClass# +// ^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerClass# // display_name InnerClass -// signature_documentation java public class InnerClass +// signature_documentation java public class InnerClass implements InnerInterface // kind Class -// relationship is_implementation semanticdb maven . . minimized/InnerClasses#InnerInterface# -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerInterface# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerClass#field. +// relationship is_implementation scip-java maven . . minimized/InnerClasses#InnerInterface# +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerInterface# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerClass#field. private final int field; -// ^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerClass#field. +// ^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerClass#field. // display_name field // signature_documentation java private final int field // kind Field -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerClass#field. +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerClass#field. -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerClass#``(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerClass#``(). // ⌄ enclosing_range_start local 2 public InnerClass(int field) { -// ^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerClass#``(). +// ^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerClass#``(). // display_name // signature_documentation java public InnerClass(int field) // kind Constructor // ^^^^^ definition local 2 // display_name field // signature_documentation java int field -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#InnerClass#``(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#InnerClass#``(). +// kind Parameter // ⌃ enclosing_range_end local 2 this.field = field; -// ^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerClass#field. +// ^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerClass#field. // ^^^^^ reference local 2 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerClass#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerClass#``(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerClass#innerMethod(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerClass#innerMethod(). public void innerMethod() { -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerClass#innerMethod(). +// ^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerClass#innerMethod(). // display_name innerMethod // signature_documentation java public void innerMethod() // kind Method System.out.println(field + exampleField); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+3). -// ^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerClass#field. -// ^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#exampleField. +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+3). +// ^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerClass#field. +// ^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#exampleField. } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerClass#innerMethod(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerClass#innerMethod(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#InnerClass#apply(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#InnerClass#apply(). @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# // ⌄ enclosing_range_start local 3 public Integer apply(Integer integer) { -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# -// ^^^^^ definition semanticdb maven . . minimized/InnerClasses#InnerClass#apply(). +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# +// ^^^^^ definition scip-java maven . . minimized/InnerClasses#InnerClass#apply(). // display_name apply // signature_documentation java @Override\npublic Integer apply(Integer integer) // kind Method -// relationship is_reference is_implementation semanticdb maven . . minimized/InnerClasses#InnerInterface#apply(). -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# +// relationship is_reference is_implementation scip-java maven . . minimized/InnerClasses#InnerInterface#apply(). +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# // ^^^^^^^ definition local 3 // display_name integer // signature_documentation java Integer integer -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#InnerClass#apply(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#InnerClass#apply(). +// kind Parameter // ⌃ enclosing_range_end local 3 return field * integer; -// ^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerClass#field. +// ^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerClass#field. // ^^^^^^^ reference local 3 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerClass#apply(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerClass#apply(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#InnerClass# +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#InnerClass# -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#runInnerInterface().[A] -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#runInnerInterface().[B] -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#runInnerInterface(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#runInnerInterface(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#runInnerInterface().[A] +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#runInnerInterface().[B] // ⌄ enclosing_range_start local 4 // ⌄ enclosing_range_start local 5 private static B runInnerInterface(InnerInterface fn, A a) { -// ^ definition semanticdb maven . . minimized/InnerClasses#runInnerInterface().[A] +// ^ definition scip-java maven . . minimized/InnerClasses#runInnerInterface().[A] // display_name A // signature_documentation java A // kind TypeParameter -// ^ definition semanticdb maven . . minimized/InnerClasses#runInnerInterface().[B] +// ^ definition scip-java maven . . minimized/InnerClasses#runInnerInterface().[B] // display_name B // signature_documentation java B // kind TypeParameter -// ^ reference semanticdb maven . . minimized/InnerClasses#runInnerInterface().[B] -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#runInnerInterface(). +// ^ reference scip-java maven . . minimized/InnerClasses#runInnerInterface().[B] +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#runInnerInterface(). // display_name runInnerInterface // signature_documentation java private static B runInnerInterface(InnerInterface fn, A a) // kind StaticMethod -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerInterface# -// ^ reference semanticdb maven . . minimized/InnerClasses#runInnerInterface().[A] -// ^ reference semanticdb maven . . minimized/InnerClasses#runInnerInterface().[B] +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerInterface# +// ^ reference scip-java maven . . minimized/InnerClasses#runInnerInterface().[A] +// ^ reference scip-java maven . . minimized/InnerClasses#runInnerInterface().[B] // ^^ definition local 4 // display_name fn // signature_documentation java InnerInterface fn -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#runInnerInterface(). -// ^ reference semanticdb maven . . minimized/InnerClasses#runInnerInterface().[A] +// enclosing_symbol scip-java maven . . minimized/InnerClasses#runInnerInterface(). +// kind Parameter +// ^ reference scip-java maven . . minimized/InnerClasses#runInnerInterface().[A] // ^ definition local 5 // display_name a // signature_documentation java A a -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#runInnerInterface(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#runInnerInterface(). +// kind Parameter // ⌃ enclosing_range_end local 4 // ⌃ enclosing_range_end local 5 return fn.apply(a); // ^^ reference local 4 -// ^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerInterface#apply(). +// ^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerInterface#apply(). // ^ reference local 5 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#runInnerInterface().[A] -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#runInnerInterface().[B] -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#runInnerInterface(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#runInnerInterface(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#runInnerInterface().[A] +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#runInnerInterface().[B] -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#testEnum(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#testEnum(). // ⌄ enclosing_range_start local 6 public static void testEnum(InnerEnum magicEnum) { -// ^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#testEnum(). +// ^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#testEnum(). // display_name testEnum // signature_documentation java public static void testEnum(InnerEnum magicEnum) // kind StaticMethod -// ^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum# +// ^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerEnum# // ^^^^^^^^^ definition local 6 // display_name magicEnum // signature_documentation java InnerEnum magicEnum -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#testEnum(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#testEnum(). +// kind Parameter // ⌃ enclosing_range_end local 6 if (System.nanoTime() > System.currentTimeMillis()) { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/System#nanoTime(). -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/System#currentTimeMillis(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/System#nanoTime(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/System#currentTimeMillis(). magicEnum = InnerEnum.B; // ^^^^^^^^^ reference local 6 -// ^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum# -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#B. +// ^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerEnum# +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#B. } switch (magicEnum) { // ^^^^^^^^^ reference local 6 case B: -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#B. +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#B. System.out.println("b"); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+8). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+8). break; case A: -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#A. +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#A. System.out.println("a"); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+8). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+8). break; default: break; } if (magicEnum == InnerEnum.A) System.out.println("a"); // ^^^^^^^^^ reference local 6 -// ^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum# -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#A. -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+8). +// ^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerEnum# +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#A. +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+8). else if (magicEnum == InnerEnum.C) System.out.println("b"); // ^^^^^^^^^ reference local 6 -// ^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum# -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#C. -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+8). +// ^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerEnum# +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#C. +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+8). else System.out.println("c"); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+8). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+8). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#testEnum(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#testEnum(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#testAnon(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#testAnon(). public static void testAnon() { -// ^^^^^^^^ definition semanticdb maven . . minimized/InnerClasses#testAnon(). +// ^^^^^^^^ definition scip-java maven . . minimized/InnerClasses#testAnon(). // display_name testAnon // signature_documentation java public static void testAnon() // kind StaticMethod // ⌄ enclosing_range_start local 7 InnerInterface fn = -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerInterface# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerInterface# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^ definition local 7 // display_name fn // signature_documentation java InnerInterface fn -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#testAnon(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#testAnon(). // kind Variable new InnerInterface() { -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerInterface# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerInterface# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ⌄ enclosing_range_start local 9 @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# // ⌄ enclosing_range_start local 10 public String apply(String s) { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^^^^ definition local 9 // display_name apply // signature_documentation java @Override\npublic String apply(String s) // enclosing_symbol local 8 // kind Method -// relationship is_reference is_implementation semanticdb maven . . minimized/InnerClasses#InnerInterface#apply(). -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// relationship is_reference is_implementation scip-java maven . . minimized/InnerClasses#InnerInterface#apply(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^ definition local 10 // display_name s // signature_documentation java String s // enclosing_symbol local 9 +// kind Parameter // ⌃ enclosing_range_end local 10 return s + "b"; // ^ reference local 10 @@ -402,18 +413,18 @@ public String apply(String s) { }; // ⌃ enclosing_range_end local 7 System.out.println(fn.apply("a")); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+8). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+8). // ^^ reference local 7 -// ^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerInterface#apply(). +// ^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerInterface#apply(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#testAnon(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#testAnon(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/InnerClasses#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/InnerClasses#app(). public static String app() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/InnerClasses#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/InnerClasses#app(). // display_name app // signature_documentation java public static String app() // kind StaticMethod @@ -422,53 +433,53 @@ public static String app() { // ^ definition local 11 // display_name a // signature_documentation java int a -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#app(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#app(). // kind Variable // ⌃ enclosing_range_end local 11 InnerStaticClass.innerStaticMethod(); -// ^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerStaticClass# -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerStaticClass#innerStaticMethod(). +// ^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerStaticClass# +// ^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerStaticClass#innerStaticMethod(). // ⌄ enclosing_range_start local 12 InnerClasses innerClasses = new InnerClasses(a); -// ^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses# +// ^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses# // ^^^^^^^^^^^^ definition local 12 // display_name innerClasses // signature_documentation java InnerClasses innerClasses -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#app(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#app(). // kind Variable -// ^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#``(). +// ^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#``(). // ^ reference local 11 // ⌃ enclosing_range_end local 12 // ⌄ enclosing_range_start local 13 InnerClass innerClass = innerClasses.new InnerClass(a); -// ^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerClass# +// ^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerClass# // ^^^^^^^^^^ definition local 13 // display_name innerClass // signature_documentation java InnerClass innerClass -// enclosing_symbol semanticdb maven . . minimized/InnerClasses#app(). +// enclosing_symbol scip-java maven . . minimized/InnerClasses#app(). // kind Variable // ^^^^^^^^^^^^ reference local 12 -// ^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerClass#``(). +// ^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerClass#``(). // ^ reference local 11 // ⌃ enclosing_range_end local 13 innerClass.innerMethod(); // ^^^^^^^^^^ reference local 13 -// ^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerClass#innerMethod(). +// ^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerClass#innerMethod(). System.out.println(runInnerInterface(innerClass, a)); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+9). -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#runInnerInterface(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+9). +// ^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#runInnerInterface(). // ^^^^^^^^^^ reference local 13 // ^ reference local 11 testEnum(InnerEnum.A); -// ^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#testEnum(). -// ^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum# -// ^ reference semanticdb maven . . minimized/InnerClasses#InnerEnum#A. +// ^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#testEnum(). +// ^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#InnerEnum# +// ^ reference scip-java maven . . minimized/InnerClasses#InnerEnum#A. testAnon(); -// ^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses#testAnon(). +// ^^^^^^^^ reference scip-java maven . . minimized/InnerClasses#testAnon(). return ""; } -// ⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/InnerClasses# +//⌃ enclosing_range_end scip-java maven . . minimized/InnerClasses# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Interfaces.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Interfaces.java index 544af797d..a4ade2095 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Interfaces.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Interfaces.java @@ -1,83 +1,83 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/Interfaces# +//⌄ enclosing_range_start scip-java maven . . minimized/Interfaces# public interface Interfaces { -// ^^^^^^^^^^ definition semanticdb maven . . minimized/Interfaces# +// ^^^^^^^^^^ definition scip-java maven . . minimized/Interfaces# // display_name Interfaces -// signature_documentation java public interface Interfaces +// signature_documentation java public abstract interface Interfaces // kind Interface -// ⌄ enclosing_range_start semanticdb maven . . minimized/Interfaces#staticInterfaceMethod(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Interfaces#staticInterfaceMethod(). static void staticInterfaceMethod() {} -// ^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Interfaces#staticInterfaceMethod(). +// ^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Interfaces#staticInterfaceMethod(). // display_name staticInterfaceMethod // signature_documentation java public static void staticInterfaceMethod() // kind StaticMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Interfaces#staticInterfaceMethod(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Interfaces#staticInterfaceMethod(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Interfaces#abstractInterfaceMethod(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Interfaces#abstractInterfaceMethod(). String abstractInterfaceMethod(); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Interfaces#abstractInterfaceMethod(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Interfaces#abstractInterfaceMethod(). // display_name abstractInterfaceMethod // signature_documentation java public abstract String abstractInterfaceMethod() // kind AbstractMethod -// relationship is_reference is_implementation semanticdb maven . . minimized/SubClasses#abstractInterfaceMethod(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/Interfaces#abstractInterfaceMethod(). +// relationship is_reference is_implementation scip-java maven . . minimized/SubClasses#abstractInterfaceMethod(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Interfaces#abstractInterfaceMethod(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Interfaces#defaultInterfaceMethod(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Interfaces#defaultInterfaceMethod(). default String defaultInterfaceMethod() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Interfaces#defaultInterfaceMethod(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Interfaces#defaultInterfaceMethod(). // display_name defaultInterfaceMethod // signature_documentation java public default String defaultInterfaceMethod() // kind Method return "default"; } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Interfaces#defaultInterfaceMethod(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Interfaces#defaultInterfaceMethod(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Interfaces# +//⌃ enclosing_range_end scip-java maven . . minimized/Interfaces# -//⌄ enclosing_range_start semanticdb maven . . minimized/BookService# +//⌄ enclosing_range_start scip-java maven . . minimized/BookService# interface BookService { -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/BookService# +// ^^^^^^^^^^^ definition scip-java maven . . minimized/BookService# // display_name BookService -// signature_documentation java interface BookService +// signature_documentation java abstract interface BookService // kind Interface -// ⌄ enclosing_range_start semanticdb maven . . minimized/BookService#checkPages(). +// ⌄ enclosing_range_start scip-java maven . . minimized/BookService#checkPages(). void checkPages(); -// ^^^^^^^^^^ definition semanticdb maven . . minimized/BookService#checkPages(). +// ^^^^^^^^^^ definition scip-java maven . . minimized/BookService#checkPages(). // display_name checkPages // signature_documentation java public abstract void checkPages() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/BookService#checkPages(). +// ⌃ enclosing_range_end scip-java maven . . minimized/BookService#checkPages(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/BookService# +//⌃ enclosing_range_end scip-java maven . . minimized/BookService# -//⌄ enclosing_range_start semanticdb maven . . minimized/MyService# +//⌄ enclosing_range_start scip-java maven . . minimized/MyService# interface MyService { -// ^^^^^^^^^ definition semanticdb maven . . minimized/MyService# +// ^^^^^^^^^ definition scip-java maven . . minimized/MyService# // display_name MyService -// signature_documentation java interface MyService +// signature_documentation java abstract interface MyService // kind Interface -// ⌄ enclosing_range_start semanticdb maven . . minimized/MyService#bookService(). +// ⌄ enclosing_range_start scip-java maven . . minimized/MyService#bookService(). BookService bookService(); -// ^^^^^^^^^^^ reference semanticdb maven . . minimized/BookService# -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/MyService#bookService(). +// ^^^^^^^^^^^ reference scip-java maven . . minimized/BookService# +// ^^^^^^^^^^^ definition scip-java maven . . minimized/MyService#bookService(). // display_name bookService // signature_documentation java public abstract BookService bookService() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/MyService#bookService(). +// ⌃ enclosing_range_end scip-java maven . . minimized/MyService#bookService(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/MyService#example(). +// ⌄ enclosing_range_start scip-java maven . . minimized/MyService#example(). default void example() { -// ^^^^^^^ definition semanticdb maven . . minimized/MyService#example(). +// ^^^^^^^ definition scip-java maven . . minimized/MyService#example(). // display_name example // signature_documentation java public default void example() // kind Method bookService().checkPages(); -// ^^^^^^^^^^^ reference semanticdb maven . . minimized/MyService#bookService(). -// ^^^^^^^^^^ reference semanticdb maven . . minimized/BookService#checkPages(). +// ^^^^^^^^^^^ reference scip-java maven . . minimized/MyService#bookService(). +// ^^^^^^^^^^ reference scip-java maven . . minimized/BookService#checkPages(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/MyService#example(). +// ⌃ enclosing_range_end scip-java maven . . minimized/MyService#example(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/MyService# +//⌃ enclosing_range_end scip-java maven . . minimized/MyService# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/LombokBuilder.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/LombokBuilder.java index 20e09be4a..37279344a 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/LombokBuilder.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/LombokBuilder.java @@ -1,131 +1,99 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello#HelloBuilder#build(). -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello#builder(). -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello#HelloBuilder#toString(). -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello#HelloBuilder# -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello#HelloBuilder#``(). -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello# -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello#``(). +//⌄ enclosing_range_start scip-java maven . . minimized/Hello# +//⌄ enclosing_range_start scip-java maven . . minimized/Hello#``(). //⌄ enclosing_range_start local 0 -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello#HelloBuilder#message. -//⌄ enclosing_range_start semanticdb maven . . minimized/Hello#HelloBuilder#message(). +//⌄ enclosing_range_start scip-java maven . . minimized/Hello#HelloBuilder# +//⌄ enclosing_range_start scip-java maven . . minimized/Hello#HelloBuilder#message. +//⌄ enclosing_range_start scip-java maven . . minimized/Hello#HelloBuilder#``(). +//⌄ enclosing_range_start scip-java maven . . minimized/Hello#HelloBuilder#message(). //⌄ enclosing_range_start local 1 +//⌄ enclosing_range_start scip-java maven . . minimized/Hello#HelloBuilder#build(). +//⌄ enclosing_range_start scip-java maven . . minimized/Hello#HelloBuilder#toString(). +//⌄ enclosing_range_start scip-java maven . . minimized/Hello#builder(). @lombok.Builder //^^^^^^^^^^^^^^^ reference local 0 //^^^^^^^^^^^^^^^ reference local 1 -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . java/lang/ -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello# -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello# -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello# -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello#HelloBuilder# -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello#HelloBuilder# -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello#HelloBuilder#message. -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello#HelloBuilder#message. -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello#HelloBuilder#message. -//^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Hello#message. -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#value(). -//^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings#value(). -// ^^^^^ reference semanticdb maven . . lombok/ -// ^^^^^^^ reference semanticdb maven . . lombok/Builder# -// definition semanticdb maven . . minimized/Hello#HelloBuilder#build(). 1:4 +//^^^^^^^^^^^^^^^ reference scip-java maven . . java/ +//^^^^^^^^^^^^^^^ reference scip-java maven . . java/lang/ +//^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Hello# +//^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Hello#HelloBuilder# +//^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Hello#HelloBuilder#message. +//^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Hello#message. +//^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# +//^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/String# +//^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings# +//^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings#value(). +// ^^^^^ reference scip-java maven . . lombok/ +// ^^^^^^^ reference scip-java maven . . lombok/Builder# +// definition scip-java maven . . minimized/Hello#HelloBuilder#build(). 1:4 // display_name build -// signature_documentation java @SuppressWarnings("all")\npublic Hello build() +// signature_documentation java @SuppressWarnings\npublic Hello build() // kind Method -// definition semanticdb maven . . minimized/Hello#builder(). 1:6 +// definition scip-java maven . . minimized/Hello#builder(). 1:6 // display_name builder -// signature_documentation java @SuppressWarnings("all")\npublic static HelloBuilder builder() +// signature_documentation java @SuppressWarnings\npublic static HelloBuilder builder() // kind StaticMethod -// definition semanticdb maven . . minimized/Hello#HelloBuilder#toString(). 1:7 +// definition scip-java maven . . minimized/Hello#HelloBuilder#toString(). 1:7 // display_name toString -// signature_documentation java @Override\n@SuppressWarnings("all")\npublic String toString() +// signature_documentation java @Override\n@SuppressWarnings\npublic String toString() // kind Method -// relationship is_reference is_implementation semanticdb maven jdk 11 java/lang/Object#toString(). -// definition semanticdb maven . . minimized/Hello#HelloBuilder# 1:11 +// relationship is_reference is_implementation scip-java maven jdk 11 java/lang/Object#toString(). +// definition scip-java maven . . minimized/Hello#HelloBuilder# 1:11 // display_name HelloBuilder -// signature_documentation java @SuppressWarnings("all")\npublic static class HelloBuilder +// signature_documentation java @SuppressWarnings\npublic static class HelloBuilder // kind Class -// definition semanticdb maven . . minimized/Hello#HelloBuilder#``(). 1:11 +// definition scip-java maven . . minimized/Hello#HelloBuilder#``(). 1:11 // display_name -// signature_documentation java @SuppressWarnings("all")\nHelloBuilder() +// signature_documentation java @SuppressWarnings\nHelloBuilder() // kind Constructor -// reference semanticdb maven . . minimized/Hello#HelloBuilder#``(). 1:11 -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#HelloBuilder#build(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#builder(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#HelloBuilder#toString(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#HelloBuilder# -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#HelloBuilder#``(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#``(). +// reference scip-java maven . . minimized/Hello#HelloBuilder#``(). 1:11 +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#``(). // ⌃ enclosing_range_end local 0 -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#HelloBuilder#message. -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#HelloBuilder#message(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#HelloBuilder# +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#HelloBuilder#message. +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#HelloBuilder#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#HelloBuilder#message(). // ⌃ enclosing_range_end local 1 +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#HelloBuilder#build(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#HelloBuilder#toString(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#builder(). class Hello { -// ^^^^^ definition semanticdb maven . . minimized/Hello# +// ^^^^^ definition scip-java maven . . minimized/Hello# // display_name Hello // signature_documentation java @Builder\nclass Hello // kind Class -// ^^^^^ definition semanticdb maven . . minimized/Hello#``(). +// ^^^^^ definition scip-java maven . . minimized/Hello#``(). // display_name -// signature_documentation java @SuppressWarnings("all")\nHello(String message) +// signature_documentation java @SuppressWarnings\nHello(String message) // kind Constructor -// ^^^^^ reference semanticdb maven . . minimized/Hello#``(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Hello#message. +// ^^^^^ reference scip-java maven . . minimized/Hello#``(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Hello#message. private String message; -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^^^^^^ definition local 0 // display_name message // signature_documentation java final String message -// enclosing_symbol semanticdb maven . . minimized/Hello#``(). +// enclosing_symbol scip-java maven . . minimized/Hello#``(). +// kind Parameter // ^^^^^^^ definition local 1 // display_name message // signature_documentation java final String message -// enclosing_symbol semanticdb maven . . minimized/Hello#HelloBuilder#message(). -// ^^^^^^^ definition semanticdb maven . . minimized/Hello#HelloBuilder#message(). +// enclosing_symbol scip-java maven . . minimized/Hello#HelloBuilder#message(). +// kind Parameter +// ^^^^^^^ definition scip-java maven . . minimized/Hello#HelloBuilder#message(). // display_name message -// signature_documentation java @SuppressWarnings("all")\npublic HelloBuilder message(String message) +// signature_documentation java @SuppressWarnings\npublic HelloBuilder message(String message) // kind Method // documentation @return {@code this}. -// ^^^^^^^ definition semanticdb maven . . minimized/Hello#HelloBuilder#message. +// ^^^^^^^ definition scip-java maven . . minimized/Hello#HelloBuilder#message. // display_name message -// signature_documentation java @SuppressWarnings("all")\nprivate String message +// signature_documentation java @SuppressWarnings\nprivate String message // kind Field -// ^^^^^^^ definition semanticdb maven . . minimized/Hello#message. +// ^^^^^^^ definition scip-java maven . . minimized/Hello#message. // display_name message // signature_documentation java private String message // kind Field -// ⌃ enclosing_range_end semanticdb maven . . minimized/Hello#message. +// ⌃ enclosing_range_end scip-java maven . . minimized/Hello#message. } -//⌃ enclosing_range_end semanticdb maven . . minimized/Hello# +//⌃ enclosing_range_end scip-java maven . . minimized/Hello# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Methods.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Methods.java index a7c2528aa..ec5bfefaf 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Methods.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Methods.java @@ -1,138 +1,144 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/Methods# +//⌄ enclosing_range_start scip-java maven . . minimized/Methods# public class Methods { -// ^^^^^^^ definition semanticdb maven . . minimized/Methods# +// ^^^^^^^ definition scip-java maven . . minimized/Methods# // display_name Methods // signature_documentation java public class Methods // kind Class -// ^^^^^^^ definition semanticdb maven . . minimized/Methods#``(). +// ^^^^^^^ definition scip-java maven . . minimized/Methods#``(). // display_name // signature_documentation java public Methods() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/Methods#overload(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Methods#overload(). // ⌄ enclosing_range_start local 0 private int overload(int value) { -// ^^^^^^^^ definition semanticdb maven . . minimized/Methods#overload(). +// ^^^^^^^^ definition scip-java maven . . minimized/Methods#overload(). // display_name overload // signature_documentation java private int overload(int value) // kind Method // ^^^^^ definition local 0 // display_name value // signature_documentation java int value -// enclosing_symbol semanticdb maven . . minimized/Methods#overload(). +// enclosing_symbol scip-java maven . . minimized/Methods#overload(). +// kind Parameter // ⌃ enclosing_range_end local 0 return value + 1; // ^^^^^ reference local 0 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Methods#overload(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Methods#overload(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Methods#overload(+1). +// ⌄ enclosing_range_start scip-java maven . . minimized/Methods#overload(+1). // ⌄ enclosing_range_start local 1 private String overload(String value) { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^^ definition semanticdb maven . . minimized/Methods#overload(+1). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^^ definition scip-java maven . . minimized/Methods#overload(+1). // display_name overload // signature_documentation java private String overload(String value) // kind Method -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^^^^ definition local 1 // display_name value // signature_documentation java String value -// enclosing_symbol semanticdb maven . . minimized/Methods#overload(+1). +// enclosing_symbol scip-java maven . . minimized/Methods#overload(+1). +// kind Parameter // ⌃ enclosing_range_end local 1 return value + "1"; // ^^^^^ reference local 1 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Methods#overload(+1). +// ⌃ enclosing_range_end scip-java maven . . minimized/Methods#overload(+1). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Methods#staticOverload(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Methods#staticOverload(). // ⌄ enclosing_range_start local 2 private static int staticOverload(int value) { -// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Methods#staticOverload(). +// ^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Methods#staticOverload(). // display_name staticOverload // signature_documentation java private static int staticOverload(int value) // kind StaticMethod // ^^^^^ definition local 2 // display_name value // signature_documentation java int value -// enclosing_symbol semanticdb maven . . minimized/Methods#staticOverload(). +// enclosing_symbol scip-java maven . . minimized/Methods#staticOverload(). +// kind Parameter // ⌃ enclosing_range_end local 2 return value + 1; // ^^^^^ reference local 2 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Methods#staticOverload(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Methods#staticOverload(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Methods#staticOverload(+1). +// ⌄ enclosing_range_start scip-java maven . . minimized/Methods#staticOverload(+1). // ⌄ enclosing_range_start local 3 private static String staticOverload(String value) { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/Methods#staticOverload(+1). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^ definition scip-java maven . . minimized/Methods#staticOverload(+1). // display_name staticOverload // signature_documentation java private static String staticOverload(String value) // kind StaticMethod -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^^^^ definition local 3 // display_name value // signature_documentation java String value -// enclosing_symbol semanticdb maven . . minimized/Methods#staticOverload(+1). +// enclosing_symbol scip-java maven . . minimized/Methods#staticOverload(+1). +// kind Parameter // ⌃ enclosing_range_end local 3 return value + "1"; // ^^^^^ reference local 3 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Methods#staticOverload(+1). +// ⌃ enclosing_range_end scip-java maven . . minimized/Methods#staticOverload(+1). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Methods#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Methods#app(). // ⌄ enclosing_range_start local 4 // ⌄ enclosing_range_start local 5 public static String app(int n, String m) throws RuntimeException, IndexOutOfBoundsException { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/Methods#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/Methods#app(). // display_name app // signature_documentation java public static String app(int n, String m) throws RuntimeException, IndexOutOfBoundsException // kind StaticMethod // ^ definition local 4 // display_name n // signature_documentation java int n -// enclosing_symbol semanticdb maven . . minimized/Methods#app(). -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// enclosing_symbol scip-java maven . . minimized/Methods#app(). +// kind Parameter +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^ definition local 5 // display_name m // signature_documentation java String m -// enclosing_symbol semanticdb maven . . minimized/Methods#app(). -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/RuntimeException# -// ^^^^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/IndexOutOfBoundsException# +// enclosing_symbol scip-java maven . . minimized/Methods#app(). +// kind Parameter +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/RuntimeException# +// ^^^^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/IndexOutOfBoundsException# // ⌃ enclosing_range_end local 4 // ⌃ enclosing_range_end local 5 // ⌄ enclosing_range_start local 6 Methods methods = new Methods(); -// ^^^^^^^ reference semanticdb maven . . minimized/Methods# +// ^^^^^^^ reference scip-java maven . . minimized/Methods# // ^^^^^^^ definition local 6 // display_name methods // signature_documentation java Methods methods -// enclosing_symbol semanticdb maven . . minimized/Methods#app(). +// enclosing_symbol scip-java maven . . minimized/Methods#app(). // kind Variable -// ^^^^^^^ reference semanticdb maven . . minimized/Methods#``(). +// ^^^^^^^ reference scip-java maven . . minimized/Methods#``(). // ⌃ enclosing_range_end local 6 // ⌄ enclosing_range_start local 7 int a = staticOverload(n); // ^ definition local 7 // display_name a // signature_documentation java int a -// enclosing_symbol semanticdb maven . . minimized/Methods#app(). +// enclosing_symbol scip-java maven . . minimized/Methods#app(). // kind Variable -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Methods#staticOverload(). +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Methods#staticOverload(). // ^ reference local 4 // ⌃ enclosing_range_end local 7 // ⌄ enclosing_range_start local 8 String b = staticOverload(m); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^ definition local 8 // display_name b // signature_documentation java String b -// enclosing_symbol semanticdb maven . . minimized/Methods#app(). +// enclosing_symbol scip-java maven . . minimized/Methods#app(). // kind Variable -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Methods#staticOverload(+1). +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Methods#staticOverload(+1). // ^ reference local 5 // ⌃ enclosing_range_end local 8 // ⌄ enclosing_range_start local 9 @@ -140,22 +146,22 @@ public static String app(int n, String m) throws RuntimeException, IndexOutOfBou // ^ definition local 9 // display_name c // signature_documentation java int c -// enclosing_symbol semanticdb maven . . minimized/Methods#app(). +// enclosing_symbol scip-java maven . . minimized/Methods#app(). // kind Variable // ^^^^^^^ reference local 6 -// ^^^^^^^^ reference semanticdb maven . . minimized/Methods#overload(). +// ^^^^^^^^ reference scip-java maven . . minimized/Methods#overload(). // ^ reference local 4 // ⌃ enclosing_range_end local 9 // ⌄ enclosing_range_start local 10 String d = methods.overload(m); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^ definition local 10 // display_name d // signature_documentation java String d -// enclosing_symbol semanticdb maven . . minimized/Methods#app(). +// enclosing_symbol scip-java maven . . minimized/Methods#app(). // kind Variable // ^^^^^^^ reference local 6 -// ^^^^^^^^ reference semanticdb maven . . minimized/Methods#overload(+1). +// ^^^^^^^^ reference scip-java maven . . minimized/Methods#overload(+1). // ^ reference local 5 // ⌃ enclosing_range_end local 10 return b + a + c + d; @@ -164,6 +170,6 @@ public static String app(int n, String m) throws RuntimeException, IndexOutOfBou // ^ reference local 9 // ^ reference local 10 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Methods#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Methods#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Methods# +//⌃ enclosing_range_end scip-java maven . . minimized/Methods# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/MinimizedJavaMain.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/MinimizedJavaMain.java index c6d47949f..bcb98b329 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/MinimizedJavaMain.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/MinimizedJavaMain.java @@ -1,81 +1,82 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/MinimizedJavaMain# +//⌄ enclosing_range_start scip-java maven . . minimized/MinimizedJavaMain# @Annotations(value = "value", format = "format") -// ^^^^^^^^^^ reference semanticdb maven . . minimized/Annotations# -// ^^^^^ reference semanticdb maven . . minimized/Annotations#value(). -// ^^^^^^ reference semanticdb maven . . minimized/Annotations#format(). +// ^^^^^^^^^^ reference scip-java maven . . minimized/Annotations# +// ^^^^^ reference scip-java maven . . minimized/Annotations#value(). +// ^^^^^^ reference scip-java maven . . minimized/Annotations#format(). public class MinimizedJavaMain { -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/MinimizedJavaMain# +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/MinimizedJavaMain# // display_name MinimizedJavaMain -// signature_documentation java @Annotations(value = "value", format = "format")\npublic class MinimizedJavaMain +// signature_documentation java @Annotations\npublic class MinimizedJavaMain // kind Class -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/MinimizedJavaMain#``(). +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/MinimizedJavaMain#``(). // display_name // signature_documentation java public MinimizedJavaMain() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/MinimizedJavaMain#main(). +// ⌄ enclosing_range_start scip-java maven . . minimized/MinimizedJavaMain#main(). // ⌄ enclosing_range_start local 0 public static void main(String[] args) { -// ^^^^ definition semanticdb maven . . minimized/MinimizedJavaMain#main(). +// ^^^^ definition scip-java maven . . minimized/MinimizedJavaMain#main(). // display_name main // signature_documentation java public static void main(String[] args) // kind StaticMethod -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^^^ definition local 0 // display_name args // signature_documentation java String[] args -// enclosing_symbol semanticdb maven . . minimized/MinimizedJavaMain#main(). +// enclosing_symbol scip-java maven . . minimized/MinimizedJavaMain#main(). +// kind Parameter // ⌃ enclosing_range_end local 0 TypeVariables.app(new TypeVariables.CT()); -// ^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeVariables# -// ^^^ reference semanticdb maven . . minimized/TypeVariables#app(). -// ^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeVariables# -// ^^ reference semanticdb maven . . minimized/TypeVariables#CT#``(). +// ^^^^^^^^^^^^^ reference scip-java maven . . minimized/TypeVariables# +// ^^^ reference scip-java maven . . minimized/TypeVariables#app(). +// ^^^^^^^^^^^^^ reference scip-java maven . . minimized/TypeVariables# +// ^^ reference scip-java maven . . minimized/TypeVariables#CT#``(). System.out.println( -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+8). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+8). Methods.app(42, "42") -// ^^^^^^^ reference semanticdb maven . . minimized/Methods# -// ^^^ reference semanticdb maven . . minimized/Methods#app(). +// ^^^^^^^ reference scip-java maven . . minimized/Methods# +// ^^^ reference scip-java maven . . minimized/Methods#app(). + Enums.app() -// ^^^^^ reference semanticdb maven . . minimized/Enums# -// ^^^ reference semanticdb maven . . minimized/Enums#app(). +// ^^^^^ reference scip-java maven . . minimized/Enums# +// ^^^ reference scip-java maven . . minimized/Enums#app(). + Docstrings.app() -// ^^^^^^^^^^ reference semanticdb maven . . minimized/Docstrings# -// ^^^ reference semanticdb maven . . minimized/Docstrings#app(). +// ^^^^^^^^^^ reference scip-java maven . . minimized/Docstrings# +// ^^^ reference scip-java maven . . minimized/Docstrings#app(). + InnerClasses.app() -// ^^^^^^^^^^^^ reference semanticdb maven . . minimized/InnerClasses# -// ^^^ reference semanticdb maven . . minimized/InnerClasses#app(). +// ^^^^^^^^^^^^ reference scip-java maven . . minimized/InnerClasses# +// ^^^ reference scip-java maven . . minimized/InnerClasses#app(). + ForComprehensions.app(42) -// ^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/ForComprehensions# -// ^^^ reference semanticdb maven . . minimized/ForComprehensions#app(). +// ^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/ForComprehensions# +// ^^^ reference scip-java maven . . minimized/ForComprehensions#app(). + AnonymousClasses.app(42) -// ^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AnonymousClasses# -// ^^^ reference semanticdb maven . . minimized/AnonymousClasses#app(). +// ^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/AnonymousClasses# +// ^^^ reference scip-java maven . . minimized/AnonymousClasses#app(). + Primitives.app() -// ^^^^^^^^^^ reference semanticdb maven . . minimized/Primitives# -// ^^^ reference semanticdb maven . . minimized/Primitives#app(). +// ^^^^^^^^^^ reference scip-java maven . . minimized/Primitives# +// ^^^ reference scip-java maven . . minimized/Primitives#app(). + new ParameterizedTypes().app(42, "42") -// ^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/ParameterizedTypes#``(). -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ reference semanticdb maven . . minimized/ParameterizedTypes#app(). +// ^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/ParameterizedTypes#``(). +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ reference scip-java maven . . minimized/ParameterizedTypes#app(). + RawTypes.x.toString() -// ^^^^^^^^ reference semanticdb maven . . minimized/RawTypes# -// ^ reference semanticdb maven . . minimized/RawTypes#x. -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Object#toString(). +// ^^^^^^^^ reference scip-java maven . . minimized/RawTypes# +// ^ reference scip-java maven . . minimized/RawTypes#x. +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Object#toString(). + ClassOf.app() -// ^^^^^^^ reference semanticdb maven . . minimized/ClassOf# -// ^^^ reference semanticdb maven . . minimized/ClassOf#app(). +// ^^^^^^^ reference scip-java maven . . minimized/ClassOf# +// ^^^ reference scip-java maven . . minimized/ClassOf#app(). + SubClasses.app() -// ^^^^^^^^^^ reference semanticdb maven . . minimized/SubClasses# -// ^^^ reference semanticdb maven . . minimized/SubClasses#app(). +// ^^^^^^^^^^ reference scip-java maven . . minimized/SubClasses# +// ^^^ reference scip-java maven . . minimized/SubClasses#app(). + Fields.app()); -// ^^^^^^ reference semanticdb maven . . minimized/Fields# -// ^^^ reference semanticdb maven . . minimized/Fields#app(). +// ^^^^^^ reference scip-java maven . . minimized/Fields# +// ^^^ reference scip-java maven . . minimized/Fields#app(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/MinimizedJavaMain#main(). +// ⌃ enclosing_range_end scip-java maven . . minimized/MinimizedJavaMain#main(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/MinimizedJavaMain# +//⌃ enclosing_range_end scip-java maven . . minimized/MinimizedJavaMain# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ParameterizedTypes.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ParameterizedTypes.java index 1dbe55c0d..27a2254cc 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ParameterizedTypes.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/ParameterizedTypes.java @@ -1,155 +1,158 @@ package minimized; import java.util.HashMap; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^^ reference semanticdb maven jdk 11 java/util/HashMap# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^^ reference scip-java maven jdk 11 java/util/HashMap# import java.util.Iterator; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/Iterator# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/Iterator# import java.util.List; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^ reference semanticdb maven jdk 11 java/util/List# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^ reference scip-java maven jdk 11 java/util/List# import java.util.Map; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^ reference semanticdb maven jdk 11 java/util/Map# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^ reference scip-java maven jdk 11 java/util/Map# -//⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes# -//⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#[A] -//⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#[B] +//⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes# +//⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#[A] +//⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#[B] public class ParameterizedTypes { -// ^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ParameterizedTypes# +// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/ParameterizedTypes# // display_name ParameterizedTypes // signature_documentation java public class ParameterizedTypes // kind Class -// ^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ParameterizedTypes#``(). +// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/ParameterizedTypes#``(). // display_name // signature_documentation java public ParameterizedTypes() // kind Constructor -// ^ definition semanticdb maven . . minimized/ParameterizedTypes#[A] +// ^ definition scip-java maven . . minimized/ParameterizedTypes#[A] // display_name A // signature_documentation java A // kind TypeParameter -// ^ definition semanticdb maven . . minimized/ParameterizedTypes#[B] +// ^ definition scip-java maven . . minimized/ParameterizedTypes#[B] // display_name B // signature_documentation java B extends String // kind TypeParameter -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#iteratorable().[T] -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#iteratorable(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#iteratorable(). +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#iteratorable().[T] // ⌄ enclosing_range_start local 0 public & Iterator> void iteratorable(List list) {} -// ^ definition semanticdb maven . . minimized/ParameterizedTypes#iteratorable().[T] +// ^ definition scip-java maven . . minimized/ParameterizedTypes#iteratorable().[T] // display_name T // signature_documentation java T extends Iterable & Iterator // kind TypeParameter -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Iterable# -// ^ reference semanticdb maven . . minimized/ParameterizedTypes#[A] -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/Iterator# -// ^ reference semanticdb maven . . minimized/ParameterizedTypes#[B] -// ^^^^^^^^^^^^ definition semanticdb maven . . minimized/ParameterizedTypes#iteratorable(). +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Iterable# +// ^ reference scip-java maven . . minimized/ParameterizedTypes#[A] +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/Iterator# +// ^ reference scip-java maven . . minimized/ParameterizedTypes#[B] +// ^^^^^^^^^^^^ definition scip-java maven . . minimized/ParameterizedTypes#iteratorable(). // display_name iteratorable // signature_documentation java public & Iterator> void iteratorable(List list) // kind Method -// ^^^^ reference semanticdb maven jdk 11 java/util/List# -// ^ reference semanticdb maven . . minimized/ParameterizedTypes#iteratorable().[T] +// ^^^^ reference scip-java maven jdk 11 java/util/List# +// ^ reference scip-java maven . . minimized/ParameterizedTypes#iteratorable().[T] // ^^^^ definition local 0 // display_name list // signature_documentation java List list -// enclosing_symbol semanticdb maven . . minimized/ParameterizedTypes#iteratorable(). +// enclosing_symbol scip-java maven . . minimized/ParameterizedTypes#iteratorable(). +// kind Parameter // ⌃ enclosing_range_end local 0 -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#iteratorable().[T] -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#iteratorable(). +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#iteratorable(). +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#iteratorable().[T] -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#app(). // ⌄ enclosing_range_start local 1 // ⌄ enclosing_range_start local 2 public String app(A a, B b) { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/ParameterizedTypes#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/ParameterizedTypes#app(). // display_name app // signature_documentation java public String app(A a, B b) // kind Method -// ^ reference semanticdb maven . . minimized/ParameterizedTypes#[A] +// ^ reference scip-java maven . . minimized/ParameterizedTypes#[A] // ^ definition local 1 // display_name a // signature_documentation java A a -// enclosing_symbol semanticdb maven . . minimized/ParameterizedTypes#app(). -// ^ reference semanticdb maven . . minimized/ParameterizedTypes#[B] +// enclosing_symbol scip-java maven . . minimized/ParameterizedTypes#app(). +// kind Parameter +// ^ reference scip-java maven . . minimized/ParameterizedTypes#[B] // ^ definition local 2 // display_name b // signature_documentation java B b -// enclosing_symbol semanticdb maven . . minimized/ParameterizedTypes#app(). +// enclosing_symbol scip-java maven . . minimized/ParameterizedTypes#app(). +// kind Parameter // ⌃ enclosing_range_end local 1 // ⌃ enclosing_range_end local 2 return a.toString() + b; // ^ reference local 1 -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Object#toString(). +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Object#toString(). // ^ reference local 2 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#app(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#doStuff(). +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#doStuff(). public Map doStuff() { return null; } -// ^^^ reference semanticdb maven jdk 11 java/util/Map# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^ definition semanticdb maven . . minimized/ParameterizedTypes#doStuff(). +// ^^^ reference scip-java maven jdk 11 java/util/Map# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^ definition scip-java maven . . minimized/ParameterizedTypes#doStuff(). // display_name doStuff // signature_documentation java public Map doStuff() // kind Method -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#doStuff(). +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#doStuff(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#createQuadruplet(). +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#createQuadruplet(). public Quadruplet createQuadruplet() { return null; } -// ^^^^^^^^^^ reference semanticdb maven . . minimized/ParameterizedTypes#Quadruplet# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/Object# -// ^^^^^^^ reference semanticdb maven jdk 11 java/lang/Integer# -// ^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ParameterizedTypes#createQuadruplet(). +// ^^^^^^^^^^ reference scip-java maven . . minimized/ParameterizedTypes#Quadruplet# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/Object# +// ^^^^^^^ reference scip-java maven jdk 11 java/lang/Integer# +// ^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/ParameterizedTypes#createQuadruplet(). // display_name createQuadruplet // signature_documentation java public Quadruplet createQuadruplet() // kind Method -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#createQuadruplet(). +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#createQuadruplet(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#Quadruplet# -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[T] -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[S] -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[X] -// ⌄ enclosing_range_start semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[Y] +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#Quadruplet# +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[T] +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[S] +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[X] +// ⌄ enclosing_range_start scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[Y] public static class Quadruplet {} -// ^^^^^^^^^^ definition semanticdb maven . . minimized/ParameterizedTypes#Quadruplet# +// ^^^^^^^^^^ definition scip-java maven . . minimized/ParameterizedTypes#Quadruplet# // display_name Quadruplet // signature_documentation java public static class Quadruplet // kind Class -// ^^^^^^^^^^ definition semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#``(). +// ^^^^^^^^^^ definition scip-java maven . . minimized/ParameterizedTypes#Quadruplet#``(). // display_name // signature_documentation java public Quadruplet() // kind Constructor -// ^ definition semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[T] +// ^ definition scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[T] // display_name T // signature_documentation java T // kind TypeParameter -// ^ definition semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[S] +// ^ definition scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[S] // display_name S // signature_documentation java S // kind TypeParameter -// ^ definition semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[X] +// ^ definition scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[X] // display_name X // signature_documentation java X // kind TypeParameter -// ^ definition semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[Y] +// ^ definition scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[Y] // display_name Y // signature_documentation java Y // kind TypeParameter -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#Quadruplet# -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[T] -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[S] -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[X] -// ⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#Quadruplet#[Y] +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#Quadruplet# +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[T] +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[S] +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[X] +// ⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#Quadruplet#[Y] } -//⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes# -//⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#[A] -//⌃ enclosing_range_end semanticdb maven . . minimized/ParameterizedTypes#[B] +//⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes# +//⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#[A] +//⌃ enclosing_range_end scip-java maven . . minimized/ParameterizedTypes#[B] diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Primitives.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Primitives.java index d1fb9899f..83e5de549 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Primitives.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/Primitives.java @@ -1,116 +1,116 @@ package minimized; import java.util.Random; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^ reference semanticdb maven jdk 11 java/util/Random# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^ reference scip-java maven jdk 11 java/util/Random# -//⌄ enclosing_range_start semanticdb maven . . minimized/Primitives# +//⌄ enclosing_range_start scip-java maven . . minimized/Primitives# public class Primitives { -// ^^^^^^^^^^ definition semanticdb maven . . minimized/Primitives# +// ^^^^^^^^^^ definition scip-java maven . . minimized/Primitives# // display_name Primitives // signature_documentation java public class Primitives // kind Class -// ^^^^^^^^^^ definition semanticdb maven . . minimized/Primitives#``(). +// ^^^^^^^^^^ definition scip-java maven . . minimized/Primitives#``(). // display_name // signature_documentation java public Primitives() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/Primitives#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Primitives#app(). public static String app() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/Primitives#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/Primitives#app(). // display_name app // signature_documentation java public static String app() // kind StaticMethod // ⌄ enclosing_range_start local 0 Random random = new Random(); -// ^^^^^^ reference semanticdb maven jdk 11 java/util/Random# +// ^^^^^^ reference scip-java maven jdk 11 java/util/Random# // ^^^^^^ definition local 0 // display_name random // signature_documentation java Random random -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable -// ^^^^^^ reference semanticdb maven jdk 11 java/util/Random#``(). +// ^^^^^^ reference scip-java maven jdk 11 java/util/Random#``(). // ⌃ enclosing_range_end local 0 // ⌄ enclosing_range_start local 1 byte a = (byte) random.nextInt(); // ^ definition local 1 // display_name a // signature_documentation java byte a -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^ reference semanticdb maven jdk 11 java/util/Random#nextInt(). +// ^^^^^^^ reference scip-java maven jdk 11 java/util/Random#nextInt(). // ⌃ enclosing_range_end local 1 // ⌄ enclosing_range_start local 2 short b = (short) random.nextInt(); // ^ definition local 2 // display_name b // signature_documentation java short b -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^ reference semanticdb maven jdk 11 java/util/Random#nextInt(). +// ^^^^^^^ reference scip-java maven jdk 11 java/util/Random#nextInt(). // ⌃ enclosing_range_end local 2 // ⌄ enclosing_range_start local 3 int c = random.nextInt(); // ^ definition local 3 // display_name c // signature_documentation java int c -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^ reference semanticdb maven jdk 11 java/util/Random#nextInt(). +// ^^^^^^^ reference scip-java maven jdk 11 java/util/Random#nextInt(). // ⌃ enclosing_range_end local 3 // ⌄ enclosing_range_start local 4 long d = random.nextLong(); // ^ definition local 4 // display_name d // signature_documentation java long d -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^^ reference semanticdb maven jdk 11 java/util/Random#nextLong(). +// ^^^^^^^^ reference scip-java maven jdk 11 java/util/Random#nextLong(). // ⌃ enclosing_range_end local 4 // ⌄ enclosing_range_start local 5 char e = (char) random.nextInt(); // ^ definition local 5 // display_name e // signature_documentation java char e -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^ reference semanticdb maven jdk 11 java/util/Random#nextInt(). +// ^^^^^^^ reference scip-java maven jdk 11 java/util/Random#nextInt(). // ⌃ enclosing_range_end local 5 // ⌄ enclosing_range_start local 6 float f = (float) random.nextDouble(); // ^ definition local 6 // display_name f // signature_documentation java float f -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Random#nextDouble(). +// ^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Random#nextDouble(). // ⌃ enclosing_range_end local 6 // ⌄ enclosing_range_start local 7 double g = (double) random.nextDouble(); // ^ definition local 7 // display_name g // signature_documentation java double g -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Random#nextDouble(). +// ^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Random#nextDouble(). // ⌃ enclosing_range_end local 7 // ⌄ enclosing_range_start local 8 boolean h = random.nextBoolean(); // ^ definition local 8 // display_name h // signature_documentation java boolean h -// enclosing_symbol semanticdb maven . . minimized/Primitives#app(). +// enclosing_symbol scip-java maven . . minimized/Primitives#app(). // kind Variable // ^^^^^^ reference local 0 -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Random#nextBoolean(). +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Random#nextBoolean(). // ⌃ enclosing_range_end local 8 return "" + a + b + c + d + e + f + g + h; // ^ reference local 1 @@ -122,14 +122,14 @@ public static String app() { // ^ reference local 7 // ^ reference local 8 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/Primitives#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Primitives#app(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/Primitives#test(). +// ⌄ enclosing_range_start scip-java maven . . minimized/Primitives#test(). public static void test() {} -// ^^^^ definition semanticdb maven . . minimized/Primitives#test(). +// ^^^^ definition scip-java maven . . minimized/Primitives#test(). // display_name test // signature_documentation java public static void test() // kind StaticMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/Primitives#test(). +// ⌃ enclosing_range_end scip-java maven . . minimized/Primitives#test(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/Primitives# +//⌃ enclosing_range_end scip-java maven . . minimized/Primitives# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/RawTypes.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/RawTypes.java index ac6262b9d..4bb3b6aef 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/RawTypes.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/RawTypes.java @@ -1,35 +1,35 @@ package minimized; import java.util.Collections; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Collections# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Collections# import java.util.List; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/util/ -// ^^^^ reference semanticdb maven jdk 11 java/util/List# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/util/ +// ^^^^ reference scip-java maven jdk 11 java/util/List# -//⌄ enclosing_range_start semanticdb maven . . minimized/RawTypes# +//⌄ enclosing_range_start scip-java maven . . minimized/RawTypes# @SuppressWarnings("ALL") -// ^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/SuppressWarnings# +// ^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/SuppressWarnings# public class RawTypes { -// ^^^^^^^^ definition semanticdb maven . . minimized/RawTypes# +// ^^^^^^^^ definition scip-java maven . . minimized/RawTypes# // display_name RawTypes -// signature_documentation java @SuppressWarnings("ALL")\npublic class RawTypes +// signature_documentation java @SuppressWarnings\npublic class RawTypes // kind Class -// ^^^^^^^^ definition semanticdb maven . . minimized/RawTypes#``(). +// ^^^^^^^^ definition scip-java maven . . minimized/RawTypes#``(). // display_name // signature_documentation java public RawTypes() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/RawTypes#x. +// ⌄ enclosing_range_start scip-java maven . . minimized/RawTypes#x. public static final List x = Collections.singletonList(42); -// ^^^^ reference semanticdb maven jdk 11 java/util/List# -// ^ definition semanticdb maven . . minimized/RawTypes#x. +// ^^^^ reference scip-java maven jdk 11 java/util/List# +// ^ definition scip-java maven . . minimized/RawTypes#x. // display_name x // signature_documentation java public static final List x // kind StaticField -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Collections# -// ^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/util/Collections#singletonList(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/RawTypes#x. +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Collections# +// ^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/util/Collections#singletonList(). +// ⌃ enclosing_range_end scip-java maven . . minimized/RawTypes#x. } -//⌃ enclosing_range_end semanticdb maven . . minimized/RawTypes# +//⌃ enclosing_range_end scip-java maven . . minimized/RawTypes# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/SubClasses.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/SubClasses.java index 4e99f292f..cb9210521 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/SubClasses.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/SubClasses.java @@ -1,78 +1,78 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/SubClasses# +//⌄ enclosing_range_start scip-java maven . . minimized/SubClasses# public class SubClasses extends AbstractClasses implements Interfaces { -// ^^^^^^^^^^ definition semanticdb maven . . minimized/SubClasses# +// ^^^^^^^^^^ definition scip-java maven . . minimized/SubClasses# // display_name SubClasses -// signature_documentation java public class SubClasses +// signature_documentation java public class SubClasses extends AbstractClasses implements Interfaces // kind Class -// relationship is_implementation semanticdb maven . . minimized/AbstractClasses# -// relationship is_implementation semanticdb maven . . minimized/Interfaces# -// ^^^^^^^^^^ definition semanticdb maven . . minimized/SubClasses#``(). +// relationship is_implementation scip-java maven . . minimized/AbstractClasses# +// relationship is_implementation scip-java maven . . minimized/Interfaces# +// ^^^^^^^^^^ definition scip-java maven . . minimized/SubClasses#``(). // display_name // signature_documentation java public SubClasses() // kind Constructor -// ^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AbstractClasses# -// ^^^^^^^^^^ reference semanticdb maven . . minimized/Interfaces# +// ^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/AbstractClasses# +// ^^^^^^^^^^ reference scip-java maven . . minimized/Interfaces# -// ⌄ enclosing_range_start semanticdb maven . . minimized/SubClasses#abstractImplementation(). +// ⌄ enclosing_range_start scip-java maven . . minimized/SubClasses#abstractImplementation(). @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# public String abstractImplementation() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/SubClasses#abstractImplementation(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/SubClasses#abstractImplementation(). // display_name abstractImplementation // signature_documentation java @Override\npublic String abstractImplementation() // kind Method -// relationship is_reference is_implementation semanticdb maven . . minimized/AbstractClasses#abstractImplementation(). +// relationship is_reference is_implementation scip-java maven . . minimized/AbstractClasses#abstractImplementation(). return "abstract"; } -// ⌃ enclosing_range_end semanticdb maven . . minimized/SubClasses#abstractImplementation(). +// ⌃ enclosing_range_end scip-java maven . . minimized/SubClasses#abstractImplementation(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/SubClasses#abstractInterfaceMethod(). +// ⌄ enclosing_range_start scip-java maven . . minimized/SubClasses#abstractInterfaceMethod(). @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# public String abstractInterfaceMethod() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/SubClasses#abstractInterfaceMethod(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/SubClasses#abstractInterfaceMethod(). // display_name abstractInterfaceMethod // signature_documentation java @Override\npublic String abstractInterfaceMethod() // kind Method -// relationship is_reference is_implementation semanticdb maven . . minimized/Interfaces#abstractInterfaceMethod(). +// relationship is_reference is_implementation scip-java maven . . minimized/Interfaces#abstractInterfaceMethod(). return "abstractInterface"; } -// ⌃ enclosing_range_end semanticdb maven . . minimized/SubClasses#abstractInterfaceMethod(). +// ⌃ enclosing_range_end scip-java maven . . minimized/SubClasses#abstractInterfaceMethod(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/SubClasses#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/SubClasses#app(). public static String app() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^ definition semanticdb maven . . minimized/SubClasses#app(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^ definition scip-java maven . . minimized/SubClasses#app(). // display_name app // signature_documentation java public static String app() // kind StaticMethod // ⌄ enclosing_range_start local 0 SubClasses s = new SubClasses(); -// ^^^^^^^^^^ reference semanticdb maven . . minimized/SubClasses# +// ^^^^^^^^^^ reference scip-java maven . . minimized/SubClasses# // ^ definition local 0 // display_name s // signature_documentation java SubClasses s -// enclosing_symbol semanticdb maven . . minimized/SubClasses#app(). +// enclosing_symbol scip-java maven . . minimized/SubClasses#app(). // kind Variable -// ^^^^^^^^^^ reference semanticdb maven . . minimized/SubClasses#``(). +// ^^^^^^^^^^ reference scip-java maven . . minimized/SubClasses#``(). // ⌃ enclosing_range_end local 0 return s.abstractImplementation() // ^ reference local 0 -// ^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/SubClasses#abstractImplementation(). +// ^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/SubClasses#abstractImplementation(). + s.defaultImplementation() // ^ reference local 0 -// ^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/AbstractClasses#defaultImplementation(). +// ^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/AbstractClasses#defaultImplementation(). + s.abstractInterfaceMethod() // ^ reference local 0 -// ^^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/SubClasses#abstractInterfaceMethod(). +// ^^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/SubClasses#abstractInterfaceMethod(). + s.defaultInterfaceMethod(); // ^ reference local 0 -// ^^^^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/Interfaces#defaultInterfaceMethod(). +// ^^^^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . minimized/Interfaces#defaultInterfaceMethod(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/SubClasses#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/SubClasses#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/SubClasses# +//⌃ enclosing_range_end scip-java maven . . minimized/SubClasses# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TabIndented.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TabIndented.java index 3af5743c3..0ed6f003d 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TabIndented.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TabIndented.java @@ -1,33 +1,33 @@ package minimized; -//⌄ enclosing_range_start semanticdb maven . . minimized/TabIndented# +//⌄ enclosing_range_start scip-java maven . . minimized/TabIndented# public class TabIndented { -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/TabIndented# +// ^^^^^^^^^^^ definition scip-java maven . . minimized/TabIndented# // display_name TabIndented // signature_documentation java public class TabIndented // kind Class -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/TabIndented#``(). +// ^^^^^^^^^^^ definition scip-java maven . . minimized/TabIndented#``(). // display_name // signature_documentation java public TabIndented() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/TabIndented#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/TabIndented#app(). public void app() { -// ^^^ definition semanticdb maven . . minimized/TabIndented#app(). +// ^^^ definition scip-java maven . . minimized/TabIndented#app(). // display_name app // signature_documentation java public void app() // kind Method // ⌄ enclosing_range_start local 0 Object o = new Object() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/Object# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/Object# // ^ definition local 0 // display_name o // signature_documentation java Object o -// enclosing_symbol semanticdb maven . . minimized/TabIndented#app(). +// enclosing_symbol scip-java maven . . minimized/TabIndented#app(). // kind Variable -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/Object# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/Object# // ⌄ enclosing_range_start local 2 @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# // ⌄ enclosing_range_start local 3 public boolean equals(Object other) { // ^^^^^^ definition local 2 @@ -35,12 +35,13 @@ public boolean equals(Object other) { // signature_documentation java @Override\npublic boolean equals(Object other) // enclosing_symbol local 1 // kind Method -// relationship is_reference is_implementation semanticdb maven jdk 11 java/lang/Object#equals(). -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/Object# +// relationship is_reference is_implementation scip-java maven jdk 11 java/lang/Object#equals(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/Object# // ^^^^^ definition local 3 // display_name other // signature_documentation java Object other // enclosing_symbol local 2 +// kind Parameter // ⌃ enclosing_range_end local 3 return false; } @@ -48,37 +49,37 @@ public boolean equals(Object other) { // ⌄ enclosing_range_start local 4 @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# public int hashCode() { // ^^^^^^^^ definition local 4 // display_name hashCode // signature_documentation java @Override\npublic int hashCode() // enclosing_symbol local 1 // kind Method -// relationship is_reference is_implementation semanticdb maven jdk 11 java/lang/Object#hashCode(). +// relationship is_reference is_implementation scip-java maven jdk 11 java/lang/Object#hashCode(). return System.identityHashCode(this); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/System#identityHashCode(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/System#identityHashCode(). } // ⌃ enclosing_range_end local 4 // ⌄ enclosing_range_start local 5 @Override -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/Override# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/Override# public String toString() { -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^^^^^^^^ definition local 5 // display_name toString // signature_documentation java @Override\npublic String toString() // enclosing_symbol local 1 // kind Method -// relationship is_reference is_implementation semanticdb maven jdk 11 java/lang/Object#toString(). +// relationship is_reference is_implementation scip-java maven jdk 11 java/lang/Object#toString(). return ""; } // ⌃ enclosing_range_end local 5 }; // ⌃ enclosing_range_end local 0 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/TabIndented#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TabIndented#app(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/TabIndented# +//⌃ enclosing_range_end scip-java maven . . minimized/TabIndented# diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java index c23c63560..17e660b7d 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeAnnotations.java @@ -1,72 +1,72 @@ package minimized; import java.lang.annotation.ElementType; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^^^^ reference scip-java maven . . java/lang/annotation/ +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType# import java.lang.annotation.Target; -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^^^^ reference semanticdb maven . . java/lang/annotation/ -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^^^^ reference scip-java maven . . java/lang/annotation/ +// ^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Target# -//⌄ enclosing_range_start semanticdb maven . . minimized/TypeAnnotation# +//⌄ enclosing_range_start scip-java maven . . minimized/TypeAnnotation# @Target({ ElementType.TYPE_USE }) -// ^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/Target# -// ^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType# -// ^^^^^^^^ reference semanticdb maven jdk 11 java/lang/annotation/ElementType#TYPE_USE. +// ^^^^^ reference scip-java maven jdk 11 java/lang/annotation/Target# +// ^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType# +// ^^^^^^^^ reference scip-java maven jdk 11 java/lang/annotation/ElementType#TYPE_USE. @interface TypeAnnotation { -// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/TypeAnnotation# +// ^^^^^^^^^^^^^^ definition scip-java maven . . minimized/TypeAnnotation# // display_name TypeAnnotation -// signature_documentation java @Target({ElementType.TYPE_USE})\n@interface TypeAnnotation +// signature_documentation java @Target\nabstract @interface TypeAnnotation implements Annotation // kind Interface -// relationship is_implementation semanticdb maven jdk 11 java/lang/annotation/Annotation# -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeAnnotation#integer(). +// relationship is_implementation scip-java maven jdk 11 java/lang/annotation/Annotation# +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeAnnotation#integer(). int integer() default 1; -// ^^^^^^^ definition semanticdb maven . . minimized/TypeAnnotation#integer(). +// ^^^^^^^ definition scip-java maven . . minimized/TypeAnnotation#integer(). // display_name integer // signature_documentation java public abstract int integer() // kind AbstractMethod -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeAnnotation#integer(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeAnnotation#integer(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/TypeAnnotation# +//⌃ enclosing_range_end scip-java maven . . minimized/TypeAnnotation# // FIXME(issue: GRAPH-1122): Definition range for T below is incorrect -//⌄ enclosing_range_start semanticdb maven . . minimized/ClassProcessed# -//⌄ enclosing_range_start semanticdb maven . . minimized/ClassProcessed#[T] +//⌄ enclosing_range_start scip-java maven . . minimized/ClassProcessed# +//⌄ enclosing_range_start scip-java maven . . minimized/ClassProcessed#[T] class ClassProcessed<@TypeAnnotation T extends Number> { -// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed# +// ^^^^^^^^^^^^^^ definition scip-java maven . . minimized/ClassProcessed# // display_name ClassProcessed // signature_documentation java class ClassProcessed // kind Class -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed#[T] +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . minimized/ClassProcessed#[T] // display_name T // signature_documentation java T extends Number // kind TypeParameter -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeAnnotation# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/Number# +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/TypeAnnotation# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/Number# -// ⌄ enclosing_range_start semanticdb maven . . minimized/ClassProcessed#``(). +// ⌄ enclosing_range_start scip-java maven . . minimized/ClassProcessed#``(). public ClassProcessed() { -// ^^^^^^^^^^^^^^ definition semanticdb maven . . minimized/ClassProcessed#``(). +// ^^^^^^^^^^^^^^ definition scip-java maven . . minimized/ClassProcessed#``(). // display_name // signature_documentation java public ClassProcessed() // kind Constructor // ⌄ enclosing_range_start local 0 String s = new @TypeAnnotation String(); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# // ^ definition local 0 // display_name s // signature_documentation java String s -// enclosing_symbol semanticdb maven . . minimized/ClassProcessed#``(). +// enclosing_symbol scip-java maven . . minimized/ClassProcessed#``(). // kind Variable -// ^^^^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeAnnotation# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String#``(). +// ^^^^^^^^^^^^^^ reference scip-java maven . . minimized/TypeAnnotation# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# +// ^^^^^^ reference scip-java maven jdk 11 java/lang/String#``(). // ⌃ enclosing_range_end local 0 } -// ⌃ enclosing_range_end semanticdb maven . . minimized/ClassProcessed#``(). +// ⌃ enclosing_range_end scip-java maven . . minimized/ClassProcessed#``(). } -//⌃ enclosing_range_end semanticdb maven . . minimized/ClassProcessed# -//⌃ enclosing_range_end semanticdb maven . . minimized/ClassProcessed#[T] +//⌃ enclosing_range_end scip-java maven . . minimized/ClassProcessed# +//⌃ enclosing_range_end scip-java maven . . minimized/ClassProcessed#[T] diff --git a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeVariables.java b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeVariables.java index bda109668..9079ee038 100644 --- a/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeVariables.java +++ b/tests/snapshots/src/main/generated/tests/minimized/src/main/java/minimized/TypeVariables.java @@ -1,129 +1,130 @@ package minimized; /** Example from https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.4 */ -//⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables# +//⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables# public class TypeVariables { -// ^^^^^^^^^^^^^ definition semanticdb maven . . minimized/TypeVariables# +// ^^^^^^^^^^^^^ definition scip-java maven . . minimized/TypeVariables# // display_name TypeVariables // signature_documentation java public class TypeVariables // kind Class // documentation Example from https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.4 -// ^^^^^^^^^^^^^ definition semanticdb maven . . minimized/TypeVariables#``(). +// ^^^^^^^^^^^^^ definition scip-java maven . . minimized/TypeVariables#``(). // display_name // signature_documentation java public TypeVariables() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#C# +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#C# static class C { -// ^ definition semanticdb maven . . minimized/TypeVariables#C# +// ^ definition scip-java maven . . minimized/TypeVariables#C# // display_name C // signature_documentation java static class C // kind Class -// ^ definition semanticdb maven . . minimized/TypeVariables#C#``(). +// ^ definition scip-java maven . . minimized/TypeVariables#C#``(). // display_name // signature_documentation java C() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#C#mCPublic(). +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#C#mCPublic(). public void mCPublic() {} -// ^^^^^^^^ definition semanticdb maven . . minimized/TypeVariables#C#mCPublic(). +// ^^^^^^^^ definition scip-java maven . . minimized/TypeVariables#C#mCPublic(). // display_name mCPublic // signature_documentation java public void mCPublic() // kind Method -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#C#mCPublic(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#C#mCPublic(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#C#mCProtected(). +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#C#mCProtected(). protected void mCProtected() {} -// ^^^^^^^^^^^ definition semanticdb maven . . minimized/TypeVariables#C#mCProtected(). +// ^^^^^^^^^^^ definition scip-java maven . . minimized/TypeVariables#C#mCProtected(). // display_name mCProtected // signature_documentation java protected void mCProtected() // kind Method -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#C#mCProtected(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#C#mCProtected(). -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#C#mCPackage(). +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#C#mCPackage(). void mCPackage() {} -// ^^^^^^^^^ definition semanticdb maven . . minimized/TypeVariables#C#mCPackage(). +// ^^^^^^^^^ definition scip-java maven . . minimized/TypeVariables#C#mCPackage(). // display_name mCPackage // signature_documentation java void mCPackage() // kind Method -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#C#mCPackage(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#C#mCPackage(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#C# +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#C# -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#I# +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#I# interface I { -// ^ definition semanticdb maven . . minimized/TypeVariables#I# +// ^ definition scip-java maven . . minimized/TypeVariables#I# // display_name I -// signature_documentation java interface I +// signature_documentation java abstract static interface I // kind Interface -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#I#mI(). +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#I#mI(). void mI(); -// ^^ definition semanticdb maven . . minimized/TypeVariables#I#mI(). +// ^^ definition scip-java maven . . minimized/TypeVariables#I#mI(). // display_name mI // signature_documentation java public abstract void mI() // kind AbstractMethod -// relationship is_reference is_implementation semanticdb maven . . minimized/TypeVariables#CT#mI(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#I#mI(). +// relationship is_reference is_implementation scip-java maven . . minimized/TypeVariables#CT#mI(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#I#mI(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#I# +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#I# -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#CT# +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#CT# static class CT extends C implements I { -// ^^ definition semanticdb maven . . minimized/TypeVariables#CT# +// ^^ definition scip-java maven . . minimized/TypeVariables#CT# // display_name CT -// signature_documentation java static class CT +// signature_documentation java static class CT extends C implements I // kind Class -// relationship is_implementation semanticdb maven . . minimized/TypeVariables#C# -// relationship is_implementation semanticdb maven . . minimized/TypeVariables#I# -// ^^ definition semanticdb maven . . minimized/TypeVariables#CT#``(). +// relationship is_implementation scip-java maven . . minimized/TypeVariables#C# +// relationship is_implementation scip-java maven . . minimized/TypeVariables#I# +// ^^ definition scip-java maven . . minimized/TypeVariables#CT#``(). // display_name // signature_documentation java CT() // kind Constructor -// ^ reference semanticdb maven . . minimized/TypeVariables#C# -// ^ reference semanticdb maven . . minimized/TypeVariables#I# -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#CT#mI(). +// ^ reference scip-java maven . . minimized/TypeVariables#C# +// ^ reference scip-java maven . . minimized/TypeVariables#I# +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#CT#mI(). public void mI() {} -// ^^ definition semanticdb maven . . minimized/TypeVariables#CT#mI(). +// ^^ definition scip-java maven . . minimized/TypeVariables#CT#mI(). // display_name mI // signature_documentation java public void mI() // kind Method -// relationship is_reference is_implementation semanticdb maven . . minimized/TypeVariables#I#mI(). -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#CT#mI(). +// relationship is_reference is_implementation scip-java maven . . minimized/TypeVariables#I#mI(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#CT#mI(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#CT# +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#CT# -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#app().[T] -// ⌄ enclosing_range_start semanticdb maven . . minimized/TypeVariables#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#app(). +// ⌄ enclosing_range_start scip-java maven . . minimized/TypeVariables#app().[T] // ⌄ enclosing_range_start local 0 public static void app(T t) { -// ^ definition semanticdb maven . . minimized/TypeVariables#app().[T] +// ^ definition scip-java maven . . minimized/TypeVariables#app().[T] // display_name T // signature_documentation java T extends C & I // kind TypeParameter -// ^ reference semanticdb maven . . minimized/TypeVariables#C# -// ^ reference semanticdb maven . . minimized/TypeVariables#I# -// ^^^ definition semanticdb maven . . minimized/TypeVariables#app(). +// ^ reference scip-java maven . . minimized/TypeVariables#C# +// ^ reference scip-java maven . . minimized/TypeVariables#I# +// ^^^ definition scip-java maven . . minimized/TypeVariables#app(). // display_name app // signature_documentation java public static void app(T t) // kind StaticMethod -// ^ reference semanticdb maven . . minimized/TypeVariables#app().[T] +// ^ reference scip-java maven . . minimized/TypeVariables#app().[T] // ^ definition local 0 // display_name t // signature_documentation java T t -// enclosing_symbol semanticdb maven . . minimized/TypeVariables#app(). +// enclosing_symbol scip-java maven . . minimized/TypeVariables#app(). +// kind Parameter // ⌃ enclosing_range_end local 0 t.mI(); // ^ reference local 0 -// ^^ reference semanticdb maven . . minimized/TypeVariables#I#mI(). +// ^^ reference scip-java maven . . minimized/TypeVariables#I#mI(). t.mCPublic(); // ^ reference local 0 -// ^^^^^^^^ reference semanticdb maven . . minimized/TypeVariables#C#mCPublic(). +// ^^^^^^^^ reference scip-java maven . . minimized/TypeVariables#C#mCPublic(). t.mCProtected(); // ^ reference local 0 -// ^^^^^^^^^^^ reference semanticdb maven . . minimized/TypeVariables#C#mCProtected(). +// ^^^^^^^^^^^ reference scip-java maven . . minimized/TypeVariables#C#mCProtected(). t.mCPackage(); // ^ reference local 0 -// ^^^^^^^^^ reference semanticdb maven . . minimized/TypeVariables#C#mCPackage(). +// ^^^^^^^^^ reference scip-java maven . . minimized/TypeVariables#C#mCPackage(). } -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#app().[T] -// ⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#app(). +// ⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables#app().[T] } -//⌃ enclosing_range_end semanticdb maven . . minimized/TypeVariables# +//⌃ enclosing_range_end scip-java maven . . minimized/TypeVariables# diff --git a/tests/snapshots/src/main/scala/tests/MinimizedSnapshotScipGenerator.scala b/tests/snapshots/src/main/scala/tests/MinimizedSnapshotScipGenerator.scala index 86f69a2a5..fd90fbf36 100644 --- a/tests/snapshots/src/main/scala/tests/MinimizedSnapshotScipGenerator.scala +++ b/tests/snapshots/src/main/scala/tests/MinimizedSnapshotScipGenerator.scala @@ -44,6 +44,7 @@ class MinimizedSnapshotScipGenerator { sourceroot.toString(), "--output", scipOutput.toString, + "--use-scip-shards", "--targetroot", targetroot.toString() ) diff --git a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala index 3dbb20482..045dd5451 100644 --- a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala +++ b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala @@ -53,7 +53,7 @@ class ScipShardEmissionSuite extends FunSuite { assertEquals(shard.getDocumentsCount, 1) val doc = shard.getDocuments(0) assertEquals(doc.getRelativePath, "example/Foo.java") - assertEquals(doc.getLanguage, "Java") + assertEquals(doc.getLanguage, "java") val symbols = doc.getSymbolsList.asScala assert(symbols.nonEmpty, "expected at least one symbol") @@ -78,7 +78,7 @@ class ScipShardEmissionSuite extends FunSuite { // At least one definition should carry a Java signature_documentation block. val withSignatures = symbols.filter { info => info.hasSignatureDocumentation && - info.getSignatureDocumentation.getLanguage == "Java" && + info.getSignatureDocumentation.getLanguage == "java" && info.getSignatureDocumentation.getText.nonEmpty } assert( From 12001af548d9f5e58198b849040c58f9940dd42b Mon Sep 17 00:00:00 2001 From: jupblb Date: Wed, 27 May 2026 15:32:59 +0200 Subject: [PATCH 07/21] PR1 (M8): Make compiler-side SCIP shard emission the default After M3-M7 the per-source SCIP shard format is stable and the ScipShardAggregator produces equivalent output to the legacy SemanticDB->SCIP path. This commit promotes the cheap compiler-side half of the dual-emission to be on by default so that: - any javac plugin invocation (sbt, Maven, Bazel, ad-hoc) writes a *.scip shard under META-INF/scip/ alongside the *.semanticdb file without needing an explicit -emit-scip:on flag; - users (or build tools) that want to consume the new path only need to flip the CLI switch (--use-scip-shards) once the indexer runs; - legacy callers that only read *.semanticdb files are unaffected. The CLI default for index-semanticdb's --use-scip-shards remains false because the broader ecosystem (notably the Kotlin compiler and the existing snapshot/build tool integrations) still produces only *.semanticdb. That flip is deferred to a follow-up PR. semanticdb-javac: - SemanticdbJavacOptions.emitScip defaults to true. -emit-scip:off is now the explicit opt-out and is documented as the legacy path. scip-java: - SnapshotCommand: skip per-source shards (those without a metadata.project_root) so 'scip-java snapshot' continues to render only the top-level aggregator output. Per-source shards have no project_root and would otherwise crash with 'missing scheme' when their relative paths are resolved into a URI. build.sbt: - Drop the now-redundant -emit-scip:on flag from the minimized project; the plugin default already emits shards. tests/unit: - ScipShardEmissionSuite: invert the off-path test so it explicitly passes -emit-scip:off; the previous test relied on the old default of false. Full snapshot suite (102 tests) and unit suite (30 tests) green. --- build.sbt | 1 - .../scip_java/commands/SnapshotCommand.scala | 52 +++++++++++-------- .../SemanticdbJavacOptions.java | 10 ++-- .../scala/tests/ScipShardEmissionSuite.scala | 9 +++- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/build.sbt b/build.sbt index 459760f1c..b754d3b93 100644 --- a/build.sbt +++ b/build.sbt @@ -565,7 +565,6 @@ lazy val minimizedSettings = List[Def.Setting[_]]( s"-build-tool:sbt", s"-text:on", s"-verbose", - s"-emit-scip:on", s"-sourceroot:${(ThisBuild / baseDirectory).value}", s"-targetroot:${(Compile / semanticdbTargetRoot).value}", s"-randomtimestamp=${System.nanoTime()}" diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/SnapshotCommand.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/SnapshotCommand.scala index 6b3425739..9ac166cf6 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/SnapshotCommand.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/SnapshotCommand.scala @@ -51,31 +51,37 @@ case class SnapshotCommand( attrs: BasicFileAttributes ): FileVisitResult = { if (scipPattern.matches(file)) { - foundScipFile = true val index = Scip.Index.parseFrom(Files.readAllBytes(file)) - val root = URI.create(index.getMetadata.getProjectRoot) - index - .getDocumentsList - .asScala - .foreach { doc => - val sourcepath = Paths.get(root.resolve(doc.getRelativePath)) - val source = - new String( - Files.readAllBytes(sourcepath), - StandardCharsets.UTF_8 + // Skip per-source shards emitted by the compiler plugin (those don't have a + // project_root). The aggregator produces a single top-level index file that + // carries the project_root and is the canonical input for snapshot rendering. + val rawProjectRoot = index.getMetadata.getProjectRoot + if (rawProjectRoot.nonEmpty) { + foundScipFile = true + val projectRoot = URI.create(rawProjectRoot) + index + .getDocumentsList + .asScala + .foreach { doc => + val sourcepath = Paths.get(projectRoot.resolve(doc.getRelativePath)) + val source = + new String( + Files.readAllBytes(sourcepath), + StandardCharsets.UTF_8 + ) + val document = ScipPrinters.printTextDocument( + doc, + source, + CommentSyntax.default ) - val document = ScipPrinters.printTextDocument( - doc, - source, - CommentSyntax.default - ) - val snapshotOutput = output.resolve(doc.getRelativePath) - Files.createDirectories(snapshotOutput.getParent) - Files.write( - snapshotOutput, - document.getBytes(StandardCharsets.UTF_8) - ) - } + val snapshotOutput = output.resolve(doc.getRelativePath) + Files.createDirectories(snapshotOutput.getParent) + Files.write( + snapshotOutput, + document.getBytes(StandardCharsets.UTF_8) + ) + } + } } super.visitFile(file, attrs) } 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 4bd335b57..8b50817da 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 @@ -25,11 +25,13 @@ public class SemanticdbJavacOptions { public boolean includeText = false; public boolean verboseEnabled = false; /** - * When {@code true}, the plugin also emits {@code *.scip} shards under {@code META-INF/scip/...} - * alongside the existing {@code *.semanticdb} files. Defaults to {@code false} during the - * SemanticDB→SCIP transition. + * Controls whether the plugin emits {@code *.scip} shards under {@code META-INF/scip/...} + * alongside the existing {@code *.semanticdb} files. Defaults to {@code true}: producing the + * extra shard is cheap and lets the {@code scip-java index-semanticdb --use-scip-shards} + * pipeline run without any additional compiler-side configuration. Legacy users that only + * consume {@code .semanticdb} are unaffected. Pass {@code -emit-scip:off} to disable. */ - public boolean emitScip = false; + public boolean emitScip = true; public final ArrayList errors; public boolean alreadyReportedErrors = false; diff --git a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala index 045dd5451..44a2c3fbd 100644 --- a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala +++ b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala @@ -103,12 +103,17 @@ class ScipShardEmissionSuite extends FunSuite { assert(barText.contains("int bar("), s"unexpected bar signature: $barText") } - test("compiler does not emit SCIP shards when -emit-scip is off") { + test("compiler does not emit SCIP shards when -emit-scip:off is set") { val targetroot = Files.createTempDirectory("scip-shard-off-") val sourceroot = Files.createTempDirectory("scip-shard-off-src-") val compiler = new TestCompiler(TestCompiler.PROCESSOR_PATH, Nil, targetroot, sourceroot) - val result = compiler.compileSemanticdb(Seq(source)) + val result = compiler.compile( + Seq(source), + List( + s"-Xplugin:semanticdb -emit-scip:off -text:on -sourceroot:$sourceroot -targetroot:$targetroot" + ) + ) assert(result.isSuccess, s"javac failed:\n${result.stdout}") val scipPath = targetroot.resolve("META-INF/scip/example/Foo.java.scip") From 72794e9afc3609eedd150d260299961bc6aa4b32 Mon Sep 17 00:00:00 2001 From: jupblb Date: Wed, 27 May 2026 16:13:43 +0200 Subject: [PATCH 08/21] PR1 (cleanup): Simplify newly-added SCIP shard code Post-PR1 cleanup of dead code, redundant flag plumbing, and duplication. No behavioral changes; snapshot suite (102 passed) and unit suite (28 passed) remain green. Dead code removed: - ScipShardAggregator: drop unused documentsFromShards{,Collected} and their Stream/Collectors imports. - ScipSymbols: drop unused isPlaceholderGlobal/descriptorPath; only fromSemanticdbSymbol + PLACEHOLDER_PREFIX are needed in production. - ScipSymbolsSuite: drop the tests for the removed helpers. Redundant -emit-scip:on plumbing removed: With compiler-side default emitScip=true (M8), the CLI/build-tool machinery that conditionally toggled the flag is purely cosmetic. - Embedded.customJavac: drop emitScip param + emitScipProp system property prefix. - MavenBuildTool: stop passing emitScip = useScipShards. - ScipBuildTool: stop appending -emit-scip:on to the -Xplugin string. - SemanticdbOptionBuilder: drop EMIT_SCIP system-property handling and the corresponding xpluginOption branch. - SemanticdbJavacOptions still parses -emit-scip:on / -emit-scip:off as the compiler-side opt-out. - IndexSemanticdbCommand help text no longer implies the shards require an extra compiler flag. Internal duplication removed: - New ScipOccurrences package-private helper centralizes the (symbol, range, roles) dedup key and the 'prefer enclosing_range' merge rule that ScipVisitor and ScipShardWriter both used. - ScipShardWriter.mergeSymbol now uses LinkedHashMap for relationships so output ordering is deterministic. Small ScipVisitor cleanups: - Drop dependency on Semanticdb Property bitmask; compute isStatic / isAbstract directly from Modifier set. - Make 'source' final and initialized via a static sourceText helper. - Merge identical switch arms for ENUM/CLASS/INTERFACE/ANNOTATION_TYPE in emitSymbolInformation. - Refresh stale class-level javadoc; signature docs are now produced via ScipSignatureFormatter. --- .../com/sourcegraph/scip_java/Embedded.scala | 10 +- .../scip_java/buildtools/MavenBuildTool.scala | 3 +- .../scip_java/buildtools/ScipBuildTool.scala | 7 +- .../commands/IndexSemanticdbCommand.scala | 8 +- .../scip_semanticdb/ScipShardAggregator.java | 12 --- .../semanticdb_javac/ScipOccurrences.java | 66 +++++++++++++ .../semanticdb_javac/ScipShardWriter.java | 53 +---------- .../semanticdb_javac/ScipSymbols.java | 11 --- .../semanticdb_javac/ScipVisitor.java | 93 +++---------------- .../SemanticdbOptionBuilder.java | 6 +- .../scala/tests/ScipAggregationSuite.scala | 8 +- .../scala/tests/ScipShardEmissionSuite.scala | 8 +- .../test/scala/tests/ScipSymbolsSuite.scala | 11 --- 13 files changed, 101 insertions(+), 195 deletions(-) create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipOccurrences.java diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala index 4b3169781..2be327dad 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/Embedded.scala @@ -34,8 +34,7 @@ object Embedded { sourceroot: Path, targetroot: Path, tmp: Path, - javaAtLeast17: Boolean, - emitScip: Boolean = false + javaAtLeast17: Boolean ): Path = { val bin = tmp.resolve("bin") val javac = bin.resolve("javac") @@ -57,11 +56,6 @@ object Embedded { BuildInfo.javacModuleOptions.mkString(" ") else "" - val emitScipProp = - if (emitScip) - s"-Dsemanticdb.emit-scip=true " - else - "" val injectSemanticdbArguments = List[String]( "java", s"-Dsemanticdb.errorpath=$errorpath", @@ -70,7 +64,7 @@ object Embedded { s"-Dsemanticdb.targetroot=$targetroot", s"-Dsemanticdb.output=$$NEW_JAVAC_OPTS", s"-Dsemanticdb.old-output=$javacopts", - s"${emitScipProp}-classpath $pluginpath", + s"-classpath $pluginpath", "com.sourcegraph.semanticdb_javac.InjectSemanticdbOptions", """"$@"""" ).mkString(" ") diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala index 1086d68a3..a0b4f8631 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/MavenBuildTool.scala @@ -44,8 +44,7 @@ class MavenBuildTool(index: IndexCommand) extends BuildTool("Maven", index) { index.workingDirectory, index.finalTargetroot(defaultTargetroot), tmp, - GradleJavaToolchains.isJavaAtLeast(SystemJavaVersion.detect(), "11"), - emitScip = index.indexSemanticdb.useScipShards + GradleJavaToolchains.isJavaAtLeast(SystemJavaVersion.detect(), "11") ) buildCommand ++= List( diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala index c00d320e0..7656a8dd0 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala @@ -342,13 +342,8 @@ class ScipBuildTool(index: IndexCommand) extends BuildTool("SCIP", index) { arguments += "-classpath" arguments += actualClasspath.mkString(File.pathSeparator) } - val emitScipFlag = - if (index.indexSemanticdb.useScipShards) - " -emit-scip:on" - else - "" arguments += - s"-Xplugin:semanticdb -targetroot:$targetroot -sourceroot:$sourceroot$emitScipFlag" + s"-Xplugin:semanticdb -targetroot:$targetroot -sourceroot:$sourceroot" if (config.processorpath.nonEmpty) { arguments += "-processorpath" val processorpath = diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala index a8c9cf6cd..f3f32a00d 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala @@ -62,10 +62,10 @@ final case class IndexSemanticdbCommand( ) allowExportingGlobalSymbolsFromDirectoryEntries: Boolean = true, @Description( - "If true, walk targetroots for *.scip shards (META-INF/scip/...) produced by the " + - "compiler plugin's -emit-scip:on flag instead of *.semanticdb files. The aggregator " + - "rewrites placeholder symbols into the final 'scip-java' scheme and merges per-source " + - "shards into the output index." + "If true, walk targetroots for *.scip shards (META-INF/scip/...) emitted by the " + + "compiler plugin instead of *.semanticdb files. The aggregator rewrites placeholder " + + "symbols into the final 'scip-java' scheme and merges per-source shards into the " + + "output index." ) useScipShards: Boolean = false, @Inline() diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java index 6f77a1028..96458b331 100644 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardAggregator.java @@ -17,8 +17,6 @@ import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; -import java.util.stream.Collectors; -import java.util.stream.Stream; /** * Aggregates per-source {@code *.scip} shards into a single {@link Scip.Index}. @@ -316,14 +314,4 @@ private static boolean supportsReferenceRelationship(Scip.SymbolInformation info } } - // Make the existing flatten-style call available for callers that already have shards in memory. - @SuppressWarnings("unused") - Stream documentsFromShards(List shards) { - return shards.stream().flatMap(s -> s.getDocumentsList().stream()).map(this::rewriteDocument); - } - - @SuppressWarnings("unused") - Stream documentsFromShardsCollected(List shards) { - return documentsFromShards(shards).collect(Collectors.toList()).stream(); - } } diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipOccurrences.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipOccurrences.java new file mode 100644 index 000000000..d4b29e913 --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipOccurrences.java @@ -0,0 +1,66 @@ +package com.sourcegraph.semanticdb_javac; + +import com.sourcegraph.Scip; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Objects; + +/** + * Helpers for deduplicating SCIP {@link Scip.Occurrence} entries by their {@code (symbol, range, + * roles)} key. Variants that differ only in whether {@code enclosing_range} is set are collapsed, + * preferring the one that carries the enclosing range. + */ +final class ScipOccurrences { + + private ScipOccurrences() {} + + /** Returns a new list with duplicate occurrences collapsed in insertion order. */ + static List deduplicate(List occurrences) { + LinkedHashMap out = new LinkedHashMap<>(); + for (Scip.Occurrence occ : occurrences) put(out, occ); + return new ArrayList<>(out.values()); + } + + /** Inserts {@code occ} into {@code out}, collapsing duplicates by {@link Key}. */ + static void put(LinkedHashMap out, Scip.Occurrence occ) { + Key key = Key.of(occ); + Scip.Occurrence existing = out.get(key); + if (existing == null) { + out.put(key, occ); + return; + } + if (existing.getEnclosingRangeCount() == 0 && occ.getEnclosingRangeCount() > 0) { + out.put(key, occ); + } + } + + static final class Key { + final String symbol; + final List range; + final int roles; + + private Key(String symbol, List range, int roles) { + this.symbol = symbol; + this.range = range; + this.roles = roles; + } + + static Key of(Scip.Occurrence occ) { + return new Key(occ.getSymbol(), occ.getRangeList(), occ.getSymbolRoles()); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Key)) return false; + Key other = (Key) o; + return roles == other.roles && symbol.equals(other.symbol) && range.equals(other.range); + } + + @Override + public int hashCode() { + return Objects.hash(symbol, range, roles); + } + } +} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java index b5efee165..5bf5df35b 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipShardWriter.java @@ -7,11 +7,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Objects; /** * Writes and merges per-source SCIP shards produced by the compiler plugin. @@ -83,9 +81,9 @@ private static Scip.Document mergeDocuments(Scip.Document a, Scip.Document b) { // Deduplicate occurrences by (range, symbol, roles). Variants that differ only in // enclosing_range get collapsed, preferring the one that carries the enclosing range. - LinkedHashMap occurrences = new LinkedHashMap<>(); - for (Scip.Occurrence occ : a.getOccurrencesList()) putOccurrence(occurrences, occ); - for (Scip.Occurrence occ : b.getOccurrencesList()) putOccurrence(occurrences, occ); + LinkedHashMap occurrences = new LinkedHashMap<>(); + for (Scip.Occurrence occ : a.getOccurrencesList()) ScipOccurrences.put(occurrences, occ); + for (Scip.Occurrence occ : b.getOccurrencesList()) ScipOccurrences.put(occurrences, occ); builder.addAllOccurrences(occurrences.values()); // Deduplicate symbols by symbol string; merge relationships and documentation. @@ -103,8 +101,8 @@ private static Scip.Document mergeDocuments(Scip.Document a, Scip.Document b) { private static Scip.SymbolInformation mergeSymbol( Scip.SymbolInformation a, Scip.SymbolInformation b) { Scip.SymbolInformation.Builder builder = b.toBuilder(); - // Merge relationships, deduplicating by structural equality. - Map rels = new HashMap<>(); + // Merge relationships, deduplicating by structural equality with deterministic ordering. + Map rels = new LinkedHashMap<>(); for (Scip.Relationship r : a.getRelationshipsList()) rels.put(r, r); for (Scip.Relationship r : b.getRelationshipsList()) rels.put(r, r); builder.clearRelationships().addAllRelationships(rels.values()); @@ -118,45 +116,4 @@ private static Scip.SymbolInformation mergeSymbol( return builder.build(); } - - private static void putOccurrence( - LinkedHashMap out, Scip.Occurrence occ) { - OccurrenceKey key = OccurrenceKey.of(occ); - Scip.Occurrence existing = out.get(key); - if (existing == null) { - out.put(key, occ); - return; - } - if (existing.getEnclosingRangeCount() == 0 && occ.getEnclosingRangeCount() > 0) { - out.put(key, occ); - } - } - - private static final class OccurrenceKey { - final String symbol; - final List range; - final int roles; - - OccurrenceKey(String symbol, List range, int roles) { - this.symbol = symbol; - this.range = range; - this.roles = roles; - } - - static OccurrenceKey of(Scip.Occurrence occ) { - return new OccurrenceKey(occ.getSymbol(), occ.getRangeList(), occ.getSymbolRoles()); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof OccurrenceKey)) return false; - OccurrenceKey other = (OccurrenceKey) o; - return roles == other.roles && symbol.equals(other.symbol) && range.equals(other.range); - } - - @Override - public int hashCode() { - return Objects.hash(symbol, range, roles); - } - } } diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSymbols.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSymbols.java index bcc4b9153..736b287cd 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSymbols.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipSymbols.java @@ -43,15 +43,4 @@ public static String fromSemanticdbSymbol(String symbol) { } return PLACEHOLDER_PREFIX + symbol; } - - /** Returns {@code true} if {@code symbol} is a placeholder global symbol. */ - public static boolean isPlaceholderGlobal(String symbol) { - return symbol != null && symbol.startsWith(PLACEHOLDER_PREFIX); - } - - /** Strips the placeholder prefix, returning just the SemanticDB descriptor path. */ - public static String descriptorPath(String placeholderSymbol) { - if (!isPlaceholderGlobal(placeholderSymbol)) return placeholderSymbol; - return placeholderSymbol.substring(PLACEHOLDER_PREFIX.length()); - } } diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java index 4d7048208..a3e52a5b8 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java @@ -1,7 +1,6 @@ package com.sourcegraph.semanticdb_javac; import com.sourcegraph.Scip; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Property; import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role; import com.sun.source.tree.AnnotatedTypeTree; import com.sun.source.tree.ClassTree; @@ -53,11 +52,8 @@ * *

Structurally this is a fork of {@link SemanticdbVisitor} that emits SCIP types instead of * SemanticDB ones. Symbols are produced through {@link GlobalSymbolsCache} and then translated to - * the placeholder SCIP form via {@link ScipSymbols#fromSemanticdbSymbol(String)}. - * - *

Signature documentation and SemanticDB-only metadata (access, annotations, full SemanticDB - * type tree) are not yet emitted; those will be added by {@code ScipSignatureFormatter} in a - * follow-up milestone. + * the placeholder SCIP form via {@link ScipSymbols#fromSemanticdbSymbol(String)}. Signature + * documentation is produced by {@link ScipSignatureFormatter} directly from javac's element model. */ public final class ScipVisitor extends TreePathScanner { @@ -70,7 +66,7 @@ public final class ScipVisitor extends TreePathScanner { private final SemanticdbJavacOptions options; private final ArrayList occurrences; private final LinkedHashMap symbols; - private String source; + private final String source; private final String relativePath; private final LinkedHashMap nodes; @@ -90,7 +86,7 @@ public ScipVisitor( this.compUnitTree = compUnitTree; this.occurrences = new ArrayList<>(); this.symbols = new LinkedHashMap<>(); - this.source = sourceText(); + this.source = sourceText(compUnitTree); this.relativePath = sourceRelativePath(compUnitTree, options); this.nodes = new LinkedHashMap<>(); } @@ -107,7 +103,7 @@ public Scip.Index buildShard(CompilationUnitTree tree) { if (options.includeText) { document.setText(source); } - document.addAllOccurrences(dedupOccurrences(occurrences)); + document.addAllOccurrences(ScipOccurrences.deduplicate(occurrences)); document.addAllSymbols(symbols.values()); return Scip.Index.newBuilder().addDocuments(document).build(); @@ -119,58 +115,6 @@ public Scip.Index buildShard(CompilationUnitTree tree) { */ static final String LANGUAGE_JAVA = "java"; - /** - * Some AST patterns (in particular top-level class definitions touched by both the regular - * declaration walk and downstream resolvers) can produce two occurrences with the same {@code - * (symbol, range, roles)} that differ only by whether {@code enclosing_range} is set. The SCIP - * writer treats those as distinct by structural equality, so we collapse them here, preferring - * the variant that carries an {@code enclosing_range}. - */ - private static List dedupOccurrences(List occurrences) { - LinkedHashMap out = new LinkedHashMap<>(); - for (Scip.Occurrence occ : occurrences) { - OccurrenceKey key = OccurrenceKey.of(occ); - Scip.Occurrence existing = out.get(key); - if (existing == null) { - out.put(key, occ); - continue; - } - // Prefer the variant with a populated enclosing_range. - if (existing.getEnclosingRangeCount() == 0 && occ.getEnclosingRangeCount() > 0) { - out.put(key, occ); - } - } - return new ArrayList<>(out.values()); - } - - private static final class OccurrenceKey { - final String symbol; - final List range; - final int roles; - - OccurrenceKey(String symbol, List range, int roles) { - this.symbol = symbol; - this.range = range; - this.roles = roles; - } - - static OccurrenceKey of(Scip.Occurrence occ) { - return new OccurrenceKey(occ.getSymbol(), occ.getRangeList(), occ.getSymbolRoles()); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof OccurrenceKey)) return false; - OccurrenceKey other = (OccurrenceKey) o; - return roles == other.roles && symbol.equals(other.symbol) && range.equals(other.range); - } - - @Override - public int hashCode() { - return Objects.hash(symbol, range, roles); - } - } - // ========================== // Symbol/occurrence emission // ========================== @@ -242,8 +186,6 @@ private void emitSymbolInformation(Element sym, Tree tree) { switch (sym.getKind()) { case ENUM: case CLASS: - addParentRelationships(builder, (TypeElement) sym, supportsReferenceRel); - break; case INTERFACE: case ANNOTATION_TYPE: addParentRelationships(builder, (TypeElement) sym, supportsReferenceRel); @@ -332,18 +274,11 @@ private static List scipRange(Semanticdb.Range range) { } private static Scip.SymbolInformation.Kind scipKind(Element sym) { - int properties = 0; - for (Modifier modifier : sym.getModifiers()) { - if (modifier == Modifier.STATIC) properties |= Property.STATIC_VALUE; - else if (modifier == Modifier.ABSTRACT) properties |= Property.ABSTRACT_VALUE; - else if (modifier == Modifier.DEFAULT) properties |= Property.DEFAULT_VALUE; - } - if (((properties & Property.ABSTRACT_VALUE) > 0) - && ((properties & Property.DEFAULT_VALUE) > 0)) { - properties ^= Property.ABSTRACT_VALUE; - } - boolean isStatic = (properties & Property.STATIC_VALUE) > 0; - boolean isAbstract = (properties & Property.ABSTRACT_VALUE) > 0; + Set modifiers = sym.getModifiers(); + boolean isStatic = modifiers.contains(Modifier.STATIC); + // A `default` interface method has both ABSTRACT and DEFAULT modifiers; treat it as non-abstract. + boolean isAbstract = + modifiers.contains(Modifier.ABSTRACT) && !modifiers.contains(Modifier.DEFAULT); switch (sym.getKind()) { case ENUM: @@ -663,14 +598,12 @@ private Optional computeEnclosingRange(Tree tree) { return Optional.empty(); } - private String sourceText() { - if (source != null) return source; + private static String sourceText(CompilationUnitTree tree) { try { - source = compUnitTree.getSourceFile().getCharContent(true).toString(); + return tree.getSourceFile().getCharContent(true).toString(); } catch (IOException e) { - source = ""; + return ""; } - return source; } private List semanticdbParentSymbols(TypeElement typeElement) { diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbOptionBuilder.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbOptionBuilder.java index 0f2e43e24..9a2b15988 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbOptionBuilder.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbOptionBuilder.java @@ -23,8 +23,6 @@ public class SemanticdbOptionBuilder { private static final String TARGETROOT = System.getProperty("semanticdb.targetroot", ""); private static final String OUTPUT = System.getProperty("semanticdb.output", ""); private static final String OLD_OUTPUT = System.getProperty("semanticdb.old-output", ""); - private static final boolean EMIT_SCIP = - Boolean.parseBoolean(System.getProperty("semanticdb.emit-scip", "false")); public void processArgument(String arg) { oldArgs.add(arg); @@ -64,10 +62,8 @@ private String wrapQuote(String arg) { } private String xpluginOption() { - String emitScip = EMIT_SCIP ? " -emit-scip:on" : ""; return String.format( - "\"-Xplugin:semanticdb -sourceroot:%s -targetroot:%s%s\"", - SOURCEROOT, TARGETROOT, emitScip); + "\"-Xplugin:semanticdb -sourceroot:%s -targetroot:%s\"", SOURCEROOT, TARGETROOT); } public ArrayList finalResult() { diff --git a/tests/unit/src/test/scala/tests/ScipAggregationSuite.scala b/tests/unit/src/test/scala/tests/ScipAggregationSuite.scala index d6281a9c8..000f5d11b 100644 --- a/tests/unit/src/test/scala/tests/ScipAggregationSuite.scala +++ b/tests/unit/src/test/scala/tests/ScipAggregationSuite.scala @@ -16,9 +16,9 @@ import com.sourcegraph.scip_semanticdb.{ import munit.FunSuite // End-to-end test for the SCIP shard aggregation pipeline: compile Java with -// -emit-scip:on, run ScipShardAggregator over the produced META-INF/scip -// shards, and assert the final index.scip is well-formed and uses the -// scip-java symbol scheme. +// the default shard emission, run ScipShardAggregator over the produced +// META-INF/scip shards, and assert the final index.scip is well-formed and +// uses the scip-java symbol scheme. class ScipAggregationSuite extends FunSuite { private val source = @@ -41,7 +41,7 @@ class ScipAggregationSuite extends FunSuite { compiler.compile( Seq(source), Seq( - s"-Xplugin:semanticdb -emit-scip:on -text:on -sourceroot:$sourceroot -targetroot:$targetroot" + s"-Xplugin:semanticdb -text:on -sourceroot:$sourceroot -targetroot:$targetroot" ) ) assert(result.isSuccess, s"javac failed:\n${result.stdout}") diff --git a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala index 44a2c3fbd..cc3544fea 100644 --- a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala +++ b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala @@ -10,8 +10,8 @@ import com.sourcegraph.semanticdb_javac.ScipSymbols import munit.FunSuite /** - * Verifies that the `-emit-scip:on` plugin flag produces a parseable `*.scip` - * shard alongside the existing `*.semanticdb` file. + * Verifies that the plugin produces a parseable `*.scip` shard alongside the + * existing `*.semanticdb` file by default, and that `-emit-scip:off` disables it. */ class ScipShardEmissionSuite extends FunSuite { @@ -28,7 +28,7 @@ class ScipShardEmissionSuite extends FunSuite { |""".stripMargin ) - test("compiler emits a parseable SCIP shard when -emit-scip:on is set") { + test("compiler emits a parseable SCIP shard by default") { val targetroot = Files.createTempDirectory("scip-shard-emission-") val sourceroot = Files.createTempDirectory("scip-shard-emission-src-") val compiler = @@ -36,7 +36,7 @@ class ScipShardEmissionSuite extends FunSuite { val result = compiler.compile( Seq(source), Seq( - s"-Xplugin:semanticdb -emit-scip:on -text:on -sourceroot:$sourceroot -targetroot:$targetroot" + s"-Xplugin:semanticdb -text:on -sourceroot:$sourceroot -targetroot:$targetroot" ) ) assert(result.isSuccess, s"javac failed:\n${result.stdout}") diff --git a/tests/unit/src/test/scala/tests/ScipSymbolsSuite.scala b/tests/unit/src/test/scala/tests/ScipSymbolsSuite.scala index cf9708ddd..c15d7e7d9 100644 --- a/tests/unit/src/test/scala/tests/ScipSymbolsSuite.scala +++ b/tests/unit/src/test/scala/tests/ScipSymbolsSuite.scala @@ -33,17 +33,6 @@ class ScipSymbolsSuite extends FunSuite { assertEquals(ScipSymbols.fromSemanticdbSymbol(null), "") } - test("isPlaceholderGlobal recognises the prefix") { - assert(ScipSymbols.isPlaceholderGlobal(". . . . a/b#")) - assert(!ScipSymbols.isPlaceholderGlobal("local 1")) - assert(!ScipSymbols.isPlaceholderGlobal("scip-java maven g a v a/b#")) - } - - test("descriptorPath strips the placeholder prefix") { - assertEquals(ScipSymbols.descriptorPath(". . . . a/b#"), "a/b#") - assertEquals(ScipSymbols.descriptorPath("local 1"), "local 1") - } - // A PackageTable built with no packages — packageForSymbol always returns empty // unless the JDK classfile is on the classpath. Override defensively just in case. private lazy val emptyPackages: PackageTable = From 19b0f86a90a3fd70bf1ceb2dc9d9503df3bdb5e5 Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:27:58 +0200 Subject: [PATCH 09/21] PR2 (K1): passive Kotlin SCIP shard infrastructure Add the scaffolding required for the Kotlin compiler plug-in to emit SCIP shards directly, mirroring the Java side from PR1. This commit is passive: the new types are not wired into the analyzer yet, so behavior is unchanged. - semanticdb-kotlinc now depends on scipProto so it can reference the generated SCIP protobuf types. - ScipSymbols: placeholder symbol formatter that produces the same '. . . . ' globals and canonical 'local N' locals the aggregator already understands. - ScipOccurrences: deduplicates occurrences by (symbol, range, roles), preferring entries that carry an enclosing_range. - ScipShardWriter: writes a per-source-file Scip.Index shard with overwrite semantics, matching ScipShardWriter on the Java side. - ScipTextDocumentBuilder: assembles a Scip.Document for one source using the above helpers. --- build.sbt | 1 + .../semanticdb_kotlinc/ScipOccurrences.kt | 40 +++ .../semanticdb_kotlinc/ScipShardWriter.kt | 27 ++ .../semanticdb_kotlinc/ScipSymbols.kt | 42 +++ .../ScipTextDocumentBuilder.kt | 322 ++++++++++++++++++ 5 files changed, 432 insertions(+) create mode 100644 semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipOccurrences.kt create mode 100644 semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipShardWriter.kt create mode 100644 semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipSymbols.kt create mode 100644 semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipTextDocumentBuilder.kt diff --git a/build.sbt b/build.sbt index b754d3b93..9f0cc37ad 100644 --- a/build.sbt +++ b/build.sbt @@ -440,6 +440,7 @@ lazy val semanticdbKotlinc = project Attributed.blank(dir) } ) + .dependsOn(scipProto) // `semanticdbKotlincMinimized` mirrors the (still-present) Gradle build at // semanticdb-kotlinc/minimized/build.gradle.kts. It compiles a small set of diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipOccurrences.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipOccurrences.kt new file mode 100644 index 000000000..3123f2e8a --- /dev/null +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipOccurrences.kt @@ -0,0 +1,40 @@ +package com.sourcegraph.semanticdb_kotlinc + +import com.sourcegraph.Scip + +/** + * Helpers for deduplicating SCIP [Scip.Occurrence] entries by their `(symbol, range, roles)` key. + * + * Variants that differ only in whether `enclosing_range` is set are collapsed, preferring the one + * that carries the enclosing range. Mirrors the Java `ScipOccurrences` helper used by the javac + * plug-in. + */ +internal object ScipOccurrences { + + /** Returns a new list with duplicate occurrences collapsed in insertion order. */ + fun deduplicate(occurrences: List): List { + val out = LinkedHashMap() + for (occ in occurrences) put(out, occ) + return out.values.toList() + } + + /** Inserts [occ] into [out], collapsing duplicates by [Key]. */ + fun put(out: LinkedHashMap, occ: Scip.Occurrence) { + val key = Key.of(occ) + val existing = out[key] + if (existing == null) { + out[key] = occ + return + } + if (existing.enclosingRangeCount == 0 && occ.enclosingRangeCount > 0) { + out[key] = occ + } + } + + data class Key(val symbol: String, val range: List, val roles: Int) { + companion object { + fun of(occ: Scip.Occurrence): Key = + Key(occ.symbol, occ.rangeList.toList(), occ.symbolRoles) + } + } +} diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipShardWriter.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipShardWriter.kt new file mode 100644 index 000000000..947812c77 --- /dev/null +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipShardWriter.kt @@ -0,0 +1,27 @@ +package com.sourcegraph.semanticdb_kotlinc + +import com.sourcegraph.Scip +import java.nio.file.Files +import java.nio.file.Path + +/** + * Writes per-source SCIP shards produced by the Kotlin compiler plug-in. + * + * Each Kotlin source file produces a self-contained [Scip.Index] shard containing a single + * [Scip.Document]. Unlike the javac equivalent, kotlinc compiles each source file once per round + * and we delete stale shards on [delete] before re-emitting, so the writer is a straightforward + * overwrite — no merge step is necessary. + */ +internal object ScipShardWriter { + + /** Writes the given [shard] to [output], creating parent directories as needed. */ + fun write(output: Path, shard: Scip.Index) { + Files.createDirectories(output.parent) + Files.write(output, shard.toByteArray()) + } + + /** Removes a previously emitted shard at [output], if any. */ + fun delete(output: Path) { + Files.deleteIfExists(output) + } +} diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipSymbols.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipSymbols.kt new file mode 100644 index 000000000..7ebc2b51b --- /dev/null +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipSymbols.kt @@ -0,0 +1,42 @@ +package com.sourcegraph.semanticdb_kotlinc + +/** + * Helpers for emitting SCIP symbol strings from the Kotlin compiler plug-in. + * + * Mirrors the Java `ScipSymbols` helper. Because the compiler plug-in does not know the final + * Maven coordinates (`groupId:artifactId:version`) at compile time, it emits global symbols using + * a sentinel placeholder scheme that is rewritten by the aggregator to its final form: + * + * `. . . . ` + + * -> "scip-java maven " + * + * Local symbols are emitted using the canonical SCIP `local N` form (with the space) and are NOT + * rewritten by the aggregator. + */ +object ScipSymbols { + + /** + * Prefix marking a global symbol whose package coordinates must be filled in by the aggregator. + * The trailing space matches the SCIP grammar requirement of separating the scheme from the + * package fields. + */ + const val PLACEHOLDER_PREFIX: String = ". . . . " + + /** + * Converts a SemanticDB-style symbol string into the SCIP symbol form expected by the + * aggregator. + * + * - Empty strings stay empty. + * - Local symbols of the form `local42` become `local 42`. + * - Everything else is prefixed with [PLACEHOLDER_PREFIX]. + */ + fun fromSemanticdbSymbol(symbol: String?): String { + if (symbol.isNullOrEmpty()) return "" + if (symbol.startsWith("local")) { + return "local " + symbol.substring("local".length) + } + return PLACEHOLDER_PREFIX + symbol + } + + fun fromSemanticdbSymbol(symbol: Symbol): String = fromSemanticdbSymbol(symbol.toString()) +} diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipTextDocumentBuilder.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipTextDocumentBuilder.kt new file mode 100644 index 000000000..f03187404 --- /dev/null +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipTextDocumentBuilder.kt @@ -0,0 +1,322 @@ +package com.sourcegraph.semanticdb_kotlinc + +import com.sourcegraph.Scip +import com.sourcegraph.semanticdb_kotlinc.Semanticdb.SymbolOccurrence.Role +import kotlin.contracts.ExperimentalContracts +import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.KtSourceFile +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.directOverriddenSymbolsSafe +import org.jetbrains.kotlin.fir.analysis.checkers.toClassLikeSymbol +import org.jetbrains.kotlin.fir.analysis.getChild +import org.jetbrains.kotlin.fir.renderer.* +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.SymbolInternals +import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.fir.types.impl.FirImplicitAnyTypeRef +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.text + +/** + * Builds a single-document [Scip.Index] shard for one Kotlin source file from per-element callbacks + * fired by [SemanticdbVisitor]. This is the SCIP analogue of [SemanticdbTextDocumentBuilder]. + * + * Symbols are emitted using the placeholder scheme [ScipSymbols.PLACEHOLDER_PREFIX]; the + * `scip-aggregator` rewrites them into final `scip-java maven g a v ...` form once Maven + * coordinates are resolved. + * + * Signature documentation is rendered directly via [FirRenderer] (Kotlin's built-in declaration + * renderer) and assigned to `SymbolInformation.signature_documentation.text` as raw Kotlin source. + */ +@ExperimentalContracts +class ScipTextDocumentBuilder( + private val file: KtSourceFile, + private val lineMap: LineMap, + private val cache: SymbolsCache, + private val relativePath: String, +) { + private val occurrences = mutableListOf() + // Keyed by symbol string so re-encounters of the same definition (multi-round compilation, + // synthetic accessors) do not produce duplicate entries. + private val symbols = LinkedHashMap() + + fun build(): Scip.Document = + Scip + .Document + .newBuilder() + .setRelativePath(relativePath) + .setLanguage(LANGUAGE_KOTLIN) + .addAllOccurrences(ScipOccurrences.deduplicate(occurrences)) + .addAllSymbols(symbols.values) + .build() + + fun buildIndex(): Scip.Index = Scip.Index.newBuilder().addDocuments(build()).build() + + fun emitScipData( + firBasedSymbol: FirBasedSymbol<*>?, + symbol: Symbol, + element: KtSourceElement, + role: Role, + context: CheckerContext, + enclosingSource: KtSourceElement? = null, + ) { + if (symbol == Symbol.NONE) return + + emitOccurrence(symbol, element, role, enclosingSource) + if (role == Role.DEFINITION) { + emitSymbolInformation(firBasedSymbol, symbol, element, context) + } + } + + private fun emitOccurrence( + symbol: Symbol, + element: KtSourceElement, + role: Role, + enclosingSource: KtSourceElement?, + ) { + val builder = + Scip + .Occurrence + .newBuilder() + .addAllRange(scipRange(element)) + .setSymbol(ScipSymbols.fromSemanticdbSymbol(symbol)) + .setSymbolRoles(scipRole(role)) + if (enclosingSource != null) { + builder.addAllEnclosingRange(scipEnclosingRange(enclosingSource)) + } + occurrences.add(builder.build()) + } + + @OptIn(SymbolInternals::class) + private fun emitSymbolInformation( + firBasedSymbol: FirBasedSymbol<*>?, + symbol: Symbol, + element: KtSourceElement, + context: CheckerContext, + ) { + val scipSymbolStr = ScipSymbols.fromSemanticdbSymbol(symbol) + val builder = + Scip + .SymbolInformation + .newBuilder() + .setSymbol(scipSymbolStr) + .setDisplayName(displayName(firBasedSymbol, element)) + .setKind(scipKind(firBasedSymbol)) + + if (symbol.isLocal()) { + // Locals are convenient to navigate from when the enclosing symbol is known. + // We don't have direct access to the enclosing FirBasedSymbol here, but the + // information is non-essential — leaving enclosing_symbol unset is fine. + } + + val signature = signatureText(firBasedSymbol) + if (signature.isNotEmpty()) { + builder.setSignatureDocumentation( + Scip.Document.newBuilder() + .setLanguage(LANGUAGE_KOTLIN) + .setRelativePath(relativePath) + .setText(signature)) + } + + val kdoc = kdocText(firBasedSymbol) + if (kdoc.isNotEmpty()) { + builder.addDocumentation(kdoc) + } + + val supportsRefRel = supportsReferenceRelationship(firBasedSymbol) + for (parent in parentOrOverriddenSymbols(firBasedSymbol, context)) { + val parentSymbolStr = ScipSymbols.fromSemanticdbSymbol(parent) + if (parentSymbolStr.isEmpty()) continue + builder.addRelationships( + Scip.Relationship.newBuilder() + .setSymbol(parentSymbolStr) + .setIsImplementation(true) + .setIsReference(supportsRefRel)) + } + + // Last write wins so newly discovered metadata takes precedence. + symbols[scipSymbolStr] = builder.build() + } + + @OptIn(SymbolInternals::class) + private fun parentOrOverriddenSymbols( + firBasedSymbol: FirBasedSymbol<*>?, + context: CheckerContext, + ): List { + return when (firBasedSymbol) { + is FirClassSymbol -> + firBasedSymbol + .resolvedSuperTypeRefs + .filter { it !is FirImplicitAnyTypeRef } + .mapNotNull { it.toClassLikeSymbol(firBasedSymbol.moduleData.session) } + .flatMap { cache[it].toList() } + is FirFunctionSymbol<*> -> + firBasedSymbol + .directOverriddenSymbolsSafe(context) + .flatMap { cache[it].toList() } + else -> emptyList() + } + } + + private fun supportsReferenceRelationship(firBasedSymbol: FirBasedSymbol<*>?): Boolean { + return when (firBasedSymbol) { + is FirClassSymbol, + is FirTypeAliasSymbol -> false + else -> true + } + } + + private fun scipRange(element: KtSourceElement): List { + val startLine = lineMap.lineNumber(element) - 1 + val startCharacter = lineMap.startCharacter(element) + val endCharacter = lineMap.endCharacter(element) + // SemanticDB visitor only emits single-line ranges, so the SCIP compact 3-int range + // form is sufficient here. + return listOf(startLine, startCharacter, endCharacter) + } + + private fun scipEnclosingRange(element: KtSourceElement): List { + val startLine = lineMap.lineNumber(element) - 1 + val startCharacter = lineMap.startCharacter(element) + val endLine = lineMap.lineNumberForOffset(element.endOffset) - 1 + val endCharacter = lineMap.columnForOffset(element.endOffset) + return if (startLine == endLine) { + listOf(startLine, startCharacter, endCharacter) + } else { + listOf(startLine, startCharacter, endLine, endCharacter) + } + } + + @OptIn(SymbolInternals::class) + private fun signatureText(firBasedSymbol: FirBasedSymbol<*>?): String { + if (firBasedSymbol == null) return "" + return try { + renderer.renderElementAsString(firBasedSymbol.fir).trimEnd() + } catch (_: Throwable) { + "" + } + } + + private fun kdocText(firBasedSymbol: FirBasedSymbol<*>?): String { + if (firBasedSymbol == null) return "" + val kdoc = + firBasedSymbol.source?.getChild(KtTokens.DOC_COMMENT)?.text?.toString() ?: return "" + return stripKDocAsterisks(kdoc) + } + + /** + * Returns the kdoc string with all leading and trailing slash/asterisk tokens removed. Naive + * implementation that can be replaced with a utility method from the compiler in the future, + * if one exists. + */ + private fun stripKDocAsterisks(kdoc: String): String { + if (kdoc.isEmpty()) return kdoc + val out = StringBuilder() + kdoc.lineSequence().forEach { line -> + if (line.isEmpty()) return@forEach + var start = 0 + while (start < line.length && line[start].isWhitespace()) { + start++ + } + if (start < line.length && line[start] == '/') { + start++ + } + while (start < line.length && line[start] == '*') { + start++ + } + var end = line.length - 1 + if (end > start && line[end] == '/') { + end-- + } + while (end > start && line[end] == '*') { + end-- + } + while (end > start && line[end].isWhitespace()) { + end-- + } + start = minOf(start, line.length - 1) + if (end > start) { + end++ + } + if (out.isNotEmpty()) out.append('\n') + out.append(line, start, end) + } + return out.toString() + } + + companion object { + // SCIP `Document.language` value; lowercased to match the SCIP convention used by + // existing aggregator code. + const val LANGUAGE_KOTLIN: String = "kotlin" + + @OptIn(SymbolInternals::class) + private fun displayName( + firBasedSymbol: FirBasedSymbol<*>?, + element: KtSourceElement, + ): String = + when (firBasedSymbol) { + null -> element.text?.toString() ?: "" + is FirClassSymbol -> firBasedSymbol.classId.shortClassName.asString() + is FirPropertyAccessorSymbol -> firBasedSymbol.fir.propertySymbol.name.asString() + is FirFunctionSymbol<*> -> firBasedSymbol.callableId.callableName.asString() + is FirPropertySymbol -> firBasedSymbol.callableId.callableName.asString() + is FirVariableSymbol<*> -> firBasedSymbol.name.asString() + else -> firBasedSymbol.toString() + } + + private fun scipRole(role: Role): Int = + when (role) { + Role.DEFINITION -> Scip.SymbolRole.Definition_VALUE + else -> 0 + } + + private fun scipKind(firBasedSymbol: FirBasedSymbol<*>?): Scip.SymbolInformation.Kind = + when (firBasedSymbol) { + null -> Scip.SymbolInformation.Kind.UnspecifiedKind + is FirRegularClassSymbol -> + when (firBasedSymbol.classKind) { + org.jetbrains.kotlin.descriptors.ClassKind.INTERFACE -> + Scip.SymbolInformation.Kind.Interface + org.jetbrains.kotlin.descriptors.ClassKind.ENUM_CLASS -> + Scip.SymbolInformation.Kind.Enum + org.jetbrains.kotlin.descriptors.ClassKind.ENUM_ENTRY -> + Scip.SymbolInformation.Kind.EnumMember + org.jetbrains.kotlin.descriptors.ClassKind.OBJECT -> + Scip.SymbolInformation.Kind.Object + org.jetbrains.kotlin.descriptors.ClassKind.ANNOTATION_CLASS -> + Scip.SymbolInformation.Kind.Interface + else -> Scip.SymbolInformation.Kind.Class + } + is FirAnonymousObjectSymbol -> Scip.SymbolInformation.Kind.Object + is FirTypeAliasSymbol -> Scip.SymbolInformation.Kind.TypeAlias + is FirConstructorSymbol -> Scip.SymbolInformation.Kind.Constructor + is FirPropertyAccessorSymbol -> Scip.SymbolInformation.Kind.Method + is FirFunctionSymbol<*> -> Scip.SymbolInformation.Kind.Method + is FirPropertySymbol -> Scip.SymbolInformation.Kind.Property + is FirFieldSymbol -> Scip.SymbolInformation.Kind.Field + is FirEnumEntrySymbol -> Scip.SymbolInformation.Kind.EnumMember + is FirValueParameterSymbol -> Scip.SymbolInformation.Kind.Parameter + is FirTypeParameterSymbol -> Scip.SymbolInformation.Kind.TypeParameter + is FirVariableSymbol<*> -> Scip.SymbolInformation.Kind.Variable + else -> Scip.SymbolInformation.Kind.UnspecifiedKind + } + + // Mirrors the renderer used by SemanticdbTextDocumentBuilder for parity. We render the + // declaration as Kotlin source text — no markdown fence — and put it into + // SymbolInformation.signature_documentation.text. + private val renderer: FirRenderer + get() = + FirRenderer( + typeRenderer = ConeTypeRenderer(), + idRenderer = ConeIdShortRenderer(), + classMemberRenderer = FirNoClassMemberRenderer(), + bodyRenderer = null, + propertyAccessorRenderer = null, + callArgumentsRenderer = FirCallNoArgumentsRenderer(), + modifierRenderer = FirAllModifierRenderer(), + callableSignatureRenderer = + FirCallableSignatureRendererForReadability(), + declarationRenderer = FirDeclarationRenderer("local "), + ) + } +} From 0c52c980230eae009ea3f67e1d1713fef15daeb4 Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:28:05 +0200 Subject: [PATCH 10/21] PR2 (K2): dual-emit SemanticDB + SCIP shards from semanticdb-kotlinc Wire the Kotlin compiler plug-in so a single analyzer pass populates both the existing SemanticdbTextDocumentBuilder and the new ScipTextDocumentBuilder. The PostAnalysisExtension now writes: - META-INF/semanticdb/.semanticdb (unchanged) - META-INF/scip/.scip (new) Behavior of consumers that still read .semanticdb is preserved; the companion CLI change to actually consume the .scip shards lands in K4. Legacy SemanticDB emission is intentionally kept for now and will be removed in a later cleanup PR. --- .../PostAnalysisExtension.kt | 29 ++++++++++++++----- .../semanticdb_kotlinc/SemanticdbVisitor.kt | 23 +++++++++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/PostAnalysisExtension.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/PostAnalysisExtension.kt index d002b7fbb..8c4718693 100644 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/PostAnalysisExtension.kt +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/PostAnalysisExtension.kt @@ -30,6 +30,9 @@ class PostAnalysisExtension( semanticdbOutPathForFile(ktSourceFile)?.apply { Files.write(this, TextDocuments { addDocuments(document) }.toByteArray()) } + scipShardOutPathForFile(ktSourceFile)?.apply { + ScipShardWriter.write(this, visitor.buildScipIndex()) + } callback(document) } catch (e: Exception) { handleException(e) @@ -40,23 +43,33 @@ class PostAnalysisExtension( } } - private fun semanticdbOutPathForFile(file: KtSourceFile): Path? { + private fun semanticdbOutPathForFile(file: KtSourceFile): Path? = + outPathForFile(file, subdir = "semanticdb", suffix = ".semanticdb") + + private fun scipShardOutPathForFile(file: KtSourceFile): Path? = + outPathForFile(file, subdir = "scip", suffix = ".scip") + + private fun outPathForFile(file: KtSourceFile, subdir: String, suffix: String): Path? { val normalizedPath = Paths.get(file.path).normalize() if (normalizedPath.startsWith(sourceRoot)) { val relative = sourceRoot.relativize(normalizedPath) - val filename = relative.fileName.toString() + ".semanticdb" - val semanticdbOutPath = + val filename = relative.fileName.toString() + suffix + val outPath = targetRoot .resolve("META-INF") - .resolve("semanticdb") + .resolve(subdir) .resolve(relative) .resolveSibling(filename) - Files.createDirectories(semanticdbOutPath.parent) - return semanticdbOutPath + Files.createDirectories(outPath.parent) + return outPath + } + // Only warn once across both files; the SemanticDB path is the canonical pre-existing + // emission, so we keep the warning attached to it. + if (subdir == "semanticdb") { + System.err.println( + "given file is not under the sourceroot.\n\tSourceroot: $sourceRoot\n\tFile path: ${file.path}\n\tNormalized file path: $normalizedPath") } - System.err.println( - "given file is not under the sourceroot.\n\tSourceroot: $sourceRoot\n\tFile path: ${file.path}\n\tNormalized file path: $normalizedPath") return null } diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbVisitor.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbVisitor.kt index 2fa28c96f..9247dd4b1 100644 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbVisitor.kt +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbVisitor.kt @@ -1,7 +1,9 @@ package com.sourcegraph.semanticdb_kotlinc +import com.sourcegraph.Scip import com.sourcegraph.semanticdb_kotlinc.Semanticdb.SymbolOccurrence.Role import java.nio.file.Path +import java.nio.file.Paths import kotlin.contracts.ExperimentalContracts import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceFile @@ -22,7 +24,9 @@ class SemanticdbVisitor( locals: LocalSymbolsCache = LocalSymbolsCache() ) { private val cache = SymbolsCache(globals, locals) + private val relativePath: String = computeRelativePath(sourceroot, file) private val documentBuilder = SemanticdbTextDocumentBuilder(sourceroot, file, lineMap, cache) + private val scipBuilder = ScipTextDocumentBuilder(file, lineMap, cache, relativePath) private data class SymbolDescriptorPair( val firBasedSymbol: FirBasedSymbol<*>?, @@ -33,6 +37,10 @@ class SemanticdbVisitor( return documentBuilder.build() } + fun buildScipIndex(): Scip.Index = scipBuilder.buildIndex() + + fun scipRelativePath(): String = relativePath + private fun Sequence?.emitAll( element: KtSourceElement, role: Role, @@ -41,6 +49,7 @@ class SemanticdbVisitor( ): List? = this?.onEach { (firBasedSymbol, symbol) -> documentBuilder.emitSemanticdbData(firBasedSymbol, symbol, element, role, context, enclosingSource) + scipBuilder.emitScipData(firBasedSymbol, symbol, element, role, context, enclosingSource) } ?.map { it.symbol } ?.toList() @@ -112,3 +121,17 @@ class SemanticdbVisitor( } } +/** + * Computes the SCIP `Document.relative_path` for [file] relative to [sourceroot]. Falls back to + * the raw file path if the file is not under the sourceroot (the PostAnalysisExtension warns and + * skips writing in that case, so the value is best-effort here). + */ +private fun computeRelativePath(sourceroot: Path, file: KtSourceFile): String { + val normalized = Paths.get(file.path ?: "").normalize() + return if (normalized.startsWith(sourceroot)) { + sourceroot.relativize(normalized).toString().replace('\\', '/') + } else { + normalized.toString().replace('\\', '/') + } +} + From 26a34c20f73b41f1b82d57f50a9804411e139d83 Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:28:13 +0200 Subject: [PATCH 11/21] PR2 (K3): make scip-semanticdb aggregator shard-walk safe Two small robustness fixes uncovered while validating PR2 end-to-end: - ScipWriter.build(): create parent directories before moving the temporary aggregated output into place so callers may target paths whose enclosing directory does not yet exist (e.g. target/scip-index/). - ScipShardWalker: restrict the walk to files under META-INF/scip/ so an aggregated index.scip co-located inside a targetroot is not re-ingested as a shard on subsequent runs. --- .../com/sourcegraph/scip_semanticdb/ScipShardWalker.java | 9 ++++++--- .../java/com/sourcegraph/scip_semanticdb/ScipWriter.java | 4 ++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardWalker.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardWalker.java index 7122969fe..04dbfff39 100644 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardWalker.java +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipShardWalker.java @@ -12,13 +12,16 @@ import java.util.List; /** - * A file visitor that recursively collects all SCIP shard files ({@code *.scip}) under the - * configured targetroots. + * A file visitor that recursively collects per-source SCIP shard files ({@code *.scip}) emitted by + * the compiler plug-ins. Only files under a {@code META-INF/scip/} directory are returned so we + * don't accidentally re-ingest a previously-written aggregate {@code index.scip} that may live in + * the same target tree. */ public class ScipShardWalker extends SimpleFileVisitor { private final ArrayList result; private final ScipSemanticdbOptions options; - private final PathMatcher scipPattern = FileSystems.getDefault().getPathMatcher("glob:**.scip"); + private final PathMatcher scipPattern = + FileSystems.getDefault().getPathMatcher("glob:**/META-INF/scip/**.scip"); public ScipShardWalker(ScipSemanticdbOptions options) { this.options = options; diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipWriter.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipWriter.java index 2b323740b..3a16d7db5 100644 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipWriter.java +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipWriter.java @@ -49,6 +49,10 @@ public void emitTyped(Scip.Index index) { public void build() throws IOException { close(); + Path parent = options.output.getParent(); + if (parent != null) { + Files.createDirectories(parent); + } Files.move(tmp, options.output, StandardCopyOption.REPLACE_EXISTING); } From 0ed5d469e6419d9d9e7da4f1d8a4f5773c202def Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:28:21 +0200 Subject: [PATCH 12/21] PR2 (K4): default index-semanticdb to shard consumption Now that both javac and kotlinc emit .scip shards under META-INF/scip/, switch the CLI default to read from those shards and update build wiring + a unit fixture that asserted the old scheme. - IndexSemanticdbCommand: --use-scip-shards defaults to true; the help text reflects that javac and kotlinc both ship shards. - build.sbt (kotlincSnapshots task): pass --use-scip-shards and write the aggregated index.scip into target/scip-index/ so the next invocation does not walk over its own previous output. - SnapshotCommandSuite: expected symbol scheme is now 'scip-java maven ...' instead of 'semanticdb maven ...'. --- build.sbt | 9 ++++++--- .../commands/IndexSemanticdbCommand.scala | 8 +++++--- .../scala/tests/SnapshotCommandSuite.scala | 19 ++++++++++--------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/build.sbt b/build.sbt index 9f0cc37ad..e5ccc5aeb 100644 --- a/build.sbt +++ b/build.sbt @@ -525,15 +525,18 @@ lazy val semanticdbKotlincMinimized = project val snapDir = (baseDirectory.value / "src" / "generatedSnapshots" / "resources") .getAbsolutePath - val scipOut = s"$tgtRoot/index.scip" + // Place the aggregated `index.scip` outside the shard-scanned + // targetroot so a subsequent run doesn't re-ingest it as a shard. + val scipOut = (target.value / "scip-index" / "index.scip") + .getAbsolutePath val mainCls = "com.sourcegraph.scip_java.ScipJava" Def.sequential( Compile / compile, (cli / Compile / runMain).toTask( - s" $mainCls index-semanticdb --no-emit-inverse-relationships --cwd $srcRoot --output $scipOut $tgtRoot" + s" $mainCls index-semanticdb --no-emit-inverse-relationships --use-scip-shards --cwd $srcRoot --output $scipOut $tgtRoot" ), (cli / Compile / runMain).toTask( - s" $mainCls snapshot --cwd $srcRoot --output $snapDir $tgtRoot" + s" $mainCls snapshot --cwd $srcRoot --output $snapDir ${file(scipOut).getParentFile.getAbsolutePath}" ) ) } diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala index f3f32a00d..998f86e7b 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala @@ -63,11 +63,13 @@ final case class IndexSemanticdbCommand( allowExportingGlobalSymbolsFromDirectoryEntries: Boolean = true, @Description( "If true, walk targetroots for *.scip shards (META-INF/scip/...) emitted by the " + - "compiler plugin instead of *.semanticdb files. The aggregator rewrites placeholder " + + "compiler plug-ins instead of *.semanticdb files. The aggregator rewrites placeholder " + "symbols into the final 'scip-java' scheme and merges per-source shards into the " + - "output index." + "output index. Defaults to true now that both the javac and kotlinc plug-ins emit " + + "shards. Pass --use-scip-shards=false to fall back to the legacy SemanticDB-based " + + "aggregator." ) - useScipShards: Boolean = false, + useScipShards: Boolean = true, @Inline() app: Application = Application.default ) extends Command { diff --git a/tests/unit/src/test/scala/tests/SnapshotCommandSuite.scala b/tests/unit/src/test/scala/tests/SnapshotCommandSuite.scala index aa4a89fb0..2c359d4b1 100644 --- a/tests/unit/src/test/scala/tests/SnapshotCommandSuite.scala +++ b/tests/unit/src/test/scala/tests/SnapshotCommandSuite.scala @@ -57,37 +57,38 @@ class SnapshotCommandSuite extends MopedSuite(ScipJava.app) { | /** | * Sample class | */ - |//⌄ enclosing_range_start semanticdb maven . . main/Sample# + |//⌄ enclosing_range_start scip-java maven . . main/Sample# | public class Sample { - |// ^^^^^^ definition semanticdb maven . . main/Sample# + |// ^^^^^^ definition scip-java maven . . main/Sample# |// display_name Sample |// signature_documentation java public class Sample |// kind Class |// documentation Sample class\n - |// ^^^^^^ definition semanticdb maven . . main/Sample#``(). + |// ^^^^^^ definition scip-java maven . . main/Sample#``(). |// display_name |// signature_documentation java public Sample() |// kind Constructor | /** | * Main application entry point | */ - |// ⌄ enclosing_range_start semanticdb maven . . main/Sample#main(). + |// ⌄ enclosing_range_start scip-java maven . . main/Sample#main(). |// ⌄ enclosing_range_start local 0 | public static void main(String[] asdf) {} - |// ^^^^ definition semanticdb maven . . main/Sample#main(). + |// ^^^^ definition scip-java maven . . main/Sample#main(). |// display_name main |// signature_documentation java public static void main(String[] asdf) |// kind StaticMethod |// documentation Main application entry point\n - |// ^^^^^^ reference semanticdb maven jdk 11 java/lang/String# + |// ^^^^^^ reference scip-java maven jdk 11 java/lang/String# |// ^^^^ definition local 0 |// display_name asdf |// signature_documentation java String[] asdf - |// enclosing_symbol semanticdb maven . . main/Sample#main(). + |// enclosing_symbol scip-java maven . . main/Sample#main(). + |// kind Parameter |// ⌃ enclosing_range_end local 0 - |// ⌃ enclosing_range_end semanticdb maven . . main/Sample#main(). + |// ⌃ enclosing_range_end scip-java maven . . main/Sample#main(). | } - |//⌃ enclosing_range_end semanticdb maven . . main/Sample# + |//⌃ enclosing_range_end scip-java maven . . main/Sample# |""".stripMargin ) } From b1c568161823ddf89a21996b13929c5d5dfa6c44 Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:28:33 +0200 Subject: [PATCH 13/21] PR2 (K5): regenerate Kotlin minimized snapshots Outputs reflect the new direct-from-SCIP scheme: - symbols are emitted under 'scip-java maven ...' instead of the legacy 'semanticdb maven ...' scheme, - Kotlin symbol info now carries SCIP-native fields such as 'signature_documentation kotlin ...' and 'kind ...'. Regenerated with: sbt 'snapshots/Test/runMain tests.SaveSnapshots' --- .../main/java/snapshots/ClassConsumer.java | 24 +-- .../java/snapshots/CompanionConsumer.java | 22 +- .../src/main/java/snapshots/KotlinClass.java | 36 ++-- .../main/java/snapshots/KotlinLambdas.java | 42 ++-- .../main/java/snapshots/ObjectKtConsumer.java | 20 +- .../src/main/kotlin/snapshots/Class.kt | 195 ++++++++++-------- .../main/kotlin/snapshots/CompanionOwner.kt | 66 +++--- .../src/main/kotlin/snapshots/Docstrings.kt | 64 +++--- .../src/main/kotlin/snapshots/Functions.kt | 26 +-- .../main/kotlin/snapshots/Implementations.kt | 187 +++++++++-------- .../src/main/kotlin/snapshots/Lambdas.kt | 85 ++++---- .../src/main/kotlin/snapshots/ObjectKt.kt | 52 ++--- 12 files changed, 441 insertions(+), 378 deletions(-) diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/ClassConsumer.java b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/ClassConsumer.java index 299966fdd..b50629be4 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/ClassConsumer.java +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/ClassConsumer.java @@ -1,28 +1,28 @@ package snapshots; -//⌄ enclosing_range_start semanticdb maven . . snapshots/ClassConsumer# +//⌄ enclosing_range_start scip-java maven . . snapshots/ClassConsumer# public class ClassConsumer { -// ^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/ClassConsumer# +// ^^^^^^^^^^^^^ definition scip-java maven . . snapshots/ClassConsumer# // display_name ClassConsumer // signature_documentation java public class ClassConsumer // kind Class -// ^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/ClassConsumer#``(). +// ^^^^^^^^^^^^^ definition scip-java maven . . snapshots/ClassConsumer#``(). // display_name // signature_documentation java public ClassConsumer() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . snapshots/ClassConsumer#run(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/ClassConsumer#run(). public static void run() { -// ^^^ definition semanticdb maven . . snapshots/ClassConsumer#run(). +// ^^^ definition scip-java maven . . snapshots/ClassConsumer#run(). // display_name run // signature_documentation java public static void run() // kind StaticMethod System.out.println(new Class().getAsdf()); -// ^^^^^^ reference semanticdb maven jdk 11 java/lang/System# -// ^^^ reference semanticdb maven jdk 11 java/lang/System#out. -// ^^^^^^^ reference semanticdb maven jdk 11 java/io/PrintStream#println(+9). -// ^^^^^ reference semanticdb maven . . snapshots/Class#``(+1). -// ^^^^^^^ reference semanticdb maven . . snapshots/Class#getAsdf(). +// ^^^^^^ reference scip-java maven jdk 11 java/lang/System# +// ^^^ reference scip-java maven jdk 11 java/lang/System#out. +// ^^^^^^^ reference scip-java maven jdk 11 java/io/PrintStream#println(+9). +// ^^^^^ reference scip-java maven . . snapshots/Class#``(+1). +// ^^^^^^^ reference scip-java maven . . snapshots/Class#getAsdf(). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/ClassConsumer#run(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/ClassConsumer#run(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/ClassConsumer# +//⌃ enclosing_range_end scip-java maven . . snapshots/ClassConsumer# diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/CompanionConsumer.java b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/CompanionConsumer.java index 6708477bb..962c6bbce 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/CompanionConsumer.java +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/CompanionConsumer.java @@ -1,25 +1,25 @@ package snapshots; -//⌄ enclosing_range_start semanticdb maven . . snapshots/CompanionConsumer# +//⌄ enclosing_range_start scip-java maven . . snapshots/CompanionConsumer# public class CompanionConsumer { -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/CompanionConsumer# +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionConsumer# // display_name CompanionConsumer // signature_documentation java public class CompanionConsumer // kind Class -// ⌄ enclosing_range_start semanticdb maven . . snapshots/CompanionConsumer#``(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/CompanionConsumer#``(). CompanionConsumer() { -// ^^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/CompanionConsumer#``(). +// ^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionConsumer#``(). // display_name // signature_documentation java CompanionConsumer() // kind Constructor CompanionOwner.Companion.create(); -// ^^^^^^^^^^^^^^ reference semanticdb maven . . snapshots/CompanionOwner# -// ^^^^^^^^^ reference semanticdb maven . . snapshots/CompanionOwner#Companion. -// ^^^^^^ reference semanticdb maven . . snapshots/CompanionOwner#Companion#create(). +// ^^^^^^^^^^^^^^ reference scip-java maven . . snapshots/CompanionOwner# +// ^^^^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#Companion. +// ^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#Companion#create(). new CompanionOwner().create(); -// ^^^^^^^^^^^^^^ reference semanticdb maven . . snapshots/CompanionOwner#``(). -// ^^^^^^ reference semanticdb maven . . snapshots/CompanionOwner#create(). +// ^^^^^^^^^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#``(). +// ^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#create(). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/CompanionConsumer#``(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/CompanionConsumer#``(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/CompanionConsumer# +//⌃ enclosing_range_end scip-java maven . . snapshots/CompanionConsumer# diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/KotlinClass.java b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/KotlinClass.java index 82ea72ed4..77785c36a 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/KotlinClass.java +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/KotlinClass.java @@ -1,45 +1,45 @@ package snapshots; -//⌄ enclosing_range_start semanticdb maven . . snapshots/KotlinClass# +//⌄ enclosing_range_start scip-java maven . . snapshots/KotlinClass# public class KotlinClass { -// ^^^^^^^^^^^ definition semanticdb maven . . snapshots/KotlinClass# +// ^^^^^^^^^^^ definition scip-java maven . . snapshots/KotlinClass# // display_name KotlinClass // signature_documentation java public class KotlinClass // kind Class -// ⌄ enclosing_range_start semanticdb maven . . snapshots/KotlinClass#``(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/KotlinClass#``(). KotlinClass() throws Class { -// ^^^^^^^^^^^ definition semanticdb maven . . snapshots/KotlinClass#``(). +// ^^^^^^^^^^^ definition scip-java maven . . snapshots/KotlinClass#``(). // display_name // signature_documentation java KotlinClass() throws Class // kind Constructor -// ^^^^^ reference semanticdb maven . . snapshots/Class# +// ^^^^^ reference scip-java maven . . snapshots/Class# throw new Class(); -// ^^^^^ reference semanticdb maven . . snapshots/Class#``(+1). +// ^^^^^ reference scip-java maven . . snapshots/Class#``(+1). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/KotlinClass#``(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/KotlinClass#``(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/KotlinClass#test(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/KotlinClass#test(). void test() throws Class { -// ^^^^ definition semanticdb maven . . snapshots/KotlinClass#test(). +// ^^^^ definition scip-java maven . . snapshots/KotlinClass#test(). // display_name test // signature_documentation java void test() throws Class // kind Method -// ^^^^^ reference semanticdb maven . . snapshots/Class# +// ^^^^^ reference scip-java maven . . snapshots/Class# throw new Class(1, ""); -// ^^^^^ reference semanticdb maven . . snapshots/Class#``(). +// ^^^^^ reference scip-java maven . . snapshots/Class#``(). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/KotlinClass#test(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/KotlinClass#test(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/KotlinClass#other(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/KotlinClass#other(). void other() throws Class { -// ^^^^^ definition semanticdb maven . . snapshots/KotlinClass#other(). +// ^^^^^ definition scip-java maven . . snapshots/KotlinClass#other(). // display_name other // signature_documentation java void other() throws Class // kind Method -// ^^^^^ reference semanticdb maven . . snapshots/Class# +// ^^^^^ reference scip-java maven . . snapshots/Class# throw new Class(1); -// ^^^^^ reference semanticdb maven . . snapshots/Class#``(+2). +// ^^^^^ reference scip-java maven . . snapshots/Class#``(+2). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/KotlinClass#other(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/KotlinClass#other(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/KotlinClass# +//⌃ enclosing_range_end scip-java maven . . snapshots/KotlinClass# diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/KotlinLambdas.java b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/KotlinLambdas.java index 4a57bc1d6..b952e169a 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/KotlinLambdas.java +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/KotlinLambdas.java @@ -1,43 +1,43 @@ package snapshots; import kotlin.collections.CollectionsKt; -// ^^^^^^ reference semanticdb maven . . kotlin/ -// ^^^^^^^^^^^ reference semanticdb maven . . kotlin/collections/ -// ^^^^^^^^^^^^^ reference semanticdb maven . . kotlin/collections/CollectionsKt# +// ^^^^^^ reference scip-java maven . . kotlin/ +// ^^^^^^^^^^^ reference scip-java maven . . kotlin/collections/ +// ^^^^^^^^^^^^^ reference scip-java maven . . kotlin/collections/CollectionsKt# import kotlin.text.StringsKt; -// ^^^^^^ reference semanticdb maven . . kotlin/ -// ^^^^ reference semanticdb maven . . kotlin/text/ -// ^^^^^^^^^ reference semanticdb maven . . kotlin/text/StringsKt# +// ^^^^^^ reference scip-java maven . . kotlin/ +// ^^^^ reference scip-java maven . . kotlin/text/ +// ^^^^^^^^^ reference scip-java maven . . kotlin/text/StringsKt# -//⌄ enclosing_range_start semanticdb maven . . snapshots/KotlinLambdas# +//⌄ enclosing_range_start scip-java maven . . snapshots/KotlinLambdas# public class KotlinLambdas { -// ^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/KotlinLambdas# +// ^^^^^^^^^^^^^ definition scip-java maven . . snapshots/KotlinLambdas# // display_name KotlinLambdas // signature_documentation java public class KotlinLambdas // kind Class -// ^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/KotlinLambdas#``(). +// ^^^^^^^^^^^^^ definition scip-java maven . . snapshots/KotlinLambdas#``(). // display_name // signature_documentation java public KotlinLambdas() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . snapshots/KotlinLambdas#test(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/KotlinLambdas#test(). public void test() { -// ^^^^ definition semanticdb maven . . snapshots/KotlinLambdas#test(). +// ^^^^ definition scip-java maven . . snapshots/KotlinLambdas#test(). // display_name test // signature_documentation java public void test() // kind Method LambdasKt.getX(); // TODO figure out emit getX on kotlin side -// ^^^^^^^^^ reference semanticdb maven . . snapshots/LambdasKt# -// ^^^^ reference semanticdb maven . . snapshots/LambdasKt#getX(). +// ^^^^^^^^^ reference scip-java maven . . snapshots/LambdasKt# +// ^^^^ reference scip-java maven . . snapshots/LambdasKt#getX(). kotlin.collections.CollectionsKt.listOf(); -// ^^^^^^ reference semanticdb maven . . kotlin/ -// ^^^^^^^^^^^ reference semanticdb maven . . kotlin/collections/ -// ^^^^^^^^^^^^^ reference semanticdb maven . . kotlin/collections/CollectionsKt# -// ^^^^^^ reference semanticdb maven . . kotlin/collections/CollectionsKt__CollectionsKt#listOf(). +// ^^^^^^ reference scip-java maven . . kotlin/ +// ^^^^^^^^^^^ reference scip-java maven . . kotlin/collections/ +// ^^^^^^^^^^^^^ reference scip-java maven . . kotlin/collections/CollectionsKt# +// ^^^^^^ reference scip-java maven . . kotlin/collections/CollectionsKt__CollectionsKt#listOf(). FunctionsKt.sampleText(""); -// ^^^^^^^^^^^ reference semanticdb maven . . snapshots/FunctionsKt# -// ^^^^^^^^^^ reference semanticdb maven . . snapshots/FunctionsKt#sampleText(). +// ^^^^^^^^^^^ reference scip-java maven . . snapshots/FunctionsKt# +// ^^^^^^^^^^ reference scip-java maven . . snapshots/FunctionsKt#sampleText(). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/KotlinLambdas#test(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/KotlinLambdas#test(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/KotlinLambdas# +//⌃ enclosing_range_end scip-java maven . . snapshots/KotlinLambdas# diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/ObjectKtConsumer.java b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/ObjectKtConsumer.java index 8bbb54604..a9c03cefd 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/ObjectKtConsumer.java +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/java/snapshots/ObjectKtConsumer.java @@ -1,26 +1,26 @@ package snapshots; -//⌄ enclosing_range_start semanticdb maven . . snapshots/ObjectKtConsumer# +//⌄ enclosing_range_start scip-java maven . . snapshots/ObjectKtConsumer# public class ObjectKtConsumer { -// ^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/ObjectKtConsumer# +// ^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/ObjectKtConsumer# // display_name ObjectKtConsumer // signature_documentation java public class ObjectKtConsumer // kind Class -// ^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/ObjectKtConsumer#``(). +// ^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/ObjectKtConsumer#``(). // display_name // signature_documentation java public ObjectKtConsumer() // kind Constructor -// ⌄ enclosing_range_start semanticdb maven . . snapshots/ObjectKtConsumer#run(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/ObjectKtConsumer#run(). public static void run() { -// ^^^ definition semanticdb maven . . snapshots/ObjectKtConsumer#run(). +// ^^^ definition scip-java maven . . snapshots/ObjectKtConsumer#run(). // display_name run // signature_documentation java public static void run() // kind StaticMethod ObjectKt.INSTANCE.fail("boom"); -// ^^^^^^^^ reference semanticdb maven . . snapshots/ObjectKt# -// ^^^^^^^^ reference semanticdb maven . . snapshots/ObjectKt#INSTANCE. -// ^^^^ reference semanticdb maven . . snapshots/ObjectKt#fail(). +// ^^^^^^^^ reference scip-java maven . . snapshots/ObjectKt# +// ^^^^^^^^ reference scip-java maven . . snapshots/ObjectKt#INSTANCE. +// ^^^^ reference scip-java maven . . snapshots/ObjectKt#fail(). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/ObjectKtConsumer#run(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/ObjectKtConsumer#run(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/ObjectKtConsumer# +//⌃ enclosing_range_end scip-java maven . . snapshots/ObjectKtConsumer# diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Class.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Class.kt index 57939c894..b99c5cbb0 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Class.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Class.kt @@ -1,129 +1,146 @@ package snapshots -// ^^^^^^^^^ reference semanticdb maven . . snapshots/ +// ^^^^^^^^^ reference scip-java maven . . snapshots/ -//⌄ enclosing_range_start semanticdb maven . . snapshots/Class# -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#``(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#``().(banana) -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#banana. -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#getBanana(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#setBanana(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#setBanana().(value) -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#``().(apple) +//⌄ enclosing_range_start scip-java maven . . snapshots/Class# +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#``(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#``().(banana) +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#banana. +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#getBanana(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#setBanana(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#setBanana().(value) +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#``().(apple) class Class constructor(private var banana: Int, apple: String) : -// ^^^^^ definition semanticdb maven . . snapshots/Class# +// ^^^^^ definition scip-java maven . . snapshots/Class# // display_name Class -// documentation ```kotlin\npublic final class Class : Throwable\n``` -// relationship is_reference is_implementation semanticdb maven . . kotlin/Throwable# -// ^^^^^^^^^^^ definition semanticdb maven . . snapshots/Class#``(). +// signature_documentation kotlin public final class Class : Throwable +// kind Class +// relationship is_implementation scip-java maven . . kotlin/Throwable# +// ^^^^^^^^^^^ definition scip-java maven . . snapshots/Class#``(). // display_name Class -// documentation ```kotlin\npublic constructor(banana: Int, apple: String): Class\n``` -// ^^^^^^ definition semanticdb maven . . snapshots/Class#``().(banana) +// signature_documentation kotlin public constructor(banana: Int, apple: String): Class +// kind Constructor +// ^^^^^^ definition scip-java maven . . snapshots/Class#``().(banana) // display_name banana -// documentation ```kotlin\nbanana: Int\n``` -// ^^^^^^ reference semanticdb maven . . snapshots/Class#``().(banana) -// ^^^^^^ definition semanticdb maven . . snapshots/Class#banana. +// signature_documentation kotlin banana: Int +// kind Parameter +// ^^^^^^ reference scip-java maven . . snapshots/Class#``().(banana) +// ^^^^^^ definition scip-java maven . . snapshots/Class#banana. // display_name banana -// documentation ```kotlin\nprivate final var banana: Int\n``` -// ^^^^^^ definition semanticdb maven . . snapshots/Class#getBanana(). +// signature_documentation kotlin private final var banana: Int +// kind Property +// ^^^^^^ definition scip-java maven . . snapshots/Class#getBanana(). // display_name banana -// documentation ```kotlin\nprivate get(): Int\n``` -// ^^^^^^ definition semanticdb maven . . snapshots/Class#setBanana(). +// signature_documentation kotlin private get(): Int +// kind Method +// ^^^^^^ definition scip-java maven . . snapshots/Class#setBanana(). // display_name banana -// documentation ```kotlin\nprivate set(value: Int): Unit\n``` -// ^^^^^^ definition semanticdb maven . . snapshots/Class#setBanana().(value) +// signature_documentation kotlin private set(value: Int): Unit +// kind Method +// ^^^^^^ definition scip-java maven . . snapshots/Class#setBanana().(value) // display_name value -// documentation ```kotlin\nvalue: Int\n``` -// ^^^ reference semanticdb maven . . kotlin/Int# -// ^^^^^ definition semanticdb maven . . snapshots/Class#``().(apple) +// signature_documentation kotlin value: Int +// kind Parameter +// ^^^ reference scip-java maven . . kotlin/Int# +// ^^^^^ definition scip-java maven . . snapshots/Class#``().(apple) // display_name apple -// documentation ```kotlin\napple: String\n``` -// ^^^^^^ reference semanticdb maven . . kotlin/String# -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#``().(banana) -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#banana. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#getBanana(). -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#setBanana(). -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#setBanana().(value) -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#``().(apple) -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#``(). +// signature_documentation kotlin apple: String +// kind Parameter +// ^^^^^^ reference scip-java maven . . kotlin/String# +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#``().(banana) +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#banana. +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#getBanana(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#setBanana(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#setBanana().(value) +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#``().(apple) +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#``(). Throwable(banana.toString() + apple) { -// ^^^^^^^^^ reference semanticdb maven . . kotlin/Throwable# -// ^^^^^^ reference semanticdb maven . . snapshots/Class#``().(banana) -// ^^^^^^^^ reference semanticdb maven . . kotlin/Int#toString(). -// ^ reference semanticdb maven . . kotlin/String#plus(). -// ^^^^^ reference semanticdb maven . . snapshots/Class#``().(apple) +// ^^^^^^^^^ reference scip-java maven . . kotlin/Throwable# +// ^^^^^^ reference scip-java maven . . snapshots/Class#``().(banana) +// ^^^^^^^^ reference scip-java maven . . kotlin/Int#toString(). +// ^ reference scip-java maven . . kotlin/String#plus(). +// ^^^^^ reference scip-java maven . . snapshots/Class#``().(apple) init { println("") -// ^^^^^^^ reference semanticdb maven . . kotlin/io/println(). +// ^^^^^^^ reference scip-java maven . . kotlin/io/println(). } -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#asdf. -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#getAsdf(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#asdf. +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#getAsdf(). val asdf = -// ^^^^ definition semanticdb maven . . snapshots/Class#asdf. +// ^^^^ definition scip-java maven . . snapshots/Class#asdf. // display_name asdf -// documentation ```kotlin\npublic final val asdf: Any\n``` -// ^^^^ definition semanticdb maven . . snapshots/Class#getAsdf(). +// signature_documentation kotlin public final val asdf: Any +// kind Property +// ^^^^ definition scip-java maven . . snapshots/Class#getAsdf(). // display_name asdf -// documentation ```kotlin\npublic get(): Any\n``` -// ⌄ enclosing_range_start semanticdb maven . . snapshots/``# -// ⌄ enclosing_range_start semanticdb maven . . snapshots/``#``(). +// signature_documentation kotlin public get(): Any +// kind Method +// ⌄ enclosing_range_start scip-java maven . . snapshots/``# +// ⌄ enclosing_range_start scip-java maven . . snapshots/``#``(). object { -// ^^^^^^ definition semanticdb maven . . snapshots/``# +// ^^^^^^ definition scip-java maven . . snapshots/``# // display_name -// documentation ```kotlin\nobject : Any\n``` -// ^^^^^^ definition semanticdb maven . . snapshots/``#``(). +// signature_documentation kotlin object : Any +// kind Object +// ^^^^^^ definition scip-java maven . . snapshots/``#``(). // display_name -// documentation ```kotlin\nprivate constructor(): \n``` -// ⌄ enclosing_range_start semanticdb maven . . snapshots/``#doStuff(). +// signature_documentation kotlin private constructor(): +// kind Constructor +// ⌄ enclosing_range_start scip-java maven . . snapshots/``#doStuff(). fun doStuff() = Unit -// ^^^^^^^ definition semanticdb maven . . snapshots/``#doStuff(). +// ^^^^^^^ definition scip-java maven . . snapshots/``#doStuff(). // display_name doStuff -// documentation ```kotlin\npublic final fun doStuff(): Unit\n``` -// ⌃ enclosing_range_end semanticdb maven . . snapshots/``#doStuff(). +// signature_documentation kotlin public final fun doStuff(): Unit +// kind Method +// ⌃ enclosing_range_end scip-java maven . . snapshots/``#doStuff(). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#asdf. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#getAsdf(). -// ⌃ enclosing_range_end semanticdb maven . . snapshots/``# -// ⌃ enclosing_range_end semanticdb maven . . snapshots/``#``(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#asdf. +// ⌃ enclosing_range_end scip-java maven . . snapshots/``# +// ⌃ enclosing_range_end scip-java maven . . snapshots/``#``(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#getAsdf(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#``(+1). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#``(+1). constructor() : this(1, "") -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/Class#``(+1). +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Class#``(+1). // display_name Class -// documentation ```kotlin\npublic constructor(): Class\n``` -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#``(+1). +// signature_documentation kotlin public constructor(): Class +// kind Constructor +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#``(+1). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#``(+2). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#``(+2).(banana) +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#``(+2). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#``(+2).(banana) constructor(banana: Int) : this(banana, "") -// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/Class#``(+2). +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Class#``(+2). // display_name Class -// documentation ```kotlin\npublic constructor(banana: Int): Class\n``` -// ^^^^^^ definition semanticdb maven . . snapshots/Class#``(+2).(banana) +// signature_documentation kotlin public constructor(banana: Int): Class +// kind Constructor +// ^^^^^^ definition scip-java maven . . snapshots/Class#``(+2).(banana) // display_name banana -// documentation ```kotlin\nbanana: Int\n``` -// ^^^ reference semanticdb maven . . kotlin/Int# -// ^^^^^^ reference semanticdb maven . . snapshots/Class#``(+2).(banana) -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#``(+2).(banana) -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#``(+2). +// signature_documentation kotlin banana: Int +// kind Parameter +// ^^^ reference scip-java maven . . kotlin/Int# +// ^^^^^^ reference scip-java maven . . snapshots/Class#``(+2).(banana) +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#``(+2).(banana) +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#``(+2). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Class#run(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#run(). fun run() { -// ^^^ definition semanticdb maven . . snapshots/Class#run(). +// ^^^ definition scip-java maven . . snapshots/Class#run(). // display_name run -// documentation ```kotlin\npublic final fun run(): Unit\n``` +// signature_documentation kotlin public final fun run(): Unit +// kind Method println(Class::class) -// ^^^^^^^ reference semanticdb maven . . kotlin/io/println(). +// ^^^^^^^ reference scip-java maven . . kotlin/io/println(). println("I eat $banana for lunch") -// ^^^^^^^ reference semanticdb maven . . kotlin/io/println(). -// ^^^^^^ reference semanticdb maven . . snapshots/Class#banana. -// ^^^^^^ reference semanticdb maven . . snapshots/Class#getBanana(). -// ^^^^^^ reference semanticdb maven . . snapshots/Class#setBanana(). +// ^^^^^^^ reference scip-java maven . . kotlin/io/println(). +// ^^^^^^ reference scip-java maven . . snapshots/Class#banana. +// ^^^^^^ reference scip-java maven . . snapshots/Class#getBanana(). +// ^^^^^^ reference scip-java maven . . snapshots/Class#setBanana(). banana = 42 -// ^^^^^^ reference semanticdb maven . . snapshots/Class#banana. -// ^^^^^^ reference semanticdb maven . . snapshots/Class#getBanana(). -// ^^^^^^ reference semanticdb maven . . snapshots/Class#setBanana(). +// ^^^^^^ reference scip-java maven . . snapshots/Class#banana. +// ^^^^^^ reference scip-java maven . . snapshots/Class#getBanana(). +// ^^^^^^ reference scip-java maven . . snapshots/Class#setBanana(). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Class#run(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#run(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/Class# +//⌃ enclosing_range_end scip-java maven . . snapshots/Class# diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/CompanionOwner.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/CompanionOwner.kt index a5a386101..6ffe782a6 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/CompanionOwner.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/CompanionOwner.kt @@ -1,44 +1,50 @@ package snapshots -// ^^^^^^^^^ reference semanticdb maven . . snapshots/ +// ^^^^^^^^^ reference scip-java maven . . snapshots/ -//⌄ enclosing_range_start semanticdb maven . . snapshots/CompanionOwner# -//⌄ enclosing_range_start semanticdb maven . . snapshots/CompanionOwner#``(). +//⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner# +//⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner#``(). class CompanionOwner { -// ^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/CompanionOwner# +// ^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionOwner# // display_name CompanionOwner -// documentation ```kotlin\npublic final class CompanionOwner : Any\n``` -// ^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/CompanionOwner#``(). +// signature_documentation kotlin public final class CompanionOwner : Any +// kind Class +// ^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#``(). // display_name CompanionOwner -// documentation ```kotlin\npublic constructor(): CompanionOwner\n``` -// ⌄ enclosing_range_start semanticdb maven . . snapshots/CompanionOwner#Companion# -// ⌄ enclosing_range_start semanticdb maven . . snapshots/CompanionOwner#Companion#``(). +// signature_documentation kotlin public constructor(): CompanionOwner +// kind Constructor +// ⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner#Companion# +// ⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner#Companion#``(). companion object { -// ^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/CompanionOwner#Companion# 2:3 +// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#Companion# 2:3 // display_name Companion -// documentation ```kotlin\npublic final companion object Companion : Any\n``` -// ^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/CompanionOwner#Companion#``(). 2:3 +// signature_documentation kotlin public final companion object Companion : Any +// kind Object +// ^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#Companion#``(). 2:3 // display_name Companion -// documentation ```kotlin\nprivate constructor(): CompanionOwner.Companion\n``` -// ⌄ enclosing_range_start semanticdb maven . . snapshots/CompanionOwner#Companion#create(). +// signature_documentation kotlin private constructor(): CompanionOwner.Companion +// kind Constructor +// ⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner#Companion#create(). fun create(): CompanionOwner = CompanionOwner() -// ^^^^^^ definition semanticdb maven . . snapshots/CompanionOwner#Companion#create(). +// ^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#Companion#create(). // display_name create -// documentation ```kotlin\npublic final fun create(): CompanionOwner\n``` -// ^^^^^^^^^^^^^^ reference semanticdb maven . . snapshots/CompanionOwner# -// ^^^^^^^^^^^^^^ reference semanticdb maven . . snapshots/CompanionOwner#``(). -// ⌃ enclosing_range_end semanticdb maven . . snapshots/CompanionOwner#Companion#create(). +// signature_documentation kotlin public final fun create(): CompanionOwner +// kind Method +// ^^^^^^^^^^^^^^ reference scip-java maven . . snapshots/CompanionOwner# +// ^^^^^^^^^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#``(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/CompanionOwner#Companion#create(). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/CompanionOwner#Companion# -// ⌃ enclosing_range_end semanticdb maven . . snapshots/CompanionOwner#Companion#``(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/CompanionOwner#create(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/CompanionOwner#Companion# +// ⌃ enclosing_range_end scip-java maven . . snapshots/CompanionOwner#Companion#``(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/CompanionOwner#create(). fun create(): Int = CompanionOwner.create().hashCode() -// ^^^^^^ definition semanticdb maven . . snapshots/CompanionOwner#create(). +// ^^^^^^ definition scip-java maven . . snapshots/CompanionOwner#create(). // display_name create -// documentation ```kotlin\npublic final fun create(): Int\n``` -// ^^^ reference semanticdb maven . . kotlin/Int# -// ^^^^^^ reference semanticdb maven . . snapshots/CompanionOwner#Companion#create(). -// ^^^^^^^^ reference semanticdb maven . . kotlin/Any#hashCode(). -// ⌃ enclosing_range_end semanticdb maven . . snapshots/CompanionOwner#create(). +// signature_documentation kotlin public final fun create(): Int +// kind Method +// ^^^ reference scip-java maven . . kotlin/Int# +// ^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#Companion#create(). +// ^^^^^^^^ reference scip-java maven . . kotlin/Any#hashCode(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/CompanionOwner#create(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/CompanionOwner# -//⌃ enclosing_range_end semanticdb maven . . snapshots/CompanionOwner#``(). +//⌃ enclosing_range_end scip-java maven . . snapshots/CompanionOwner# +//⌃ enclosing_range_end scip-java maven . . snapshots/CompanionOwner#``(). diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Docstrings.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Docstrings.kt index cf219ac01..d9070bc1d 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Docstrings.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Docstrings.kt @@ -1,44 +1,52 @@ package snapshots -// ^^^^^^^^^ reference semanticdb maven . . snapshots/ +// ^^^^^^^^^ reference scip-java maven . . snapshots/ import java.io.Serializable -// ^^^^ reference semanticdb maven . . java/ -// ^^ reference semanticdb maven . . java/io/ -// ^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/io/Serializable# +// ^^^^ reference scip-java maven . . java/ +// ^^ reference scip-java maven . . java/io/ +// ^^^^^^^^^^^^ reference scip-java maven jdk 11 java/io/Serializable# -//⌄ enclosing_range_start semanticdb maven . . snapshots/DocstringSuperclass# -//⌄ enclosing_range_start semanticdb maven . . snapshots/DocstringSuperclass#``(). +//⌄ enclosing_range_start scip-java maven . . snapshots/DocstringSuperclass# +//⌄ enclosing_range_start scip-java maven . . snapshots/DocstringSuperclass#``(). abstract class DocstringSuperclass -// ^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/DocstringSuperclass# +// ^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/DocstringSuperclass# // display_name DocstringSuperclass -// documentation ```kotlin\npublic abstract class DocstringSuperclass : Any\n``` -// ^^^^^^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/DocstringSuperclass#``(). +// signature_documentation kotlin public abstract class DocstringSuperclass : Any +// kind Class +// ^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/DocstringSuperclass#``(). // display_name DocstringSuperclass -// documentation ```kotlin\npublic constructor(): DocstringSuperclass\n``` -// ⌃ enclosing_range_end semanticdb maven . . snapshots/DocstringSuperclass# -// ⌃ enclosing_range_end semanticdb maven . . snapshots/DocstringSuperclass#``(). -//⌄ enclosing_range_start semanticdb maven . . snapshots/Docstrings# -//⌄ enclosing_range_start semanticdb maven . . snapshots/Docstrings#``(). +// signature_documentation kotlin public constructor(): DocstringSuperclass +// kind Constructor +// ⌃ enclosing_range_end scip-java maven . . snapshots/DocstringSuperclass# +// ⌃ enclosing_range_end scip-java maven . . snapshots/DocstringSuperclass#``(). +//⌄ enclosing_range_start scip-java maven . . snapshots/Docstrings# +//⌄ enclosing_range_start scip-java maven . . snapshots/Docstrings#``(). /** Example class docstring. */ class Docstrings : DocstringSuperclass(), Serializable { -// ^^^^^^^^^^ definition semanticdb maven . . snapshots/Docstrings# +// ^^^^^^^^^^ definition scip-java maven . . snapshots/Docstrings# // display_name Docstrings -// documentation ```kotlin\npublic final class Docstrings : DocstringSuperclass, Serializable\n```\n\n----\n\n Example class docstring. -// relationship is_reference is_implementation semanticdb maven . . snapshots/DocstringSuperclass# -// relationship is_reference is_implementation semanticdb maven jdk 11 java/io/Serializable# -// ^^^^^^^^^^ definition semanticdb maven . . snapshots/Docstrings#``(). +// signature_documentation kotlin public final class Docstrings : DocstringSuperclass, Serializable +// kind Class +// documentation Example class docstring. +// relationship is_implementation scip-java maven . . snapshots/DocstringSuperclass# +// relationship is_implementation scip-java maven jdk 11 java/io/Serializable# +// ^^^^^^^^^^ definition scip-java maven . . snapshots/Docstrings#``(). // display_name Docstrings -// documentation ```kotlin\npublic constructor(): Docstrings\n```\n\n----\n\n Example class docstring. -// ^^^^^^^^^^^^^^^^^^^ reference semanticdb maven . . snapshots/DocstringSuperclass# -// ^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/io/Serializable# +// signature_documentation kotlin public constructor(): Docstrings +// kind Constructor +// documentation Example class docstring. +// ^^^^^^^^^^^^^^^^^^^ reference scip-java maven . . snapshots/DocstringSuperclass# +// ^^^^^^^^^^^^ reference scip-java maven jdk 11 java/io/Serializable# } -//⌃ enclosing_range_end semanticdb maven . . snapshots/Docstrings# -//⌃ enclosing_range_end semanticdb maven . . snapshots/Docstrings#``(). +//⌃ enclosing_range_end scip-java maven . . snapshots/Docstrings# +//⌃ enclosing_range_end scip-java maven . . snapshots/Docstrings#``(). -//⌄ enclosing_range_start semanticdb maven . . snapshots/docstrings(). +//⌄ enclosing_range_start scip-java maven . . snapshots/docstrings(). /** Example method docstring. */ fun docstrings() { } -// ^^^^^^^^^^ definition semanticdb maven . . snapshots/docstrings(). +// ^^^^^^^^^^ definition scip-java maven . . snapshots/docstrings(). // display_name docstrings -// documentation ```kotlin\npublic final fun docstrings(): Unit\n```\n\n----\n\n Example method docstring. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/docstrings(). +// signature_documentation kotlin public final fun docstrings(): Unit +// kind Method +// documentation Example method docstring. +// ⌃ enclosing_range_end scip-java maven . . snapshots/docstrings(). diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Functions.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Functions.kt index 30f646798..8df23c98b 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Functions.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Functions.kt @@ -1,19 +1,21 @@ package snapshots -// ^^^^^^^^^ reference semanticdb maven . . snapshots/ +// ^^^^^^^^^ reference scip-java maven . . snapshots/ -//⌄ enclosing_range_start semanticdb maven . . snapshots/sampleText(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/sampleText().(x) +//⌄ enclosing_range_start scip-java maven . . snapshots/sampleText(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/sampleText().(x) fun sampleText(x: String = "") { -// ^^^^^^^^^^ definition semanticdb maven . . snapshots/sampleText(). +// ^^^^^^^^^^ definition scip-java maven . . snapshots/sampleText(). // display_name sampleText -// documentation ```kotlin\npublic final fun sampleText(x: String = ...): Unit\n``` -// ^ definition semanticdb maven . . snapshots/sampleText().(x) +// signature_documentation kotlin public final fun sampleText(x: String = ...): Unit +// kind Method +// ^ definition scip-java maven . . snapshots/sampleText().(x) // display_name x -// documentation ```kotlin\nx: String = ...\n``` -// ^^^^^^ reference semanticdb maven . . kotlin/String# -// ⌃ enclosing_range_end semanticdb maven . . snapshots/sampleText().(x) +// signature_documentation kotlin x: String = ... +// kind Parameter +// ^^^^^^ reference scip-java maven . . kotlin/String# +// ⌃ enclosing_range_end scip-java maven . . snapshots/sampleText().(x) println(x) -// ^^^^^^^ reference semanticdb maven . . kotlin/io/println(). -// ^ reference semanticdb maven . . snapshots/sampleText().(x) +// ^^^^^^^ reference scip-java maven . . kotlin/io/println(). +// ^ reference scip-java maven . . snapshots/sampleText().(x) } -//⌃ enclosing_range_end semanticdb maven . . snapshots/sampleText(). +//⌃ enclosing_range_end scip-java maven . . snapshots/sampleText(). diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Implementations.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Implementations.kt index ebd286d31..635d7b6f1 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Implementations.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Implementations.kt @@ -1,129 +1,146 @@ package snapshots -// ^^^^^^^^^ reference semanticdb maven . . snapshots/ +// ^^^^^^^^^ reference scip-java maven . . snapshots/ -//⌄ enclosing_range_start semanticdb maven . . snapshots/Overrides# -//⌄ enclosing_range_start semanticdb maven . . snapshots/Overrides#``(). +//⌄ enclosing_range_start scip-java maven . . snapshots/Overrides# +//⌄ enclosing_range_start scip-java maven . . snapshots/Overrides#``(). class Overrides : AutoCloseable { -// ^^^^^^^^^ definition semanticdb maven . . snapshots/Overrides# +// ^^^^^^^^^ definition scip-java maven . . snapshots/Overrides# // display_name Overrides -// documentation ```kotlin\npublic final class Overrides : {kotlin/AutoCloseable=} AutoCloseable\n``` -// relationship is_reference is_implementation semanticdb maven jdk 11 java/lang/AutoCloseable# -// ^^^^^^^^^ definition semanticdb maven . . snapshots/Overrides#``(). +// signature_documentation kotlin public final class Overrides : {kotlin/AutoCloseable=} AutoCloseable +// kind Class +// relationship is_implementation scip-java maven jdk 11 java/lang/AutoCloseable# +// ^^^^^^^^^ definition scip-java maven . . snapshots/Overrides#``(). // display_name Overrides -// documentation ```kotlin\npublic constructor(): Overrides\n``` -// ^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/AutoCloseable# -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Overrides#close(). +// signature_documentation kotlin public constructor(): Overrides +// kind Constructor +// ^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/AutoCloseable# +// ⌄ enclosing_range_start scip-java maven . . snapshots/Overrides#close(). override fun close() { -// ^^^^^ definition semanticdb maven . . snapshots/Overrides#close(). +// ^^^^^ definition scip-java maven . . snapshots/Overrides#close(). // display_name close -// documentation ```kotlin\npublic open override fun close(): Unit\n``` -// relationship is_reference is_implementation semanticdb maven jdk 11 java/lang/AutoCloseable#close(). +// signature_documentation kotlin public open override fun close(): Unit +// kind Method +// relationship is_reference is_implementation scip-java maven jdk 11 java/lang/AutoCloseable#close(). TODO("Not yet implemented") -// ^^^^ reference semanticdb maven . . kotlin/TODO(+1). +// ^^^^ reference scip-java maven . . kotlin/TODO(+1). } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Overrides#close(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/Overrides#close(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/Overrides# -//⌃ enclosing_range_end semanticdb maven . . snapshots/Overrides#``(). +//⌃ enclosing_range_end scip-java maven . . snapshots/Overrides# +//⌃ enclosing_range_end scip-java maven . . snapshots/Overrides#``(). -//⌄ enclosing_range_start semanticdb maven . . snapshots/Animal# +//⌄ enclosing_range_start scip-java maven . . snapshots/Animal# interface Animal { -// ^^^^^^ definition semanticdb maven . . snapshots/Animal# +// ^^^^^^ definition scip-java maven . . snapshots/Animal# // display_name Animal -// documentation ```kotlin\npublic abstract interface Animal : Any\n``` -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Animal#favoriteNumber. -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Animal#getFavoriteNumber(). +// signature_documentation kotlin public abstract interface Animal : Any +// kind Interface +// ⌄ enclosing_range_start scip-java maven . . snapshots/Animal#favoriteNumber. +// ⌄ enclosing_range_start scip-java maven . . snapshots/Animal#getFavoriteNumber(). val favoriteNumber: Int -// ^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/Animal#favoriteNumber. +// ^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Animal#favoriteNumber. // display_name favoriteNumber -// documentation ```kotlin\npublic abstract val favoriteNumber: Int\n``` -// ^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/Animal#getFavoriteNumber(). +// signature_documentation kotlin public abstract val favoriteNumber: Int +// kind Property +// ^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Animal#getFavoriteNumber(). // display_name favoriteNumber -// documentation ```kotlin\npublic get(): Int\n``` -// ^^^ reference semanticdb maven . . kotlin/Int# -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Animal#favoriteNumber. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Animal#getFavoriteNumber(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Animal#sound(). +// signature_documentation kotlin public get(): Int +// kind Method +// ^^^ reference scip-java maven . . kotlin/Int# +// ⌃ enclosing_range_end scip-java maven . . snapshots/Animal#favoriteNumber. +// ⌃ enclosing_range_end scip-java maven . . snapshots/Animal#getFavoriteNumber(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Animal#sound(). fun sound(): String -// ^^^^^ definition semanticdb maven . . snapshots/Animal#sound(). +// ^^^^^ definition scip-java maven . . snapshots/Animal#sound(). // display_name sound -// documentation ```kotlin\npublic abstract fun sound(): String\n\n``` -// ^^^^^^ reference semanticdb maven . . kotlin/String# -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Animal#sound(). +// signature_documentation kotlin public abstract fun sound(): String\n +// kind Method +// ^^^^^^ reference scip-java maven . . kotlin/String# +// ⌃ enclosing_range_end scip-java maven . . snapshots/Animal#sound(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/Animal# -//⌄ enclosing_range_start semanticdb maven . . snapshots/Bird# -//⌄ enclosing_range_start semanticdb maven . . snapshots/Bird#``(). +//⌃ enclosing_range_end scip-java maven . . snapshots/Animal# +//⌄ enclosing_range_start scip-java maven . . snapshots/Bird# +//⌄ enclosing_range_start scip-java maven . . snapshots/Bird#``(). open class Bird : Animal { -// ^^^^ definition semanticdb maven . . snapshots/Bird# +// ^^^^ definition scip-java maven . . snapshots/Bird# // display_name Bird -// documentation ```kotlin\npublic open class Bird : Animal\n``` -// relationship is_reference is_implementation semanticdb maven . . snapshots/Animal# -// ^^^^ definition semanticdb maven . . snapshots/Bird#``(). +// signature_documentation kotlin public open class Bird : Animal +// kind Class +// relationship is_implementation scip-java maven . . snapshots/Animal# +// ^^^^ definition scip-java maven . . snapshots/Bird#``(). // display_name Bird -// documentation ```kotlin\npublic constructor(): Bird\n``` -// ^^^^^^ reference semanticdb maven . . snapshots/Animal# -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Bird#favoriteNumber. +// signature_documentation kotlin public constructor(): Bird +// kind Constructor +// ^^^^^^ reference scip-java maven . . snapshots/Animal# +// ⌄ enclosing_range_start scip-java maven . . snapshots/Bird#favoriteNumber. override val favoriteNumber: Int -// ^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/Bird#favoriteNumber. +// ^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Bird#favoriteNumber. // display_name favoriteNumber -// documentation ```kotlin\npublic open override val favoriteNumber: Int\n``` -// ^^^ reference semanticdb maven . . kotlin/Int# -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Bird#getFavoriteNumber(). +// signature_documentation kotlin public open override val favoriteNumber: Int +// kind Property +// ^^^ reference scip-java maven . . kotlin/Int# +// ⌄ enclosing_range_start scip-java maven . . snapshots/Bird#getFavoriteNumber(). get() = 42 -// ^^^ definition semanticdb maven . . snapshots/Bird#getFavoriteNumber(). +// ^^^ definition scip-java maven . . snapshots/Bird#getFavoriteNumber(). // display_name favoriteNumber -// documentation ```kotlin\npublic get(): Int\n``` -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Bird#favoriteNumber. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Bird#getFavoriteNumber(). +// signature_documentation kotlin public get(): Int +// kind Method +// ⌃ enclosing_range_end scip-java maven . . snapshots/Bird#favoriteNumber. +// ⌃ enclosing_range_end scip-java maven . . snapshots/Bird#getFavoriteNumber(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Bird#sound(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Bird#sound(). override fun sound(): String { -// ^^^^^ definition semanticdb maven . . snapshots/Bird#sound(). +// ^^^^^ definition scip-java maven . . snapshots/Bird#sound(). // display_name sound -// documentation ```kotlin\npublic open override fun sound(): String\n``` -// relationship is_reference is_implementation semanticdb maven . . snapshots/Animal#sound(). -// ^^^^^^ reference semanticdb maven . . kotlin/String# +// signature_documentation kotlin public open override fun sound(): String +// kind Method +// relationship is_reference is_implementation scip-java maven . . snapshots/Animal#sound(). +// ^^^^^^ reference scip-java maven . . kotlin/String# return "tweet" } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Bird#sound(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/Bird#sound(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/Bird# -//⌃ enclosing_range_end semanticdb maven . . snapshots/Bird#``(). -//⌄ enclosing_range_start semanticdb maven . . snapshots/Seagull# -//⌄ enclosing_range_start semanticdb maven . . snapshots/Seagull#``(). +//⌃ enclosing_range_end scip-java maven . . snapshots/Bird# +//⌃ enclosing_range_end scip-java maven . . snapshots/Bird#``(). +//⌄ enclosing_range_start scip-java maven . . snapshots/Seagull# +//⌄ enclosing_range_start scip-java maven . . snapshots/Seagull#``(). class Seagull : Bird() { -// ^^^^^^^ definition semanticdb maven . . snapshots/Seagull# +// ^^^^^^^ definition scip-java maven . . snapshots/Seagull# // display_name Seagull -// documentation ```kotlin\npublic final class Seagull : Bird\n``` -// relationship is_reference is_implementation semanticdb maven . . snapshots/Bird# -// ^^^^^^^ definition semanticdb maven . . snapshots/Seagull#``(). +// signature_documentation kotlin public final class Seagull : Bird +// kind Class +// relationship is_implementation scip-java maven . . snapshots/Bird# +// ^^^^^^^ definition scip-java maven . . snapshots/Seagull#``(). // display_name Seagull -// documentation ```kotlin\npublic constructor(): Seagull\n``` -// ^^^^ reference semanticdb maven . . snapshots/Bird# -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Seagull#favoriteNumber. +// signature_documentation kotlin public constructor(): Seagull +// kind Constructor +// ^^^^ reference scip-java maven . . snapshots/Bird# +// ⌄ enclosing_range_start scip-java maven . . snapshots/Seagull#favoriteNumber. override val favoriteNumber: Int -// ^^^^^^^^^^^^^^ definition semanticdb maven . . snapshots/Seagull#favoriteNumber. +// ^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Seagull#favoriteNumber. // display_name favoriteNumber -// documentation ```kotlin\npublic open override val favoriteNumber: Int\n``` -// ^^^ reference semanticdb maven . . kotlin/Int# -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Seagull#getFavoriteNumber(). +// signature_documentation kotlin public open override val favoriteNumber: Int +// kind Property +// ^^^ reference scip-java maven . . kotlin/Int# +// ⌄ enclosing_range_start scip-java maven . . snapshots/Seagull#getFavoriteNumber(). get() = 1337 -// ^^^ definition semanticdb maven . . snapshots/Seagull#getFavoriteNumber(). +// ^^^ definition scip-java maven . . snapshots/Seagull#getFavoriteNumber(). // display_name favoriteNumber -// documentation ```kotlin\npublic get(): Int\n``` -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Seagull#favoriteNumber. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Seagull#getFavoriteNumber(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/Seagull#sound(). +// signature_documentation kotlin public get(): Int +// kind Method +// ⌃ enclosing_range_end scip-java maven . . snapshots/Seagull#favoriteNumber. +// ⌃ enclosing_range_end scip-java maven . . snapshots/Seagull#getFavoriteNumber(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/Seagull#sound(). override fun sound(): String { -// ^^^^^ definition semanticdb maven . . snapshots/Seagull#sound(). +// ^^^^^ definition scip-java maven . . snapshots/Seagull#sound(). // display_name sound -// documentation ```kotlin\npublic open override fun sound(): String\n``` -// relationship is_reference is_implementation semanticdb maven . . snapshots/Bird#sound(). -// ^^^^^^ reference semanticdb maven . . kotlin/String# +// signature_documentation kotlin public open override fun sound(): String +// kind Method +// relationship is_reference is_implementation scip-java maven . . snapshots/Bird#sound(). +// ^^^^^^ reference scip-java maven . . kotlin/String# return "squawk" } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/Seagull#sound(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/Seagull#sound(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/Seagull# -//⌃ enclosing_range_end semanticdb maven . . snapshots/Seagull#``(). +//⌃ enclosing_range_end scip-java maven . . snapshots/Seagull# +//⌃ enclosing_range_end scip-java maven . . snapshots/Seagull#``(). diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Lambdas.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Lambdas.kt index d531349ba..50448bf78 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Lambdas.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/Lambdas.kt @@ -1,66 +1,75 @@ package snapshots -// ^^^^^^^^^ reference semanticdb maven . . snapshots/ +// ^^^^^^^^^ reference scip-java maven . . snapshots/ -//⌄ enclosing_range_start semanticdb maven . . snapshots/x. -//⌄ enclosing_range_start semanticdb maven . . snapshots/getX(). +//⌄ enclosing_range_start scip-java maven . . snapshots/x. +//⌄ enclosing_range_start scip-java maven . . snapshots/getX(). // ⌄ enclosing_range_start local 0 // ⌄ enclosing_range_start local 1 val x = arrayListOf().forEachIndexed { i, s -> println("$i $s") } -// ^ definition semanticdb maven . . snapshots/getX(). +// ^ definition scip-java maven . . snapshots/getX(). // display_name x -// documentation ```kotlin\npublic get(): Unit\n``` -// ^ definition semanticdb maven . . snapshots/x. +// signature_documentation kotlin public get(): Unit +// kind Method +// ^ definition scip-java maven . . snapshots/x. // display_name x -// documentation ```kotlin\npublic final val x: Unit\n``` -// ^^^^^^^^^^^ reference semanticdb maven . . kotlin/collections/arrayListOf(). -// ^^^^^^^^^^^^^^ reference semanticdb maven . . kotlin/collections/forEachIndexed(+9). +// signature_documentation kotlin public final val x: Unit +// kind Property +// ^^^^^^^^^^^ reference scip-java maven . . kotlin/collections/arrayListOf(). +// ^^^^^^^^^^^^^^ reference scip-java maven . . kotlin/collections/forEachIndexed(+9). // ^ definition local 0 // display_name i -// documentation ```kotlin\ni: Int\n``` +// signature_documentation kotlin i: Int +// kind Parameter // ^ definition local 1 // display_name s -// documentation ```kotlin\ns: String\n``` -// ^^^^^^^ reference semanticdb maven . . kotlin/io/println(). +// signature_documentation kotlin s: String +// kind Parameter +// ^^^^^^^ reference scip-java maven . . kotlin/io/println(). // ^ reference local 0 // ^ reference local 1 // ⌃ enclosing_range_end local 0 // ⌃ enclosing_range_end local 1 -// ⌃ enclosing_range_end semanticdb maven . . snapshots/x. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/getX(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/x. +// ⌃ enclosing_range_end scip-java maven . . snapshots/getX(). -//⌄ enclosing_range_start semanticdb maven . . snapshots/y. -//⌄ enclosing_range_start semanticdb maven . . snapshots/getY(). +//⌄ enclosing_range_start scip-java maven . . snapshots/y. +//⌄ enclosing_range_start scip-java maven . . snapshots/getY(). val y = "fdsa".run { this.toByteArray() } -// ^ definition semanticdb maven . . snapshots/getY(). +// ^ definition scip-java maven . . snapshots/getY(). // display_name y -// documentation ```kotlin\npublic get(): ByteArray\n``` -// ^ definition semanticdb maven . . snapshots/y. +// signature_documentation kotlin public get(): ByteArray +// kind Method +// ^ definition scip-java maven . . snapshots/y. // display_name y -// documentation ```kotlin\npublic final val y: ByteArray\n``` -// ^^^ reference semanticdb maven . . kotlin/run(+1). -// ^^^^^^^^^^^ reference semanticdb maven . . kotlin/text/toByteArray(). -// ⌃ enclosing_range_end semanticdb maven . . snapshots/y. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/getY(). +// signature_documentation kotlin public final val y: ByteArray +// kind Property +// ^^^ reference scip-java maven . . kotlin/run(+1). +// ^^^^^^^^^^^ reference scip-java maven . . kotlin/text/toByteArray(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/y. +// ⌃ enclosing_range_end scip-java maven . . snapshots/getY(). -//⌄ enclosing_range_start semanticdb maven . . snapshots/z. -//⌄ enclosing_range_start semanticdb maven . . snapshots/getZ(). +//⌄ enclosing_range_start scip-java maven . . snapshots/z. +//⌄ enclosing_range_start scip-java maven . . snapshots/getZ(). // ⌄ enclosing_range_start local 2 val z = y.let { it.size } -// ^ definition semanticdb maven . . snapshots/getZ(). +// ^ definition scip-java maven . . snapshots/getZ(). // display_name z -// documentation ```kotlin\npublic get(): Int\n``` -// ^ definition semanticdb maven . . snapshots/z. +// signature_documentation kotlin public get(): Int +// kind Method +// ^ definition scip-java maven . . snapshots/z. // display_name z -// documentation ```kotlin\npublic final val z: Int\n``` -// ^ reference semanticdb maven . . snapshots/getY(). -// ^ reference semanticdb maven . . snapshots/y. -// ^^^ reference semanticdb maven . . kotlin/let(). +// signature_documentation kotlin public final val z: Int +// kind Property +// ^ reference scip-java maven . . snapshots/getY(). +// ^ reference scip-java maven . . snapshots/y. +// ^^^ reference scip-java maven . . kotlin/let(). // ^^^^^^^^^^^ definition local 2 // display_name it -// documentation ```kotlin\nit: ByteArray\n``` +// signature_documentation kotlin it: ByteArray +// kind Parameter // ^^ reference local 2 -// ^^^^ reference semanticdb maven . . kotlin/ByteArray#getSize(). -// ^^^^ reference semanticdb maven . . kotlin/ByteArray#size. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/z. -// ⌃ enclosing_range_end semanticdb maven . . snapshots/getZ(). +// ^^^^ reference scip-java maven . . kotlin/ByteArray#getSize(). +// ^^^^ reference scip-java maven . . kotlin/ByteArray#size. +// ⌃ enclosing_range_end scip-java maven . . snapshots/z. // ⌃ enclosing_range_end local 2 +// ⌃ enclosing_range_end scip-java maven . . snapshots/getZ(). diff --git a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/ObjectKt.kt b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/ObjectKt.kt index 5a4b21f3c..62e50ac11 100644 --- a/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/ObjectKt.kt +++ b/semanticdb-kotlinc/minimized/src/generatedSnapshots/resources/semanticdb-kotlinc/minimized/src/main/kotlin/snapshots/ObjectKt.kt @@ -1,37 +1,41 @@ package snapshots -// ^^^^^^^^^ reference semanticdb maven . . snapshots/ +// ^^^^^^^^^ reference scip-java maven . . snapshots/ import java.lang.RuntimeException -// ^^^^ reference semanticdb maven . . java/ -// ^^^^ reference semanticdb maven . . java/lang/ -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/RuntimeException# +// ^^^^ reference scip-java maven . . java/ +// ^^^^ reference scip-java maven . . java/lang/ +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/RuntimeException# -//⌄ enclosing_range_start semanticdb maven . . snapshots/ObjectKt# -//⌄ enclosing_range_start semanticdb maven . . snapshots/ObjectKt#``(). +//⌄ enclosing_range_start scip-java maven . . snapshots/ObjectKt# +//⌄ enclosing_range_start scip-java maven . . snapshots/ObjectKt#``(). object ObjectKt { -// ^^^^^^^^ definition semanticdb maven . . snapshots/ObjectKt# +// ^^^^^^^^ definition scip-java maven . . snapshots/ObjectKt# // display_name ObjectKt -// documentation ```kotlin\npublic final object ObjectKt : Any\n``` -// ^^^^^^^^ definition semanticdb maven . . snapshots/ObjectKt#``(). +// signature_documentation kotlin public final object ObjectKt : Any +// kind Object +// ^^^^^^^^ definition scip-java maven . . snapshots/ObjectKt#``(). // display_name ObjectKt -// documentation ```kotlin\nprivate constructor(): ObjectKt\n``` -// ⌄ enclosing_range_start semanticdb maven . . snapshots/ObjectKt#fail(). -// ⌄ enclosing_range_start semanticdb maven . . snapshots/ObjectKt#fail().(message) +// signature_documentation kotlin private constructor(): ObjectKt +// kind Constructor +// ⌄ enclosing_range_start scip-java maven . . snapshots/ObjectKt#fail(). +// ⌄ enclosing_range_start scip-java maven . . snapshots/ObjectKt#fail().(message) fun fail(message: String?): Nothing { -// ^^^^ definition semanticdb maven . . snapshots/ObjectKt#fail(). +// ^^^^ definition scip-java maven . . snapshots/ObjectKt#fail(). // display_name fail -// documentation ```kotlin\npublic final fun fail(message: String?): Nothing\n``` -// ^^^^^^^ definition semanticdb maven . . snapshots/ObjectKt#fail().(message) +// signature_documentation kotlin public final fun fail(message: String?): Nothing +// kind Method +// ^^^^^^^ definition scip-java maven . . snapshots/ObjectKt#fail().(message) // display_name message -// documentation ```kotlin\nmessage: String?\n``` -// ^^^^^^^ reference semanticdb maven . . kotlin/String# -// ^^^^^^^ reference semanticdb maven . . kotlin/Nothing# -// ⌃ enclosing_range_end semanticdb maven . . snapshots/ObjectKt#fail().(message) +// signature_documentation kotlin message: String? +// kind Parameter +// ^^^^^^^ reference scip-java maven . . kotlin/String# +// ^^^^^^^ reference scip-java maven . . kotlin/Nothing# +// ⌃ enclosing_range_end scip-java maven . . snapshots/ObjectKt#fail().(message) throw RuntimeException(message) -// ^^^^^^^^^^^^^^^^ reference semanticdb maven jdk 11 java/lang/RuntimeException#``(). -// ^^^^^^^ reference semanticdb maven . . snapshots/ObjectKt#fail().(message) +// ^^^^^^^^^^^^^^^^ reference scip-java maven jdk 11 java/lang/RuntimeException#``(). +// ^^^^^^^ reference scip-java maven . . snapshots/ObjectKt#fail().(message) } -// ⌃ enclosing_range_end semanticdb maven . . snapshots/ObjectKt#fail(). +// ⌃ enclosing_range_end scip-java maven . . snapshots/ObjectKt#fail(). } -//⌃ enclosing_range_end semanticdb maven . . snapshots/ObjectKt# -//⌃ enclosing_range_end semanticdb maven . . snapshots/ObjectKt#``(). +//⌃ enclosing_range_end scip-java maven . . snapshots/ObjectKt# +//⌃ enclosing_range_end scip-java maven . . snapshots/ObjectKt#``(). From 65309f089c3b77e51912b9de522548dbc0a2a29c Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:43:26 +0200 Subject: [PATCH 14/21] PR3 (D1): decouple ScipVisitor from Semanticdb protobuf types Introduce small in-package value types so the direct-to-SCIP visitor no longer reaches into the SemanticDB-generated protobuf classes: * ScipRange: holds (startLine, startCharacter, endLine, endCharacter) with an asScipRange() helper that produces the compact 3/4-int form SCIP expects. * ScipRole: minimal {DEFINITION, REFERENCE, SYNTHETIC_DEFINITION} mirror of Semanticdb.SymbolOccurrence.Role. Update ScipVisitor to use the new types end-to-end. Pure refactor: no behavior change, no snapshot churn. Sets up D2..D5 where the legacy SemanticDB types/modules will be deleted. --- .../semanticdb_javac/ScipRange.java | 41 +++++++ .../semanticdb_javac/ScipRole.java | 11 ++ .../semanticdb_javac/ScipVisitor.java | 106 +++++++----------- 3 files changed, 94 insertions(+), 64 deletions(-) create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipRange.java create mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipRole.java diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipRange.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipRange.java new file mode 100644 index 000000000..96132043f --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipRange.java @@ -0,0 +1,41 @@ +package com.sourcegraph.semanticdb_javac; + +import java.util.Arrays; +import java.util.List; + +/** + * Lightweight value type for source ranges produced by {@link ScipVisitor}. + * + *

Coordinates are zero-based and follow the SCIP convention (line + character, end-exclusive + * character). Convertible directly to SCIP's {@code repeated int32 range} representation via {@link + * #asScipRange()}. + */ +final class ScipRange { + final int startLine; + final int startCharacter; + final int endLine; + final int endCharacter; + + ScipRange(int startLine, int startCharacter, int endLine, int endCharacter) { + this.startLine = startLine; + this.startCharacter = startCharacter; + this.endLine = endLine; + this.endCharacter = endCharacter; + } + + /** Returns a copy with adjusted start/end characters (used to correct for tab-expansion). */ + ScipRange withCharacters(int startCharacter, int endCharacter) { + return new ScipRange(startLine, startCharacter, endLine, endCharacter); + } + + /** + * Encodes the range using SCIP's compact {@code repeated int32 range} layout: 3 ints when the + * range fits on a single line, 4 ints otherwise. + */ + List asScipRange() { + if (startLine == endLine) { + return Arrays.asList(startLine, startCharacter, endCharacter); + } + return Arrays.asList(startLine, startCharacter, endLine, endCharacter); + } +} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipRole.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipRole.java new file mode 100644 index 000000000..6ddbd2344 --- /dev/null +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipRole.java @@ -0,0 +1,11 @@ +package com.sourcegraph.semanticdb_javac; + +/** + * Minimal role enum used by {@link ScipVisitor} when emitting SCIP occurrences. Mirrors the subset + * of {@code Semanticdb.SymbolOccurrence.Role} that the direct-to-SCIP visitor cares about. + */ +enum ScipRole { + DEFINITION, + REFERENCE, + SYNTHETIC_DEFINITION +} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java index a3e52a5b8..a61aa510c 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java @@ -1,7 +1,6 @@ package com.sourcegraph.semanticdb_javac; import com.sourcegraph.Scip; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role; import com.sun.source.tree.AnnotatedTypeTree; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; @@ -24,7 +23,6 @@ import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; @@ -109,21 +107,18 @@ public Scip.Index buildShard(CompilationUnitTree tree) { return Scip.Index.newBuilder().addDocuments(document).build(); } - /** - * SCIP `Document.language` value. Lowercased to match the canonical scheme used by other - * tooling (see {@link com.sourcegraph.scip_semanticdb.ScipSemanticdb}). - */ + /** SCIP {@code Document.language} value for Java sources. */ static final String LANGUAGE_JAVA = "java"; // ========================== // Symbol/occurrence emission // ========================== - private Optional emitSymbolOccurrence( - Element sym, Tree tree, Name name, Role role, CompilerRange kind) { + private Optional emitSymbolOccurrence( + Element sym, Tree tree, Name name, ScipRole role, CompilerRange kind) { if (sym == null || name == null) return Optional.empty(); - Optional range = semanticdbRange(tree, kind, sym, name.toString()); - if (role == Role.DEFINITION) { + Optional range = scipRangeOf(tree, kind, sym, name.toString()); + if (role == ScipRole.DEFINITION) { emitOccurrence(sym, range, role, computeEnclosingRange(tree)); emitSymbolInformation(sym, tree); return range; @@ -134,19 +129,19 @@ private Optional emitSymbolOccurrence( private void emitOccurrence( Element sym, - Optional range, - Role role, - Optional enclosingRange) { + Optional range, + ScipRole role, + Optional enclosingRange) { if (sym == null || !range.isPresent()) return; String semanticdbSymbol = semanticdbSymbol(sym); if (semanticdbSymbol.equals(SemanticdbSymbols.NONE)) return; Scip.Occurrence.Builder occ = Scip.Occurrence.newBuilder() - .addAllRange(scipRange(range.get())) + .addAllRange(range.get().asScipRange()) .setSymbol(ScipSymbols.fromSemanticdbSymbol(semanticdbSymbol)) .setSymbolRoles(scipRole(role)); - enclosingRange.ifPresent(r -> occ.addAllEnclosingRange(scipRange(r))); + enclosingRange.ifPresent(r -> occ.addAllEnclosingRange(r.asScipRange())); occurrences.add(occ.build()); } @@ -251,28 +246,16 @@ private static boolean supportsReferenceRelationship(Element sym) { } // ================================================= - // Range / role / kind translation between SemanticDB and SCIP. + // Role / kind translation for SCIP emission. // ================================================= - private static int scipRole(Role role) { - if (role == Role.DEFINITION || role == Role.SYNTHETIC_DEFINITION) { + private static int scipRole(ScipRole role) { + if (role == ScipRole.DEFINITION || role == ScipRole.SYNTHETIC_DEFINITION) { return Scip.SymbolRole.Definition_VALUE; } return 0; } - private static List scipRange(Semanticdb.Range range) { - if (range.getStartLine() == range.getEndLine()) { - return Arrays.asList( - range.getStartLine(), range.getStartCharacter(), range.getEndCharacter()); - } - return Arrays.asList( - range.getStartLine(), - range.getStartCharacter(), - range.getEndLine(), - range.getEndCharacter()); - } - private static Scip.SymbolInformation.Kind scipKind(Element sym) { Set modifiers = sym.getModifiers(); boolean isStatic = modifiers.contains(Modifier.STATIC); @@ -378,7 +361,7 @@ private void resolveClassTree(ClassTree node, TreePath treePath) { sym, node, sym.getSimpleName(), - Role.DEFINITION, + ScipRole.DEFINITION, CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); } } @@ -387,7 +370,7 @@ private void resolveTypeParameterTree(TypeParameterTree node, TreePath treePath) Element sym = trees.getElement(treePath); if (sym != null && sym.getSimpleName().length() > 0) { emitSymbolOccurrence( - sym, node, sym.getSimpleName(), Role.DEFINITION, CompilerRange.FROM_POINT_TO_SYMBOL_NAME); + sym, node, sym.getSimpleName(), ScipRole.DEFINITION, CompilerRange.FROM_POINT_TO_SYMBOL_NAME); } } @@ -401,7 +384,7 @@ private void resolveMethodTree(MethodTree node, TreePath treePath) { else name = sym.getSimpleName(); emitSymbolOccurrence( - sym, node, name, Role.DEFINITION, CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); + sym, node, name, ScipRole.DEFINITION, CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); } } } @@ -409,17 +392,17 @@ private void resolveMethodTree(MethodTree node, TreePath treePath) { private void resolveVariableTree(VariableTree node, TreePath treePath) { Element sym = trees.getElement(treePath); if (sym != null) { - Optional range = + Optional range = emitSymbolOccurrence( sym, node, sym.getSimpleName(), - Role.DEFINITION, + ScipRole.DEFINITION, CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); if (sym.getKind() == ElementKind.ENUM_CONSTANT) { TreePath typeTreePath = nodes.get(node.getInitializer()); Element typeSym = trees.getElement(typeTreePath); - if (typeSym != null) emitOccurrence(typeSym, range, Role.REFERENCE, Optional.empty()); + if (typeSym != null) emitOccurrence(typeSym, range, ScipRole.REFERENCE, Optional.empty()); } } } @@ -436,7 +419,7 @@ private void resolveIdentifierTree(IdentifierTree node, TreePath treePath) { Element parentSym = trees.getElement(parentPath); if (parentSym == null || parentSym.getKind() != null) { emitSymbolOccurrence( - sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_START_TO_END); + sym, node, sym.getSimpleName(), ScipRole.REFERENCE, CompilerRange.FROM_START_TO_END); } } } @@ -447,7 +430,7 @@ private void resolveMemberReferenceTree(MemberReferenceTree node, TreePath treeP Element sym = trees.getElement(treePath); if (sym != null) { emitSymbolOccurrence( - sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_END_TO_SYMBOL_NAME); + sym, node, sym.getSimpleName(), ScipRole.REFERENCE, CompilerRange.FROM_END_TO_SYMBOL_NAME); } } @@ -455,7 +438,7 @@ private void resolveMemberSelectTree(MemberSelectTree node, TreePath treePath) { Element sym = trees.getElement(treePath); if (sym != null) { emitSymbolOccurrence( - sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_END_TO_SYMBOL_NAME); + sym, node, sym.getSimpleName(), ScipRole.REFERENCE, CompilerRange.FROM_END_TO_SYMBOL_NAME); } } @@ -473,7 +456,7 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) { sym, node, identifierSym.getSimpleName(), - Role.REFERENCE, + ScipRole.REFERENCE, CompilerRange.FROM_TEXT_SEARCH); } else if (node.getIdentifier().getKind() == Tree.Kind.ANNOTATED_TYPE) { AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier(); @@ -481,7 +464,7 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) { && annotatedTypeTree.getUnderlyingType().getKind() == Tree.Kind.IDENTIFIER) { IdentifierTree ident = (IdentifierTree) annotatedTypeTree.getUnderlyingType(); emitSymbolOccurrence( - sym, ident, ident.getName(), Role.REFERENCE, CompilerRange.FROM_TEXT_SEARCH); + sym, ident, ident.getName(), ScipRole.REFERENCE, CompilerRange.FROM_TEXT_SEARCH); } } } @@ -490,14 +473,14 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) { } // ================================================= - // Helpers shared with SemanticdbVisitor (range / symbol / parent overrides). + // Symbol / range helpers used by the SCIP emission path. // ================================================= private String semanticdbSymbol(Element sym) { return globals.semanticdbSymbol(sym, locals); } - private Optional semanticdbRange( + private Optional scipRangeOf( Tree tree, CompilerRange kind, Element sym, String name) { if (sym == null) return Optional.empty(); @@ -535,13 +518,12 @@ private Optional semanticdbRange( if (start != Diagnostic.NOPOS && end != Diagnostic.NOPOS && end > start) { LineMap lineMap = compUnitTree.getLineMap(); - Semanticdb.Range range = - Semanticdb.Range.newBuilder() - .setStartLine((int) lineMap.getLineNumber(start) - 1) - .setStartCharacter((int) lineMap.getColumnNumber(start) - 1) - .setEndLine((int) lineMap.getLineNumber(end) - 1) - .setEndCharacter((int) lineMap.getColumnNumber(end) - 1) - .build(); + ScipRange range = + new ScipRange( + (int) lineMap.getLineNumber(start) - 1, + (int) lineMap.getColumnNumber(start) - 1, + (int) lineMap.getLineNumber(end) - 1, + (int) lineMap.getColumnNumber(end) - 1); range = correctForTabs(range, lineMap, start); return Optional.of(range); @@ -549,22 +531,19 @@ private Optional semanticdbRange( return Optional.empty(); } - private Semanticdb.Range correctForTabs(Semanticdb.Range range, LineMap lineMap, int start) { + private ScipRange correctForTabs(ScipRange range, LineMap lineMap, int start) { int startLinePos = (int) lineMap.getPosition(lineMap.getLineNumber(start), 0); if (this.source.charAt(startLinePos) == '\t') { int count = 1; while (this.source.charAt(++startLinePos) == '\t') count++; range = - range - .toBuilder() - .setStartCharacter(range.getStartCharacter() - (count * 7)) - .setEndCharacter(range.getEndCharacter() - (count * 7)) - .build(); + range.withCharacters( + range.startCharacter - (count * 7), range.endCharacter - (count * 7)); } return range; } - private Optional computeEnclosingRange(Tree tree) { + private Optional computeEnclosingRange(Tree tree) { if (tree == null) return Optional.empty(); TreePath path = nodes.get(tree); if (path == null) return Optional.empty(); @@ -585,13 +564,12 @@ private Optional computeEnclosingRange(Tree tree) { if (start != Diagnostic.NOPOS && end != Diagnostic.NOPOS && end > start) { LineMap lineMap = compUnitTree.getLineMap(); - Semanticdb.Range range = - Semanticdb.Range.newBuilder() - .setStartLine((int) lineMap.getLineNumber(start) - 1) - .setStartCharacter((int) lineMap.getColumnNumber(start) - 1) - .setEndLine((int) lineMap.getLineNumber(end) - 1) - .setEndCharacter((int) lineMap.getColumnNumber(end) - 1) - .build(); + ScipRange range = + new ScipRange( + (int) lineMap.getLineNumber(start) - 1, + (int) lineMap.getColumnNumber(start) - 1, + (int) lineMap.getLineNumber(end) - 1, + (int) lineMap.getColumnNumber(end) - 1); range = correctForTabs(range, lineMap, start); return Optional.of(range); } From fa52631cd19ef1475f0b0fd9a29e3baa7a47427c Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:50:10 +0200 Subject: [PATCH 15/21] PR3 (D2): semanticdb-javac emits only SCIP shards Drop the legacy SemanticDB code path from the Java compiler plug-in: * SemanticdbTaskListener: stop building Semanticdb.TextDocument and writing META-INF/semanticdb/*.semanticdb; ScipVisitor is now the only emitter, producing META-INF/scip/*.scip directly. The shard path is computed without going through a SemanticDB intermediate. * Delete unused legacy emitter sources: - SemanticdbVisitor.java - SemanticdbTypeVisitor.java - SemanticdbSignatures.java - SemanticdbTrees.java * SemanticdbJavacOptions: drop the emitScip field. Keep -emit-scip:on and -emit-scip:off as deprecated no-ops so cached compiler options keep working without erroring. Migrate the test infrastructure to consume the SCIP shard output: * CompileResult: replace textDocuments(Semanticdb.TextDocuments) with documents(List[Scip.Document]) plus a documentsFromShard helper. * TestCompiler: read META-INF/scip/.scip back from disk after javac runs and surface the documents through CompileResult. * OverridesSuite: assert on SymbolInformation.relationships (is_implementation=true) instead of Semanticdb.getOverriddenSymbolsList. * TargetedSuite: compare positions against Scip.Occurrence.range and strip the placeholder prefix when comparing symbols. * GeneratedConstructorSuite: switch the stub signature from Semanticdb.TextDocument to Scip.Document. * JavacClassesDirectorySuite: verify the shard lands at META-INF/scip/.../Example.java.scip. * ScipShardEmissionSuite: assert that the legacy .semanticdb file is NOT produced; replace the -emit-scip:off shard-suppression test with one that verifies the deprecated flag is still accepted as a no-op. * BaseBuildToolSuite: rename semanticdbPattern/semanticdbFiles to scipShardPattern/scipShards and match META-INF/scip/**.scip so the Gradle/Maven build tool suites continue to count the right files. * Delete tests/snapshots/src/main/scala/tests/SemanticdbFile.scala (no remaining callers). Validation: sbt unit/test (28 passing), sbt snapshots/test (102 passing). --- .../semanticdb_javac/ScipVisitor.java | 5 +- .../SemanticdbJavacOptions.java | 15 +- .../SemanticdbSignatures.java | 116 --- .../SemanticdbTaskListener.java | 250 +------ .../semanticdb_javac/SemanticdbTrees.java | 258 ------- .../SemanticdbTypeVisitor.java | 144 ---- .../semanticdb_javac/SemanticdbVisitor.java | 701 ------------------ .../test/scala/tests/BaseBuildToolSuite.scala | 17 +- .../src/main/scala/tests/SemanticdbFile.scala | 49 -- .../src/main/scala/tests/CompileResult.scala | 28 +- .../src/main/scala/tests/TestCompiler.scala | 35 +- .../tests/GeneratedConstructorSuite.scala | 4 +- .../tests/JavacClassesDirectorySuite.scala | 8 +- .../src/test/scala/tests/OverridesSuite.scala | 42 +- .../scala/tests/ScipShardEmissionSuite.scala | 14 +- .../src/test/scala/tests/TargetedSuite.scala | 56 +- 16 files changed, 169 insertions(+), 1573 deletions(-) delete mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbSignatures.java delete mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTrees.java delete mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTypeVisitor.java delete mode 100644 semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java delete mode 100644 tests/snapshots/src/main/scala/tests/SemanticdbFile.scala diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java index a61aa510c..11f487832 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/ScipVisitor.java @@ -48,9 +48,8 @@ /** * Walks the AST of a typechecked compilation unit and generates a {@link Scip.Document} directly. * - *

Structurally this is a fork of {@link SemanticdbVisitor} that emits SCIP types instead of - * SemanticDB ones. Symbols are produced through {@link GlobalSymbolsCache} and then translated to - * the placeholder SCIP form via {@link ScipSymbols#fromSemanticdbSymbol(String)}. Signature + *

We can't guarantee ordering of SymbolOccurrence in SemanticDB payloads so it's good to sort - * them before processing. - */ -public class RangeComparator implements java.util.Comparator { - - @Override - public int compare(Range r1, Range r2) { - int byStartLine = Integer.compare(r1.getStartLine(), r2.getStartLine()); - if (byStartLine != 0) { - return byStartLine; - } - int byStartCharacter = Integer.compare(r1.getStartCharacter(), r2.getStartCharacter()); - if (byStartCharacter != 0) { - return byStartCharacter; - } - int byEndLine = Integer.compare(r1.getEndLine(), r2.getEndLine()); - if (byEndLine != 0) { - return byEndLine; - } - return Integer.compare(r1.getEndCharacter(), r2.getEndCharacter()); - } -} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipSemanticdb.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipSemanticdb.java deleted file mode 100644 index 789a9afef..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipSemanticdb.java +++ /dev/null @@ -1,427 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import com.google.protobuf.CodedInputStream; -import com.sourcegraph.semanticdb_javac.Semanticdb; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Kind; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Property; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role; -import com.sourcegraph.semanticdb_javac.SemanticdbSymbols; -import com.sourcegraph.Scip; - -import java.io.IOException; -import java.net.URI; -import java.nio.file.*; -import java.util.*; - -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -/** The core logic that converts SemanticDB into SCIP. */ -public class ScipSemanticdb { - private final ScipWriter writer; - private final ScipSemanticdbOptions options; - - public ScipSemanticdb(ScipWriter writer, ScipSemanticdbOptions options) { - this.writer = writer; - this.options = options; - } - - public static void run(ScipSemanticdbOptions options) throws IOException { - ScipWriter writer = new ScipWriter(options); - new ScipSemanticdb(writer, options).run(); - } - - private void run() throws IOException { - PackageTable packages = new PackageTable(options); - List files = SemanticdbWalker.findSemanticdbFiles(options); - Collections.sort(files); - if (options.reporter.hasErrors()) return; - if (files.isEmpty() && !options.allowEmptyIndex) { - options.reporter.error( - "No SemanticDB files found. " - + "This typically means that `scip-java` is unable to automatically " - + "index this codebase. If you are using Gradle or Maven, please report an issue to " - + "https://github.com/sourcegraph/scip-java and include steps to reproduce. " - + "If you are using a different build tool, make sure that you have followed all " - + "of the steps from https://sourcegraph.github.io/scip-java/docs/manual-configuration.html"); - return; - } - options.reporter.startProcessing(files.size()); - runTyped(files, packages); - writer.build(); - options.reporter.endProcessing(); - } - - private void runTyped(List files, PackageTable packages) { - writer.emitTyped(typedMetadata()); - InverseReferenceRelationships references = inverseReferenceRelationships(files); - filesStream(files).forEach(document -> processTypedDocument(document, packages, references)); - } - - private String typedSymbol(String symbol, Package pkg) { - if (symbol.isEmpty()) { - return ""; - } - if (symbol.startsWith("local")) { - return "local " + symbol.substring("local".length()); - } - return "semanticdb maven " + pkg.repoName() + " " + pkg.version() + " " + symbol; - } - - private static Scip.SymbolInformation.Kind scipKind(SymbolInformation info) { - Kind kind = info.getKind(); - int properties = info.getProperties(); - boolean isStatic = (properties & Property.STATIC_VALUE) > 0; - boolean isAbstract = (properties & Property.ABSTRACT_VALUE) > 0; - boolean isEnum = (properties & Property.ENUM_VALUE) > 0; - - switch (kind) { - case CLASS: - if (isEnum) { - return Scip.SymbolInformation.Kind.Enum; - } else { - return Scip.SymbolInformation.Kind.Class; - } - case CONSTRUCTOR: - return Scip.SymbolInformation.Kind.Constructor; - case FIELD: - if (isStatic) { - return Scip.SymbolInformation.Kind.StaticField; - } else { - return Scip.SymbolInformation.Kind.Field; - } - case INTERFACE: - return Scip.SymbolInformation.Kind.Interface; - case LOCAL: - if (isStatic) { - return Scip.SymbolInformation.Kind.StaticVariable; - } else { - return Scip.SymbolInformation.Kind.Variable; - } - case MACRO: - return Scip.SymbolInformation.Kind.Macro; - case METHOD: - if (isStatic) { - return Scip.SymbolInformation.Kind.StaticMethod; - } else if (isAbstract) { - return Scip.SymbolInformation.Kind.AbstractMethod; - } else { - return Scip.SymbolInformation.Kind.Method; - } - case OBJECT: - return Scip.SymbolInformation.Kind.Object; - case PACKAGE: - return Scip.SymbolInformation.Kind.Package; - case PACKAGE_OBJECT: - return Scip.SymbolInformation.Kind.PackageObject; - case PARAMETER: - return Scip.SymbolInformation.Kind.Parameter; - case SELF_PARAMETER: - return Scip.SymbolInformation.Kind.SelfParameter; - case TRAIT: - return Scip.SymbolInformation.Kind.Trait; - case TYPE: - if (isEnum) { - return Scip.SymbolInformation.Kind.Enum; - } else { - return Scip.SymbolInformation.Kind.Type; - } - case TYPE_PARAMETER: - return Scip.SymbolInformation.Kind.TypeParameter; - case UNKNOWN_KIND: - return Scip.SymbolInformation.Kind.UnspecifiedKind; - } - - return Scip.SymbolInformation.Kind.UnspecifiedKind; - } - - public static boolean isDefinitionRole(Role role) { - return role == Role.DEFINITION || role == Role.SYNTHETIC_DEFINITION; - } - - private void processTypedDocument( - Path path, PackageTable packages, InverseReferenceRelationships references) { - for (ScipTextDocument doc : parseTextDocument(path).collect(Collectors.toList())) { - if (doc.semanticdb.getOccurrencesCount() == 0) { - continue; - } - - Path absolutePath = Paths.get(URI.create(doc.semanticdb.getUri())); - String relativePath = - StreamSupport.stream(options.sourceroot.relativize(absolutePath).spliterator(), false) - .map(p -> p.getFileName().toString()) - .collect(Collectors.joining("/")); - Scip.Document.Builder tdoc = Scip.Document.newBuilder().setRelativePath(relativePath); - for (SymbolOccurrence occ : doc.sortedSymbolOccurrences()) { - if (occ.getSymbol().isEmpty()) { - continue; - } - int role = 0; - if (isDefinitionRole(occ.getRole())) { - role |= Scip.SymbolRole.Definition_VALUE; - } - boolean isSingleLineRange = occ.getRange().getStartLine() == occ.getRange().getEndLine(); - Iterable range = - isSingleLineRange - ? Arrays.asList( - occ.getRange().getStartLine(), - occ.getRange().getStartCharacter(), - occ.getRange().getEndCharacter()) - : Arrays.asList( - occ.getRange().getStartLine(), - occ.getRange().getStartCharacter(), - occ.getRange().getEndLine(), - occ.getRange().getEndCharacter()); - Package pkg = packages.packageForSymbol(occ.getSymbol()).orElse(Package.EMPTY); - Scip.Occurrence.Builder occBuilder = - Scip.Occurrence.newBuilder() - .addAllRange(range) - .setSymbol(typedSymbol(occ.getSymbol(), pkg)) - .setSymbolRoles(role); - // Add enclosing_range if it exists - if (occ.hasEnclosingRange()) { - Semanticdb.Range enclosingRange = occ.getEnclosingRange(); - boolean isEnclosingSingleLine = - enclosingRange.getStartLine() == enclosingRange.getEndLine(); - Iterable enclosingRangeInts = - isEnclosingSingleLine - ? Arrays.asList( - enclosingRange.getStartLine(), - enclosingRange.getStartCharacter(), - enclosingRange.getEndCharacter()) - : Arrays.asList( - enclosingRange.getStartLine(), - enclosingRange.getStartCharacter(), - enclosingRange.getEndLine(), - enclosingRange.getEndCharacter()); - occBuilder.addAllEnclosingRange(enclosingRangeInts); - } - tdoc.addOccurrences(occBuilder); - } - Symtab symtab = new Symtab(doc.semanticdb); - for (SymbolInformation info : doc.semanticdb.getSymbolsList()) { - if (info.getSymbol().isEmpty()) { - continue; - } - Package pkg = packages.packageForSymbol(info.getSymbol()).orElse(Package.EMPTY); - Scip.SymbolInformation.Builder scipInfo = - Scip.SymbolInformation.newBuilder().setSymbol(typedSymbol(info.getSymbol(), pkg)); - - scipInfo.setDisplayName(info.getDisplayName()); - if (!info.getEnclosingSymbol().isEmpty()) { - scipInfo.setEnclosingSymbol(typedSymbol(info.getEnclosingSymbol(), pkg)); - } - - scipInfo.setKind(scipKind(info)); - - // TODO: this can be removed once https://github.com/sourcegraph/sourcegraph/issues/50927 is - // fixed. - ArrayList inverseReferences = references.map.get(info.getSymbol()); - if (inverseReferences != null) { - for (String inverseReference : inverseReferences) { - Package inverseReferencePkg = - packages.packageForSymbol(inverseReference).orElse(Package.EMPTY); - scipInfo.addRelationships( - Scip.Relationship.newBuilder() - .setSymbol(typedSymbol(inverseReference, inverseReferencePkg)) - .setIsImplementation(true) - .setIsReference(true)); - } - } - - for (int i = 0; i < info.getDefinitionRelationshipsCount(); i++) { - String definitionSymbol = info.getDefinitionRelationships(i); - if (definitionSymbol.isEmpty()) { - continue; - } - Package definitionSymbolPkg = - packages.packageForSymbol(definitionSymbol).orElse(Package.EMPTY); - SymbolInformation definitionInfo = symtab.symbols.get(definitionSymbol); - - scipInfo.addRelationships( - Scip.Relationship.newBuilder() - .setSymbol(typedSymbol(definitionSymbol, definitionSymbolPkg)) - .setIsDefinition(true) - .setIsReference( - definitionInfo != null - && definitionInfo.getDisplayName().equals(info.getDisplayName()) - && supportsReferenceRelationship(info))); - } - - for (int i = 0; i < info.getOverriddenSymbolsCount(); i++) { - String overriddenSymbol = info.getOverriddenSymbols(i); - if (overriddenSymbol.isEmpty()) { - continue; - } - if (isIgnoredOverriddenSymbol(overriddenSymbol)) { - continue; - } - Package overriddenSymbolPkg = - packages.packageForSymbol(overriddenSymbol).orElse(Package.EMPTY); - scipInfo.addRelationships( - Scip.Relationship.newBuilder() - .setSymbol(typedSymbol(overriddenSymbol, overriddenSymbolPkg)) - .setIsImplementation(true) - .setIsReference(supportsReferenceRelationship(info))); - } - if (info.hasSignature()) { - String language = - doc.semanticdb.getLanguage().toString().toLowerCase(Locale.ROOT).intern(); - String signature = new SignatureFormatter(info, symtab).formatSymbol(); - Scip.Document.Builder signatureDocumentation = - Scip.Document.newBuilder() - .setRelativePath(relativePath) - .setLanguage(language) - .setText(signature); - scipInfo.setSignatureDocumentation(signatureDocumentation); - } - String documentation = info.getDocumentation().getMessage(); - if (!documentation.isEmpty()) { - scipInfo.addDocumentation(documentation); - } - tdoc.addSymbols(scipInfo); - } - writer.emitTyped(Scip.Index.newBuilder().addDocuments(tdoc).build()); - } - } - - private Scip.Index typedMetadata() { - return Scip.Index.newBuilder() - .setMetadata( - Scip.Metadata.newBuilder() - .setVersion(Scip.ProtocolVersion.UnspecifiedProtocolVersion) - .setProjectRoot(options.sourceroot.toUri().toString()) - .setTextDocumentEncoding(Scip.TextEncoding.UTF8) - .setToolInfo( - Scip.ToolInfo.newBuilder() - .setName(options.toolInfo.getName()) - .setVersion(options.toolInfo.getVersion()) - .addAllArguments(options.toolInfo.getArgumentsList()))) - .build(); - } - - private Stream filesStream(List files) { - return options.parallel ? files.parallelStream() : files.stream(); - } - - private static class InverseReferenceRelationships { - public final Map> map; - - private InverseReferenceRelationships(Map> map) { - this.map = map; - } - } - - private InverseReferenceRelationships inverseReferenceRelationships(List files) { - if (!options.emitInverseRelationships) { - return new InverseReferenceRelationships(Collections.emptyMap()); - } - return new InverseReferenceRelationships( - filesStream(files) - .flatMap(this::parseTextDocument) - .flatMap(this::referenceRelationships) - .collect( - Collectors.groupingBy( - SymbolRelationship::getTo, - Collectors.mapping( - SymbolRelationship::getFrom, Collectors.toCollection(ArrayList::new))))); - } - - private Stream referenceRelationships(ScipTextDocument document) { - ArrayList relationships = new ArrayList<>(); - for (int i = 0; i < document.semanticdb.getSymbolsCount(); i++) { - SymbolInformation info = document.semanticdb.getSymbols(i); - if (!supportsReferenceRelationship(info)) { - continue; - } - if (info.getSymbol().isEmpty() || SemanticdbSymbols.isLocal(info.getSymbol())) { - continue; - } - for (int j = 0; j < info.getOverriddenSymbolsCount(); j++) { - String overriddenSymbol = info.getOverriddenSymbols(j); - if (SemanticdbSymbols.isLocal(overriddenSymbol)) { - continue; - } - relationships.add(new SymbolRelationship(info.getSymbol(), overriddenSymbol)); - } - } - return relationships.stream(); - } - - private static boolean supportsReferenceRelationship(SymbolInformation info) { - switch (info.getKind()) { - case INTERFACE: - case TYPE: - case CLASS: - case OBJECT: - case PACKAGE_OBJECT: - return false; - default: - return true; - } - } - - private Stream parseTextDocument(Path semanticdbPath) { - try { - return textDocumentsParseFrom(semanticdbPath).getDocumentsList().stream() - .filter(sdb -> !sdb.getOccurrencesList().isEmpty()) - .map(sdb -> new ScipTextDocument(semanticdbPath, sdb, options.sourceroot)); - } catch (IOException e) { - options.reporter.error("invalid protobuf: " + semanticdbPath); - options.reporter.error(e); - return Stream.empty(); - } - } - - private static PathMatcher jarPattern = FileSystems.getDefault().getPathMatcher("glob:**.jar"); - - private Semanticdb.TextDocuments textDocumentsParseFrom(Path semanticdbPath) throws IOException { - if (jarPattern.matches(semanticdbPath)) { - return textDocumentsParseJarFile(semanticdbPath); - } - return textDocumentsParseFromBytes(Files.readAllBytes(semanticdbPath)); - } - - private Semanticdb.TextDocuments textDocumentsParseJarFile(Path jarFile) throws IOException { - Semanticdb.TextDocuments.Builder result = Semanticdb.TextDocuments.newBuilder(); - try (JarFile file = new JarFile(jarFile.toFile())) { - Enumeration entries = file.entries(); - while (entries.hasMoreElements()) { - JarEntry element = entries.nextElement(); - if (element.getName().endsWith(".semanticdb")) { - byte[] bytes = InputStreamBytes.readAll(file.getInputStream(element)); - result.addAllDocuments(textDocumentsParseFromBytes(bytes).getDocumentsList()); - } - } - } - return result.build(); - } - - private Semanticdb.TextDocuments textDocumentsParseFromBytes(byte[] bytes) throws IOException { - try { - CodedInputStream in = CodedInputStream.newInstance(bytes); - in.setRecursionLimit(1000); - return Semanticdb.TextDocuments.parseFrom(in); - } catch (NoSuchMethodError ignored) { - // NOTE(olafur): For some reason, NoSuchMethodError gets thrown when running - // `snapshots/run` - // in the sbt build. I'm unable to reproduce the error in `snapshots/test` or - // when running the - // published version - // of `scip-java index`. - return Semanticdb.TextDocuments.parseFrom(bytes); - } - } - - private boolean isIgnoredOverriddenSymbol(String symbol) { - // Skip java/lang/Object# and similar symbols from Scala since it's the parent - // of all classes - // making it noisy for "find implementations" results. - return symbol.equals("java/lang/Object#"); - } -} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipTextDocument.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipTextDocument.java deleted file mode 100644 index 4b6307a88..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipTextDocument.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import com.sourcegraph.semanticdb_javac.Semanticdb; - -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; - -/** Wrapper around a SemanticDB TextDocument with SCIP-related utilities. */ -public class ScipTextDocument { - public final Path semanticdbPath; - public final Semanticdb.TextDocument semanticdb; - - public ScipTextDocument( - Path semanticdbPath, Semanticdb.TextDocument semanticdb, Path sourceroot) { - this.semanticdbPath = semanticdbPath; - String uri = sourceroot.resolve(semanticdb.getUri()).toUri().toString(); - this.semanticdb = Semanticdb.TextDocument.newBuilder(semanticdb).setUri(uri).build(); - } - - @Override - public String toString() { - return "ScipDocument{" + "path=" + semanticdbPath + ", semanticdb=" + semanticdb + '}'; - } - - public List sortedSymbolOccurrences() { - return ScipTextDocument.sortedSymbolOccurrences(semanticdb); - } - - public static List sortedSymbolOccurrences( - Semanticdb.TextDocument semanticdb) { - ArrayList result = - new ArrayList<>(semanticdb.getOccurrencesList().size()); - result.addAll(semanticdb.getOccurrencesList()); - for (Semanticdb.Synthetic synthetic : semanticdb.getSyntheticsList()) { - addAllSyntheticOccurrences(synthetic, result); - } - result.sort((o1, o2) -> new RangeComparator().compare(o1.getRange(), o2.getRange())); - return result; - } - - private static void addAllSyntheticOccurrences( - Semanticdb.Synthetic synthetic, ArrayList buffer) { - Semanticdb.Range offsetRange = - Semanticdb.Range.newBuilder(synthetic.getRange()) - .setStartLine(synthetic.getRange().getEndLine()) - .setStartCharacter(synthetic.getRange().getEndCharacter()) - .build(); - new SemanticdbTreeVisitor() { - @Override - void visitIdTree(Semanticdb.IdTree tree) { - Semanticdb.SymbolOccurrence syntheticOccurrence = - Semanticdb.SymbolOccurrence.newBuilder() - .setRange(offsetRange) - .setSymbol(tree.getSymbol()) - .setRole(Semanticdb.SymbolOccurrence.Role.REFERENCE) - .build(); - buffer.add(syntheticOccurrence); - } - }.visitTree(synthetic.getTree()); - } -} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SemanticdbTreeVisitor.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SemanticdbTreeVisitor.java deleted file mode 100644 index 3ecd82a48..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SemanticdbTreeVisitor.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import com.sourcegraph.semanticdb_javac.Semanticdb.*; - -public abstract class SemanticdbTreeVisitor { - public void visitTree(Tree tree) { - if (tree.hasApplyTree()) { - this.visitApplyTree(tree.getApplyTree()); - } else if (tree.hasFunctionTree()) { - this.visitFunctionTree(tree.getFunctionTree()); - } else if (tree.hasIdTree()) { - this.visitIdTree(tree.getIdTree()); - } else if (tree.hasLiteralTree()) { - this.visitLiteralTree(tree.getLiteralTree()); - } else if (tree.hasMacroExpansionTree()) { - this.visitMacroExpansionTree(tree.getMacroExpansionTree()); - } else if (tree.hasOriginalTree()) { - this.visitOriginalTree(tree.getOriginalTree()); - } else if (tree.hasSelectTree()) { - this.visitSelectTree(tree.getSelectTree()); - } else if (tree.hasTypeApplyTree()) { - this.visitTypeApplyTree(tree.getTypeApplyTree()); - } else if (tree.hasAnnotationTree()) { - this.visitAnnotationTree(tree.getAnnotationTree()); - } else if (tree.hasAssignTree()) { - this.visitAssignTree(tree.getAssignTree()); - } else if (tree.hasBinopTree()) { - this.visitBinaryOperatorTree(tree.getBinopTree()); - } - } - - void visitApplyTree(ApplyTree tree) { - visitTree(tree.getFunction()); - for (Tree argument : tree.getArgumentsList()) { - visitTree(argument); - } - } - - void visitFunctionTree(FunctionTree tree) { - for (IdTree parameter : tree.getParametersList()) { - visitIdTree(parameter); - } - visitTree(tree.getBody()); - } - - void visitIdTree(IdTree tree) {} - - void visitLiteralTree(LiteralTree tree) {} - - void visitMacroExpansionTree(MacroExpansionTree tree) { - visitTree(tree.getBeforeExpansion()); - } - - void visitOriginalTree(OriginalTree tree) {} - - void visitSelectTree(SelectTree tree) { - visitTree(tree.getQualifier()); - visitIdTree(tree.getId()); - } - - void visitTypeApplyTree(TypeApplyTree tree) { - visitTree(tree.getFunction()); - } - - void visitAnnotationTree(AnnotationTree tree) { - for (Tree parameter : tree.getParametersList()) { - visitTree(parameter); - } - } - - void visitAssignTree(AssignTree tree) { - visitTree(tree.getLhs()); - visitTree(tree.getRhs()); - } - - void visitBinaryOperatorTree(BinaryOperatorTree tree) { - visitTree(tree.getLhs()); - visitTree(tree.getRhs()); - } -} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SemanticdbWalker.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SemanticdbWalker.java deleted file mode 100644 index c0cd0a717..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SemanticdbWalker.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import java.io.IOException; -import java.nio.file.FileSystems; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.PathMatcher; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.List; - -/** A file visitor that recursively collects all SemanticDB files in a given directory. */ -public class SemanticdbWalker extends SimpleFileVisitor { - private final ArrayList result; - private final ScipSemanticdbOptions options; - private final PathMatcher semanticdbPattern = - FileSystems.getDefault().getPathMatcher("glob:**.semanticdb"); - - public SemanticdbWalker(ScipSemanticdbOptions options) { - this.options = options; - result = new ArrayList<>(); - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - if (semanticdbPattern.matches(file)) { - result.add(file); - } - return super.visitFile(file, attrs); - } - - @Override - public FileVisitResult visitFileFailed(Path file, IOException exc) { - options.reporter.error(exc); - return FileVisitResult.CONTINUE; - } - - public static List findSemanticdbFiles(ScipSemanticdbOptions options) throws IOException { - SemanticdbWalker walker = new SemanticdbWalker(options); - PathMatcher jarPattern = FileSystems.getDefault().getPathMatcher("glob:**.jar"); - for (Path root : options.targetroots) { - if (jarPattern.matches(root)) { - walker.result.add(root); - } else { - Files.walkFileTree(root, walker); - } - } - return walker.result; - } -} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SignatureFormatter.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SignatureFormatter.java deleted file mode 100644 index fc306ad25..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SignatureFormatter.java +++ /dev/null @@ -1,822 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Property; -import com.sourcegraph.semanticdb_javac.Semanticdb.*; - -import com.sourcegraph.semanticdb_javac.SemanticdbSymbols; - -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -import static com.sourcegraph.semanticdb_javac.SemanticdbBuilders.typeRef; - -public class SignatureFormatter { - private static final Type OBJECT_TYPE_REF = typeRef("java/lang/Object#"); - private static final Type PRODUCT_TYPE_REF = typeRef("scala/Product#"); - private static final Type SCALA_SERIALIZABLE_TYPE_REF = typeRef("scala/package.Serializable#"); - private static final Type JAVA_SERIALIZABLE_TYPE_REF = typeRef("java/util/Serializable#"); - private static final Type SCALA_ANY_TYPE_REF = typeRef("scala/Any#"); - private static final Type SCALA_ANYREF_TYPE_REF = typeRef("scala/AnyRef#"); - - private static final Type WILDCARD_TYPE_REF = typeRef("local_wildcard"); - - private static final Type NOTHING_SYMBOL = typeRef("scala/Nothing#"); - private static final String FUNCTION_SYMBOL_PREFIX = "scala/Function"; - // Special case scala/Function object to not conflict with Function1 for example - private static final String FUNCTION_OBJECT = "scala/Function."; - private static final String TUPLE_SYMBOL_PREFIX = "scala/Tuple"; - private static final String ARRAY_SYMBOL = "scala/Array#"; - private static final String ENUM_SYMBOL = "java/lang/Enum#"; - private static final String ANNOTATION_SYMBOL = "java/lang/annotation/Annotation#"; - private static final Set REDUNDANT_CLASS_PARENTS = new HashSet<>(); - private static final Set CASE_CLASS_PARENTS = new HashSet<>(); - - { - REDUNDANT_CLASS_PARENTS.add(OBJECT_TYPE_REF); - REDUNDANT_CLASS_PARENTS.add(SCALA_ANY_TYPE_REF); - REDUNDANT_CLASS_PARENTS.add(SCALA_ANYREF_TYPE_REF); - - CASE_CLASS_PARENTS.add(PRODUCT_TYPE_REF); - CASE_CLASS_PARENTS.add(SCALA_SERIALIZABLE_TYPE_REF); - CASE_CLASS_PARENTS.add(JAVA_SERIALIZABLE_TYPE_REF); - } - - private final StringBuilder s = new StringBuilder(); - private final SymbolInformation symbolInformation; - private final Symtab symtab; - private final boolean isScala; - - public SignatureFormatter(SymbolInformation symbolInformation, Symtab symtab) { - this.symbolInformation = symbolInformation; - this.symtab = symtab; - this.isScala = symbolInformation.getLanguage() == Language.SCALA; - } - - public String formatSymbol() { - try { - return formatSymbolUnsafe(); - } catch (Exception e) { - throw new SignatureFormatterException(symbolInformation, e); - } - } - - private String formatSymbolUnsafe() { - Signature signature = symbolInformation.getSignature(); - if (signature.hasClassSignature()) { - formatClassSignature(signature.getClassSignature()); - } else if (signature.hasMethodSignature()) { - formatMethodSignature(signature.getMethodSignature()); - } else if (signature.hasValueSignature()) { - formatValueSignature(signature.getValueSignature()); - } else if (signature.hasTypeSignature()) { - formatTypeParameterSignature(signature.getTypeSignature()); - } - return s.toString(); - } - - private void formatClassSignature(ClassSignature classSignature) { - boolean isAnnotation = - classSignature.getParentsList().stream() - .anyMatch(t -> t.getTypeRef().getSymbol().equals(ANNOTATION_SYMBOL)); - - boolean isEnum = has(Property.ENUM); - boolean isInterface = symbolInformation.getKind() == SymbolInformation.Kind.INTERFACE; - - printKeywordln(formatAnnotations()); - - printKeyword(formatAccess()); - if (!isEnum && !isAnnotation && !isInterface) printKeyword(formatModifiers()); - - switch (symbolInformation.getKind()) { - case CLASS: - if (isEnum) { - printKeyword("enum"); - } else { - printKeyword("class"); - } - break; - case INTERFACE: - if (isAnnotation) { - printKeyword("@interface"); - break; - } - printKeyword("interface"); - break; - case OBJECT: - printKeyword("object"); - break; - case TRAIT: - printKeyword("trait"); - break; - case PACKAGE_OBJECT: - printKeyword("package object"); - break; - default: - break; - } - s.append(symbolInformation.getDisplayName()); - if (symbolInformation.getKind() == SymbolInformation.Kind.CLASS && has(Property.CASE)) { - primaryConstructor(classSignature) - .ifPresent( - constructorSignature -> - formatScalaParameterList(constructorSignature.getParameterListsList())); - } - - List typeParameters = getSymlinks(classSignature.getTypeParameters()); - if (!typeParameters.isEmpty()) { - s.append( - typeParameters.stream() - .map(this::formatTypeParameter) - .collect(Collectors.joining(", ", isScala ? "[" : "<", isScala ? "]" : ">"))); - } - - boolean hasNonRedundantParent = - classSignature.getParentsList().size() > 0 - && !REDUNDANT_CLASS_PARENTS.contains(classSignature.getParentsList().get(0)); - - boolean isCaseClass = - isScala - && symbolInformation.getKind() == SymbolInformation.Kind.CLASS - && has(Property.CASE); - - List nonSyntheticParents = - classSignature.getParentsList().stream() - .filter(parent -> !REDUNDANT_CLASS_PARENTS.contains(parent)) - .filter(parent -> !parent.getTypeRef().getSymbol().equals(ENUM_SYMBOL)) - .filter(parent -> isCaseClass && !CASE_CLASS_PARENTS.contains(parent)) - .filter(parent -> !parent.getTypeRef().getSymbol().equals(ANNOTATION_SYMBOL)) - .collect(Collectors.toList()); - - if (nonSyntheticParents.isEmpty()) return; - - if (isScala) { - printKeyword(" extends"); - s.append( - nonSyntheticParents.stream().map(this::formatType).collect(Collectors.joining(" with "))); - return; - } - - // Determine which parents from ClassSignature.parents are classes or interfaces so we know to - // use - // 'extends' or 'implements'. - // The logic is as follows: - // 1. If the symbol has type CLASS, there will always be at least 1 parent. For enums, this is - // java/lang/Enum#, otherwise it is java/lang/Object# if no superclass is specified. - // Therefore, if the parents list contains java/lang/Object# type or the symbol is an enum, - // then no superclass was defined and all parents are interfaces and we must print - // 'implements' - // followed by all superinterfaces. - // Else if it is not an enum and the list of non-synthetic parents is non empty, a superclass - // was specified and we must print it with the 'extends' keyword prefixed, followed by - // 'implements' and all superinterfaces, if any. - // 2. If the symbol has type INTERFACE, then any defined parents must also be interfaces, so if - // the list of non-synthetic parents is not empty, print 'implements' and all - // superinterfaces. - switch (symbolInformation.getKind()) { - case CLASS: - // if no superclass or is an enum, every non synthetic parent is an interface - if (isEnum || !hasNonRedundantParent) { - printKeyword(" implements"); - - String superInterfaces = - nonSyntheticParents.stream().map(this::formatType).collect(Collectors.joining(", ")); - s.append(superInterfaces); - } else { - // else if has a superclass and is not an enum - printKeyword(" extends"); - s.append(formatType(nonSyntheticParents.get(0))); - - String superInterfaces = - nonSyntheticParents.stream() - .skip(1) - .map(this::formatType) - .collect(Collectors.joining(", ")); - if (!superInterfaces.isEmpty()) { - printKeyword(" implements"); - s.append(superInterfaces); - } - } - break; - case INTERFACE: - // can only extend other interfaces - printKeyword(" extends"); - - String superInterfaces = - nonSyntheticParents.stream().map(this::formatType).collect(Collectors.joining(", ")); - s.append(superInterfaces); - } - } - - private void formatMethodSignature(MethodSignature methodSignature) { - if (isScala) { - formatScalaMethodSignature(methodSignature); - return; - } - - printKeywordln(formatAnnotations()); - printKeyword(formatAccess()); - printKeyword(formatModifiers()); - - List typeParameters = getSymlinks(methodSignature.getTypeParameters()); - if (!typeParameters.isEmpty()) { - printKeyword( - typeParameters.stream() - .map(this::formatTypeParameter) - .collect(Collectors.joining(", ", "<", ">"))); - } - - if (symbolInformation.getKind() == SymbolInformation.Kind.CONSTRUCTOR) { - String owner = SymbolDescriptor.parseFromSymbol(symbolInformation.getSymbol()).owner; - // Fix for https://github.com/sourcegraph/scip-java/issues/150 - if (!owner.equals(SemanticdbSymbols.NONE)) { - s.append(SymbolDescriptor.parseFromSymbol(owner).descriptor.name); - } - } else { - printKeyword(formatType(methodSignature.getReturnType())); - s.append(symbolInformation.getDisplayName()); - } - - s.append( - methodSignature.getParameterListsList().stream() - .flatMap((params) -> getSymlinks(params).stream()) - .map(this::formatTermParameter) - .collect(Collectors.joining(", ", "(", ")"))); - - if (!methodSignature.getThrowsList().isEmpty()) { - printKeyword(" throws"); - s.append( - methodSignature.getThrowsList().stream() - .map(this::formatType) - .collect(Collectors.joining(", "))); - } - } - - private String formatTermParameter(SymbolInformation info) { - if (info == null) return ""; - if (isScala) { - return info.getDisplayName() - + ": " - + formatType(info.getSignature().getValueSignature().getTpe()); - } - return formatType(info.getSignature().getValueSignature().getTpe()) - + " " - + info.getDisplayName(); - } - - private void formatScalaMethodSignature(MethodSignature methodSignature) { - printKeywordln(formatAnnotations()); - printKeyword(formatAccess()); - printKeyword(formatModifiers()); - if (has(Property.VAL)) { - printKeyword("val"); - } else if (has(Property.VAR)) { - printKeyword("var"); - } else { - printKeyword("def"); - } - s.append( - symbolInformation.getKind() == SymbolInformation.Kind.CONSTRUCTOR - ? "this" - : symbolInformation.getDisplayName()); - formatScalaParameterList(methodSignature.getParameterListsList()); - if (symbolInformation.getKind() != SymbolInformation.Kind.CONSTRUCTOR) { - printKeyword(":"); - s.append(this.formatType(methodSignature.getReturnType())); - } - } - - private Optional primaryConstructor(ClassSignature classSignature) { - Symtab scopeSymtab = symtab.withHardlinks(classSignature.getDeclarations()); - int n = classSignature.getDeclarations().getSymlinksCount(); - for (int i = 0; i < n; i++) { - String symlink = classSignature.getDeclarations().getSymlinks(i); - SymbolInformation info = scopeSymtab.symbols.get(symlink); - if (info != null - && info.getKind() == SymbolInformation.Kind.CONSTRUCTOR - && has(Property.PRIMARY, info) - && info.hasSignature() - && info.getSignature().hasMethodSignature()) { - return Optional.of(info.getSignature().getMethodSignature()); - } - } - return Optional.empty(); - } - - private void formatScalaParameterList(List parameterList) { - for (Scope scope : parameterList) { - List infos = - scope.getHardlinksCount() > 0 ? scope.getHardlinksList() : getSymlinks(scope); - s.append( - infos.stream() - .map(this::formatTermParameter) - .collect(Collectors.joining(", ", "(", ")"))); - } - } - - private void formatValueSignature(ValueSignature valueSignature) { - printKeywordln(formatAnnotations()); - if (isEnumConstant()) { - String ownerSym = SymbolDescriptor.parseFromSymbol(symbolInformation.getSymbol()).owner; - SymbolInformation ownerInfo = symtab.symbols.get(ownerSym); - List enumConstants = - getSymlinks(ownerInfo.getSignature().getClassSignature().getDeclarations()).stream() - .filter(Objects::nonNull) - .filter(this::isEnumConstant) - .collect(Collectors.toList()); - int ordinal = enumConstants.indexOf(symbolInformation); - s.append(ownerInfo.getDisplayName()).append('.'); - s.append(this.symbolInformation.getDisplayName()); - s.append(" /* ordinal ").append(ordinal).append(" */"); - } else { - printKeyword(formatAccess()); - printKeyword(formatModifiers()); - if (isScala) { - s.append(symbolInformation.getDisplayName()); - printKeyword(":"); - printKeyword(formatType(valueSignature.getTpe())); - } else { - printKeyword(formatType(valueSignature.getTpe())); - s.append(symbolInformation.getDisplayName()); - } - } - } - - private void formatTypeParameterSignature(TypeSignature typeSignature) { - if (isScala && symbolInformation.getKind() == SymbolInformation.Kind.TYPE) { - printKeyword("type"); - } - s.append(symbolInformation.getDisplayName()); - if (typeSignature.hasLowerBound() - && (!isScala || !typeSignature.getLowerBound().equals(NOTHING_SYMBOL))) { - printKeyword(isScala ? " >:" : " super"); - s.append(formatType(typeSignature.getLowerBound())); - } - if (typeSignature.hasUpperBound() - && !typeSignature.getUpperBound().equals(isScala ? SCALA_ANY_TYPE_REF : OBJECT_TYPE_REF)) { - printKeyword(isScala ? " <:" : " extends"); - s.append(formatType(typeSignature.getUpperBound())); - } - } - - /** - * Transforms symlinks from a Scope into a List of SymbolInformation's looked up in the Symtab. - */ - private List getSymlinks(Scope scope) { - ArrayList symlinks = new ArrayList<>(); - for (int i = 0; i < scope.getSymlinksCount(); i++) { - SymbolInformation info = symtab.symbols.get(scope.getSymlinks(i)); - if (info != null) { - symlinks.add(info); - } - } - return symlinks; - } - - /** - * Formats one of a method's/class's type parameter symbols through recursion from the - * SymbolInformation extracted from the Symtab. This works by the signature being a TypeSignature. - */ - private String formatTypeParameter(SymbolInformation typeInfo) { - return new SignatureFormatter(typeInfo, symtab).formatSymbol(); - } - - private String formatTypeArguments(List typeArguments) { - if (typeArguments.isEmpty()) return ""; - - return typeArguments.stream() - .map(this::formatType) - .collect(Collectors.joining(", ", isScala ? "[" : "<", isScala ? "]" : ">")); - } - - private String formatAnnotations() { - return formatAnnotations(symbolInformation); - } - - private String formatAnnotations(SymbolInformation symInfo) { - return symInfo.getAnnotationsList().stream() - .map(this::formatAnnotation) - .collect(Collectors.joining("\n")); - } - - private String formatAnnotation(AnnotationTree annotation) { - StringBuilder b = new StringBuilder(); - b.append('@'); - b.append(formatType(annotation.getTpe())); - - if (annotation.getParametersCount() == 1) { - b.append('('); - - Tree parameter = annotation.getParameters(0); - // if only 1 parameter, and its LHS is named 'value', we can omit the 'value = ' - // https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.7.3 - AssignTree firstParam = parameter.getAssignTree(); - if (parameter.hasAssignTree() - && SymbolDescriptor.parseFromSymbol(firstParam.getLhs().getIdTree().getSymbol()) - .descriptor - .name - .equals("value")) { - b.append(formatTree(firstParam.getRhs())); - } else { - b.append(formatTree(parameter)); - } - - b.append(')'); - } else if (annotation.getParametersCount() > 1) { - b.append('('); - String parameter = - annotation.getParametersList().stream() - .map(this::formatTree) - .collect(Collectors.joining(", ")); - b.append(parameter); - b.append(')'); - } - - return b.toString(); - } - - private String formatTree(Tree tree) { - if (tree.hasIdTree()) { - return SymbolDescriptor.parseFromSymbol(tree.getIdTree().getSymbol()).descriptor.name; - } else if (tree.hasLiteralTree()) { - return formatConstant(tree.getLiteralTree().getConstant()); - } else if (tree.hasSelectTree()) { - return formatTree(tree.getSelectTree().getQualifier()) - + "." - + SymbolDescriptor.parseFromSymbol(tree.getSelectTree().getId().getSymbol()) - .descriptor - .name; - } else if (tree.hasAnnotationTree()) { - return formatAnnotation(tree.getAnnotationTree()); - } else if (tree.hasApplyTree()) { - if (tree.getApplyTree().getFunction().hasIdTree() - && tree.getApplyTree().getFunction().getIdTree().getSymbol().equals(ARRAY_SYMBOL)) { - return tree.getApplyTree().getArgumentsList().stream() - .map(this::formatTree) - .collect(Collectors.joining(", ", "{", "}")); - } else { - throw new IllegalArgumentException( - "unexpected apply tree function " + tree.getApplyTree().getFunction()); - } - } else if (tree.hasBinopTree()) { - return formatTree(tree.getBinopTree().getLhs()) - + " " - + formatBinaryOperator(tree.getBinopTree().getOp()) - + " " - + formatTree(tree.getBinopTree().getRhs()); - } else if (tree.hasAssignTree()) { - return formatTree(tree.getAssignTree().getLhs()) - + " = " - + formatTree(tree.getAssignTree().getRhs()); - } else if (tree.hasUnaryopTree()) { - return formatUnaryOperation(tree.getUnaryopTree()); - } else if (tree.hasCastTree()) { - return "(" - + formatType(tree.getCastTree().getTpe()) - + ")" - + " " - + formatTree(tree.getCastTree().getValue()); - } - - throw new IllegalArgumentException("tree was of unexpected type " + tree); - } - - private String formatUnaryOperation(UnaryOperatorTree tree) { - String formattedValue = formatTree(tree.getTree()); - switch (tree.getOp()) { - case UNARY_MINUS: - return "-" + formattedValue; - case UNARY_PLUS: - return "-" + formattedValue; - case UNARY_POSTFIX_INCREMENT: - return formattedValue + "++"; - case UNARY_POSTFIX_DECREMENT: - return formattedValue + "--"; - case UNARY_PREFIX_DECREMENT: - return "--" + formattedValue; - case UNARY_PREFIX_INCREMENT: - return "++" + formattedValue; - - case UNARY_BITWISE_COMPLEMENT: - return "~" + formattedValue; - case UNARY_LOGICAL_COMPLEMENT: - return "!" + formattedValue; - } - - throw new IllegalArgumentException( - "unary operation of unexpected type" + tree.getOp().toString()); - } - - private String formatConstant(Constant constant) { - if (constant.hasUnitConstant()) { - return isScala ? "()" : "scala.Unit()"; - } else if (constant.hasBooleanConstant()) { - return Boolean.toString(constant.getBooleanConstant().getValue()); - } else if (constant.hasByteConstant()) { - return Integer.toString(constant.getByteConstant().getValue()); - } else if (constant.hasShortConstant()) { - return Integer.toString(constant.getShortConstant().getValue()); - } else if (constant.hasCharConstant()) { - return String.format("'%s'", (char) constant.getCharConstant().getValue()); - } else if (constant.hasIntConstant()) { - return Integer.toString(constant.getIntConstant().getValue()); - } else if (constant.hasLongConstant()) { - return Long.toString(constant.getLongConstant().getValue()); - } else if (constant.hasFloatConstant()) { - return Float.toString(constant.getFloatConstant().getValue()) + 'f'; - } else if (constant.hasDoubleConstant()) { - return Double.toString(constant.getDoubleConstant().getValue()); - } else if (constant.hasStringConstant()) { - return '"' + constant.getStringConstant().getValue() + '"'; - } else if (constant.hasNullConstant()) { - return "null"; - } - throw new IllegalArgumentException("constant was not of known type " + constant); - } - - private String formatBinaryOperator(BinaryOperator op) { - switch (op) { - case PLUS: - return "+"; - case MINUS: - return "-"; - case MULTIPLY: - return "*"; - case DIVIDE: - return "/"; - case REMAINDER: - return "%"; - case GREATER_THAN: - return ">"; - case LESS_THAN: - return "<"; - case AND: - return "&"; - case XOR: - return "^"; - case OR: - return "|"; - case CONDITIONAL_AND: - return "&&"; - case CONDITIONAL_OR: - return "||"; - case SHIFT_LEFT: - return "<<"; - case SHIFT_RIGHT: - return ">>"; - case SHIFT_RIGHT_UNSIGNED: - return ">>>"; - case EQUAL_TO: - return "=="; - case NOT_EQUAL_TO: - return "!="; - case GREATER_THAN_EQUAL: - return ">="; - case LESS_THAN_EQUAL: - return "<="; - case UNRECOGNIZED: - throw new IllegalArgumentException("unexpected binary operator " + op); - } - return null; - } - - private String formatType(Type type) { - StringBuilder b = new StringBuilder(); - if (type.hasTypeRef()) { - TypeRef typeRef = type.getTypeRef(); - if (typeRef.getSymbol().equals(ARRAY_SYMBOL)) { - if (isScala) { - b.append("Array["); - b.append(formatType(typeRef.getTypeArguments(0))); - b.append("]"); - } else { - b.append(formatType(typeRef.getTypeArguments(0))); - b.append("[]"); - } - } else if (isScala - && typeRef.getSymbol().startsWith(FUNCTION_SYMBOL_PREFIX) - && typeRef.getTypeArgumentsCount() > 0 - && !typeRef.getSymbol().startsWith(FUNCTION_OBJECT)) { - int n = typeRef.getTypeArgumentsCount() - 1; - if (n == 0) { - // Special-case for Function1[A, B]: don't wrap `A` in parenthesis like this `(A) => B` - s.append(formatType(typeRef.getTypeArguments(0))); - } else { - b.append( - typeRef.getTypeArgumentsList().stream() - .limit(Math.max(0, n)) - .map(this::formatType) - .collect(Collectors.joining(", ", "(", ")"))); - } - b.append(" => "); - b.append(formatType(typeRef.getTypeArguments(n))); - } else if (isScala && typeRef.getSymbol().startsWith(TUPLE_SYMBOL_PREFIX)) { - b.append( - typeRef.getTypeArgumentsList().stream() - .map(this::formatType) - .collect(Collectors.joining(", ", "(", ")"))); - } else { - b.append(symbolDisplayName(typeRef.getSymbol())); - b.append(formatTypeArguments(typeRef.getTypeArgumentsList())); - } - } else if (type.hasSingleType()) { - SingleType tpe = type.getSingleType(); - if (tpe.hasPrefix()) { - b.append(formatType(tpe.getPrefix())); - } - SymbolInformation info = symtab.symbols.get(tpe.getSymbol()); - if (info != null) { - b.append(info.getDisplayName()).append(".type"); - } - } else if (type.hasThisType()) { - b.append("this.type"); - } else if (type.hasSuperType()) { - SuperType tpe = type.getSuperType(); - if (tpe.hasPrefix()) { - b.append(formatType(tpe.getPrefix())).append("."); - } - b.append("super"); - } else if (type.hasConstantType()) { - b.append(this.formatConstant(type.getConstantType().getConstant())); - } else if (type.hasIntersectionType()) { - b.append( - type.getIntersectionType().getTypesList().stream() - .map(this::formatType) - .collect(Collectors.joining(isScala ? " with " : " & "))); - } else if (type.hasUnionType()) { - b.append( - type.getIntersectionType().getTypesList().stream() - .map(this::formatType) - .collect(Collectors.joining(" | "))); - } else if (type.hasStructuralType()) { - StructuralType tpe = type.getStructuralType(); - int n = tpe.getDeclarations().getHardlinksCount(); - if (n == 0) { - b.append(" {}"); - } else { - b.append(formatType(tpe.getTpe())).append(" {"); - Symtab hardlinkSymtab = symtab.withHardlinks(tpe.getDeclarations()); - for (int i = 0; i < n; i++) { - SymbolInformation info = tpe.getDeclarations().getHardlinks(i); - if (i > 0) { - b.append(";"); - } - b.append(" ").append(new SignatureFormatter(info, hardlinkSymtab).formatSymbol()); - } - b.append(" }"); - } - } else if (type.hasExistentialType()) { - AtomicInteger hardlinkStep = new AtomicInteger(); - TypeRef typeRef = type.getExistentialType().getTpe().getTypeRef(); - b.append(symbolDisplayName(type.getExistentialType().getTpe().getTypeRef().getSymbol())); - b.append( - typeRef.getTypeArgumentsList().stream() - .map( - (typeArg) -> { - // if hardlink (aka wildcard) we need to reach into declarations at index - // hardlinkStep - if (typeArg.equals(WILDCARD_TYPE_REF)) { - SymbolInformation hardlink = - type.getExistentialType() - .getDeclarations() - .getHardlinks(hardlinkStep.getAndIncrement()); - return symbolDisplayName(hardlink.getSymbol()) - + new SignatureFormatter(hardlink, symtab).formatSymbol(); - } - // else for symlink we can use the usual path - return formatType(typeArg); - }) - .collect(Collectors.joining(", ", isScala ? "[" : "<", isScala ? "[" : ">"))); - } else if (type.hasByNameType()) { - b.append("=> ").append(formatType(type.getByNameType().getTpe())); - } else if (type.hasRepeatedType()) { - b.append(formatType(type.getRepeatedType().getTpe())).append("*"); - } - - return b.toString().trim(); - } - - private String formatAccess() { - Access access = symbolInformation.getAccess(); - if (access.hasPrivateAccess()) { - return "private"; - } else if (!isScala && access.hasPublicAccess()) { - return "public"; - } else if (access.hasProtectedAccess()) { - return "protected"; - } else if (isScala && access.hasPrivateThisAccess()) { - return "private[this]"; - } else if (isScala && access.hasPrivateWithinAccess()) { - String name = - SymbolDescriptor.parseFromSymbol(access.getPrivateWithinAccess().getSymbol()) - .descriptor - .name; - return String.format("protected[%s]", name); - } - return ""; - } - - // https://checkstyle.sourceforge.io/config_modifier.html#ModifierOrder - private String formatModifiers() { - ArrayList modifiers = new ArrayList<>(); - if (has(Property.ABSTRACT)) { - if (isScala && symbolInformation.getKind() != SymbolInformation.Kind.CLASS) { - } else { - modifiers.add("abstract"); - } - } - if (has(Property.DEFAULT)) modifiers.add("default"); - if (has(Property.STATIC)) modifiers.add("static"); - if (has(Property.FINAL)) { - if (symbolInformation.getKind() != SymbolInformation.Kind.OBJECT - && symbolInformation.getKind() != SymbolInformation.Kind.PACKAGE_OBJECT) { - modifiers.add("final"); - } - } - if (has(Property.IMPLICIT)) modifiers.add("implicit"); - if (has(Property.SEALED)) modifiers.add("sealed"); - if (has(Property.CASE)) modifiers.add("case"); - return String.join(" ", modifiers); - } - - private void printKeyword(String keyword) { - if (keyword.isEmpty()) return; - s.append(keyword).append(' '); - } - - private void printKeywordln(String keyword) { - if (keyword.isEmpty()) return; - s.append(keyword).append('\n'); - } - - private boolean isEnumConstant(SymbolInformation symInfo) { - if (!(has(Property.ENUM, symInfo) - && has(Property.FINAL, symInfo) - && has(Property.STATIC, symInfo) - && symInfo.getAccess().hasPublicAccess())) { - return false; - } - SymbolInformation owner = - symtab.symbols.get(SymbolDescriptor.parseFromSymbol(symInfo.getSymbol()).owner); - if (owner == null) return false; - return owner.getKind() == SymbolInformation.Kind.CLASS && has(Property.ENUM, owner); - } - - private boolean isEnumConstant() { - return isEnumConstant(symbolInformation); - } - - private boolean has(Property property, SymbolInformation symInfo) { - return (symInfo.getProperties() & property.getNumber()) > 0; - } - - private boolean has(Property property) { - return has(property, symbolInformation); - } - - /** - * Transforms a SemanticDB symbol string into its Java identifier display string. As SemanticDB - * uses Scala "primitive" types for Java primitives (but not for Java boxing primitive wrappers), - * we check for those first before attempting to decode a SemanticDB symbol. - */ - public String symbolDisplayName(String symbol) { - if (isScala) { - return symbolScalaDisplayName(symbol); - } - return symbolJavaDisplayName(symbol); - } - - private String symbolScalaDisplayName(String symbol) { - if ("local_wildcard".equals(symbol)) { - return "*"; - } - return SymbolDescriptor.parseFromSymbol(symbol).descriptor.name; - } - - private String symbolJavaDisplayName(String symbol) { - switch (symbol) { - case "local_wildcard": - return "?"; - case "scala/Boolean#": - return "boolean"; - case "scala/Byte#": - return "byte"; - case "scala/Short#": - return "short"; - case "scala/Int#": - return "int"; - case "scala/Long#": - return "long"; - case "scala/Char#": - return "char"; - case "scala/Float#": - return "float"; - case "scala/Double#": - return "double"; - case "scala/Unit#": - return "void"; - default: - return SymbolDescriptor.parseFromSymbol(symbol).descriptor.name; - } - } -} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SignatureFormatterException.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SignatureFormatterException.java deleted file mode 100644 index 5c094aebc..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SignatureFormatterException.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import com.sourcegraph.semanticdb_javac.Semanticdb; - -public class SignatureFormatterException extends RuntimeException { - public SignatureFormatterException( - Semanticdb.SymbolInformation symbolInformation, Throwable cause) { - super( - String.format( - "failed to format symbol '%s'\n%s", symbolInformation.getSymbol(), symbolInformation), - cause); - } - - @Override - public synchronized Throwable fillInStackTrace() { - // This exception doesn't have a relevant stack trace. The cause exception - // already points to the culprit filename and line number. - return this; - } -} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SymbolOccurrences.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SymbolOccurrences.java deleted file mode 100644 index b4d309491..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SymbolOccurrences.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import com.sourcegraph.semanticdb_javac.Semanticdb; - -import java.util.ArrayList; -import java.util.List; - -public class SymbolOccurrences { - public List occurrences = new ArrayList<>(); - - public void addSyntheticDefinition(String sym) { - occurrences.add( - Semanticdb.SymbolOccurrence.newBuilder() - .setSymbol(sym) - .setRole(Semanticdb.SymbolOccurrence.Role.SYNTHETIC_DEFINITION) - .build()); - } - - public void addDefinition(String sym) { - occurrences.add( - Semanticdb.SymbolOccurrence.newBuilder() - .setSymbol(sym) - .setRole(Semanticdb.SymbolOccurrence.Role.DEFINITION) - .build()); - } -} diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/Symtab.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/Symtab.java deleted file mode 100644 index 5324df0e5..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/Symtab.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import com.sourcegraph.semanticdb_javac.Semanticdb; - -import java.util.HashMap; - -public class Symtab { - public final HashMap symbols = new HashMap<>(); - - public Symtab(Semanticdb.TextDocument document) { - for (Semanticdb.SymbolInformation symbolInformation : document.getSymbolsList()) { - symbols.put(symbolInformation.getSymbol(), symbolInformation); - } - } - - public Symtab withHardlinks(Semanticdb.Scope scope) { - Symtab hardlinkSymtab = new Symtab(Semanticdb.TextDocument.getDefaultInstance()); - hardlinkSymtab.symbols.putAll(this.symbols); - for (int i = 0; i < scope.getHardlinksCount(); i++) { - Semanticdb.SymbolInformation info = scope.getHardlinks(i); - hardlinkSymtab.symbols.put(info.getSymbol(), info); - } - return hardlinkSymtab; - } -} diff --git a/tests/snapshots/src/main/scala/tests/MinimizedSnapshotScipGenerator.scala b/tests/snapshots/src/main/scala/tests/MinimizedSnapshotScipGenerator.scala index fd90fbf36..86f69a2a5 100644 --- a/tests/snapshots/src/main/scala/tests/MinimizedSnapshotScipGenerator.scala +++ b/tests/snapshots/src/main/scala/tests/MinimizedSnapshotScipGenerator.scala @@ -44,7 +44,6 @@ class MinimizedSnapshotScipGenerator { sourceroot.toString(), "--output", scipOutput.toString, - "--use-scip-shards", "--targetroot", targetroot.toString() ) From 5b9897e131948d3253c101507d2ad399499603f4 Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 13:02:54 +0200 Subject: [PATCH 18/21] PR3 (D5): drop SemanticDB protobuf generation and dead builders - Remove generated SemanticDB protobuf module: - semanticdb-java/src/main/protobuf/semanticdb.proto - semanticdb-java/src/main/protobuf/BUILD - semanticdb-kotlinc/src/main/proto/.../semanticdb.proto - Delete unused SemanticDB builder helpers: - semanticdb-java/.../SemanticdbBuilders.java - semanticdb-kotlinc/.../SemanticdbBuilders.kt - Keep a minimal semanticdb-java module that only ships SemanticdbSymbols.java (a pure-Java symbol helper still consumed by semanticdb-javac and scip-semanticdb), without protobuf generation. - Update sbt and Bazel build files accordingly. --- build.sbt | 4 +- scip-semanticdb/BUILD | 1 - semanticdb-java/BUILD | 16 +- .../semanticdb_javac/SemanticdbBuilders.java | 242 --------- semanticdb-java/src/main/protobuf/BUILD | 16 - .../src/main/protobuf/semanticdb.proto | 468 ------------------ semanticdb-javac/BUILD | 1 - .../semanticdb_kotlinc/SemanticdbBuilders.kt | 407 --------------- .../semanticdb.proto | 192 ------- 9 files changed, 2 insertions(+), 1345 deletions(-) delete mode 100644 semanticdb-java/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbBuilders.java delete mode 100644 semanticdb-java/src/main/protobuf/BUILD delete mode 100644 semanticdb-java/src/main/protobuf/semanticdb.proto delete mode 100644 semanticdb-kotlinc/src/main/java/com/sourcegraph/semanticdb_kotlinc/SemanticdbBuilders.kt delete mode 100644 semanticdb-kotlinc/src/main/proto/com.sourcegraph.semanticdb_kotlin/semanticdb.proto diff --git a/build.sbt b/build.sbt index d7930220a..c560f042c 100644 --- a/build.sbt +++ b/build.sbt @@ -75,9 +75,7 @@ lazy val semanticdb = project .in(file("semanticdb-java")) .settings( moduleName := "semanticdb-java", - javaOnlySettings, - (Compile / PB.targets) := - Seq(PB.gens.java(V.protobuf) -> (Compile / sourceManaged).value) + javaOnlySettings ) lazy val agent = project diff --git a/scip-semanticdb/BUILD b/scip-semanticdb/BUILD index 6c2b8b5a0..37565d9f0 100644 --- a/scip-semanticdb/BUILD +++ b/scip-semanticdb/BUILD @@ -20,7 +20,6 @@ java_library( ":all_java_proto", "//scip-java-proto/src/main/protobuf:scip_java_proto", "//semanticdb-java", - "//semanticdb-java/src/main/protobuf:semanticdb_java_proto", "@maven//:com_google_code_findbugs_jsr305", "@maven//:com_google_protobuf_protobuf_java", "@maven//:com_google_protobuf_protobuf_java_util", diff --git a/semanticdb-java/BUILD b/semanticdb-java/BUILD index 96f8844fb..d6955e206 100644 --- a/semanticdb-java/BUILD +++ b/semanticdb-java/BUILD @@ -1,24 +1,10 @@ -load("@rules_java//java:defs.bzl", "java_library", "java_proto_library") -load("@rules_proto//proto:defs.bzl", "proto_library") +load("@rules_java//java:defs.bzl", "java_library") package( default_visibility = ["//visibility:public"], ) -java_proto_library( - name = "semanticdb_java_proto", - deps = [":semanticdb_proto"], -) - -proto_library( - name = "semanticdb_proto", - srcs = glob(["src/main/protobuf/*.proto"]), -) - java_library( name = "semanticdb-java", srcs = glob(["src/main/java/**/*.java"]), - deps = [ - "//semanticdb-java/src/main/protobuf:semanticdb_java_proto", - ], ) diff --git a/semanticdb-java/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbBuilders.java b/semanticdb-java/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbBuilders.java deleted file mode 100644 index f91e7a9ed..000000000 --- a/semanticdb-java/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbBuilders.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.sourcegraph.semanticdb_javac; - -import java.util.List; - -public class SemanticdbBuilders { - // SemanticDB Types - public static Semanticdb.Type typeRef(String symbol) { - return Semanticdb.Type.newBuilder() - .setTypeRef(Semanticdb.TypeRef.newBuilder().setSymbol(symbol)) - .build(); - } - - public static Semanticdb.Type typeRef(String symbol, List typeArguments) { - return Semanticdb.Type.newBuilder() - .setTypeRef( - Semanticdb.TypeRef.newBuilder().setSymbol(symbol).addAllTypeArguments(typeArguments)) - .build(); - } - - public static Semanticdb.Type existentialType( - Semanticdb.Type type, Semanticdb.Scope declarations) { - return Semanticdb.Type.newBuilder() - .setExistentialType( - Semanticdb.ExistentialType.newBuilder().setTpe(type).setDeclarations(declarations)) - .build(); - } - - public static Semanticdb.Type intersectionType(List types) { - return Semanticdb.Type.newBuilder() - .setIntersectionType(Semanticdb.IntersectionType.newBuilder().addAllTypes(types)) - .build(); - } - - // SemanticDB Signatures - - public static Semanticdb.Signature signature(Semanticdb.ClassSignature.Builder signature) { - return Semanticdb.Signature.newBuilder().setClassSignature(signature).build(); - } - - public static Semanticdb.Signature signature(Semanticdb.MethodSignature.Builder signature) { - return Semanticdb.Signature.newBuilder().setMethodSignature(signature).build(); - } - - public static Semanticdb.Signature signature(Semanticdb.ValueSignature.Builder signature) { - return Semanticdb.Signature.newBuilder().setValueSignature(signature).build(); - } - - public static Semanticdb.Signature signature(Semanticdb.TypeSignature.Builder signature) { - return Semanticdb.Signature.newBuilder().setTypeSignature(signature).build(); - } - - // SemanticDB Symbols - - public static Semanticdb.SymbolOccurrence symbolOccurrence( - String symbol, - Semanticdb.Range range, - Semanticdb.SymbolOccurrence.Role role, - java.util.Optional enclosingRange) { - Semanticdb.SymbolOccurrence.Builder builder = - Semanticdb.SymbolOccurrence.newBuilder().setSymbol(symbol).setRange(range).setRole(role); - enclosingRange.ifPresent(builder::setEnclosingRange); - return builder.build(); - } - - public static Semanticdb.SymbolInformation.Builder symbolInformation(String symbol) { - return Semanticdb.SymbolInformation.newBuilder().setSymbol(symbol); - } - - // SemanticDB Access - - public static Semanticdb.Access privateAccess() { - return Semanticdb.Access.newBuilder() - .setPrivateAccess(Semanticdb.PrivateAccess.newBuilder()) - .build(); - } - - public static Semanticdb.Access publicAccess() { - return Semanticdb.Access.newBuilder() - .setPublicAccess(Semanticdb.PublicAccess.newBuilder()) - .build(); - } - - public static Semanticdb.Access protectedAccess() { - return Semanticdb.Access.newBuilder() - .setProtectedAccess(Semanticdb.ProtectedAccess.newBuilder()) - .build(); - } - - public static Semanticdb.Access privateWithinAccess(String symbol) { - return Semanticdb.Access.newBuilder() - .setPrivateWithinAccess(Semanticdb.PrivateWithinAccess.newBuilder().setSymbol(symbol)) - .build(); - } - - // SemanticDB Trees - - public static Semanticdb.Tree tree(Semanticdb.IdTree idTree) { - return Semanticdb.Tree.newBuilder().setIdTree(idTree).build(); - } - - public static Semanticdb.IdTree idTree(String symbol) { - return Semanticdb.IdTree.newBuilder().setSymbol(symbol).build(); - } - - public static Semanticdb.Tree tree(Semanticdb.ApplyTree applyTree) { - return Semanticdb.Tree.newBuilder().setApplyTree(applyTree).build(); - } - - public static Semanticdb.ApplyTree applyTree( - Semanticdb.Tree function, Iterable arguments) { - return Semanticdb.ApplyTree.newBuilder() - .setFunction(function) - .addAllArguments(arguments) - .build(); - } - - public static Semanticdb.Tree tree(Semanticdb.SelectTree selectTree) { - return Semanticdb.Tree.newBuilder().setSelectTree(selectTree).build(); - } - - public static Semanticdb.SelectTree selectTree( - Semanticdb.Tree qualifier, Semanticdb.IdTree idTree) { - return Semanticdb.SelectTree.newBuilder().setQualifier(qualifier).setId(idTree).build(); - } - - public static Semanticdb.Tree tree(Semanticdb.LiteralTree literalTree) { - return Semanticdb.Tree.newBuilder().setLiteralTree(literalTree).build(); - } - - public static Semanticdb.LiteralTree literalTree(Semanticdb.Constant constant) { - return Semanticdb.LiteralTree.newBuilder().setConstant(constant).build(); - } - - public static Semanticdb.Tree tree(Semanticdb.AnnotationTree annotationTree) { - return Semanticdb.Tree.newBuilder().setAnnotationTree(annotationTree).build(); - } - - public static Semanticdb.Tree tree(Semanticdb.BinaryOperatorTree binaryOperatorTree) { - return Semanticdb.Tree.newBuilder().setBinopTree(binaryOperatorTree).build(); - } - - public static Semanticdb.BinaryOperatorTree binopTree( - Semanticdb.Tree lhs, Semanticdb.BinaryOperator operator, Semanticdb.Tree rhs) { - return Semanticdb.BinaryOperatorTree.newBuilder() - .setLhs(lhs) - .setOp(operator) - .setRhs(rhs) - .build(); - } - - public static Semanticdb.Tree tree(Semanticdb.UnaryOperatorTree unaryOperatorTree) { - return Semanticdb.Tree.newBuilder().setUnaryopTree(unaryOperatorTree).build(); - } - - public static Semanticdb.Tree tree(Semanticdb.CastTree castTree) { - return Semanticdb.Tree.newBuilder().setCastTree(castTree).build(); - } - - public static Semanticdb.UnaryOperatorTree unaryOpTree( - Semanticdb.UnaryOperator operator, Semanticdb.Tree rhs) { - return Semanticdb.UnaryOperatorTree.newBuilder().setOp(operator).setTree(rhs).build(); - } - - public static Semanticdb.Tree tree(Semanticdb.AssignTree assignTree) { - return Semanticdb.Tree.newBuilder().setAssignTree(assignTree).build(); - } - - public static Semanticdb.AssignTree assignTree(Semanticdb.Tree lhs, Semanticdb.Tree rhs) { - return Semanticdb.AssignTree.newBuilder().setLhs(lhs).setRhs(rhs).build(); - } - - public static Semanticdb.CastTree castTree(Semanticdb.Type type, Semanticdb.Tree value) { - return Semanticdb.CastTree.newBuilder().setTpe(type).setValue(value).build(); - } - - public static Semanticdb.AnnotationTree annotationTree( - Semanticdb.Type type, Iterable parameters) { - return Semanticdb.AnnotationTree.newBuilder().setTpe(type).addAllParameters(parameters).build(); - } - - // SemanticDB Constants - - public static Semanticdb.Constant stringConst(String value) { - return Semanticdb.Constant.newBuilder() - .setStringConstant(Semanticdb.StringConstant.newBuilder().setValue(value)) - .build(); - } - - public static Semanticdb.Constant doubleConst(Double value) { - return Semanticdb.Constant.newBuilder() - .setDoubleConstant(Semanticdb.DoubleConstant.newBuilder().setValue(value)) - .build(); - } - - public static Semanticdb.Constant nullConst() { - return Semanticdb.Constant.newBuilder() - .setNullConstant(Semanticdb.NullConstant.newBuilder()) - .build(); - } - - public static Semanticdb.Constant floatConst(Float value) { - return Semanticdb.Constant.newBuilder() - .setFloatConstant(Semanticdb.FloatConstant.newBuilder().setValue(value)) - .build(); - } - - public static Semanticdb.Constant longConst(Long value) { - return Semanticdb.Constant.newBuilder() - .setLongConstant(Semanticdb.LongConstant.newBuilder().setValue(value)) - .build(); - } - - public static Semanticdb.Constant intConst(Integer value) { - return Semanticdb.Constant.newBuilder() - .setIntConstant(Semanticdb.IntConstant.newBuilder().setValue(value)) - .build(); - } - - public static Semanticdb.Constant charConst(Character value) { - return Semanticdb.Constant.newBuilder() - .setCharConstant(Semanticdb.CharConstant.newBuilder().setValue(value)) - .build(); - } - - public static Semanticdb.Constant shortConst(Short value) { - return Semanticdb.Constant.newBuilder() - .setShortConstant(Semanticdb.ShortConstant.newBuilder().setValue(value)) - .build(); - } - - public static Semanticdb.Constant byteConst(Byte value) { - return Semanticdb.Constant.newBuilder() - .setByteConstant(Semanticdb.ByteConstant.newBuilder().setValue(value)) - .build(); - } - - public static Semanticdb.Constant booleanConst(Boolean value) { - return Semanticdb.Constant.newBuilder() - .setBooleanConstant(Semanticdb.BooleanConstant.newBuilder().setValue(value)) - .build(); - } -} diff --git a/semanticdb-java/src/main/protobuf/BUILD b/semanticdb-java/src/main/protobuf/BUILD deleted file mode 100644 index 88669718b..000000000 --- a/semanticdb-java/src/main/protobuf/BUILD +++ /dev/null @@ -1,16 +0,0 @@ -load("@rules_java//java:defs.bzl", "java_proto_library") -load("@rules_proto//proto:defs.bzl", "proto_library") - -package( - default_visibility = ["//visibility:public"], -) - -java_proto_library( - name = "semanticdb_java_proto", - deps = [":semanticdb_proto"], -) - -proto_library( - name = "semanticdb_proto", - srcs = ["semanticdb.proto"] -) diff --git a/semanticdb-java/src/main/protobuf/semanticdb.proto b/semanticdb-java/src/main/protobuf/semanticdb.proto deleted file mode 100644 index a671f4689..000000000 --- a/semanticdb-java/src/main/protobuf/semanticdb.proto +++ /dev/null @@ -1,468 +0,0 @@ -// Original source: https://github.com/scalameta/scalameta/blob/cf796cf2436b40494baf2bdc266623dc65264ad5/semanticdb/semanticdb/semanticdb.proto -// Local modifications: -// - Removes unused fields to minimize the amount of generated code. -// - Adds SymbolInformation.documentation that is pending upstream approval. - -syntax = "proto3"; - -package com.sourcegraph.semanticdb_javac; - -enum Schema { - LEGACY = 0; - SEMANTICDB3 = 3; - SEMANTICDB4 = 4; -} - -message TextDocuments { - repeated TextDocument documents = 1; -} - -message TextDocument { - reserved 4, 8, 9; - Schema schema = 1; - string uri = 2; - string text = 3; - string md5 = 11; - Language language = 10; - repeated SymbolInformation symbols = 5; - repeated SymbolOccurrence occurrences = 6; - repeated Synthetic synthetics = 12; -} - -enum Language { - UNKNOWN_LANGUAGE = 0; - SCALA = 1; - JAVA = 2; - KOTLIN = 3; -} - -message Range { - int32 start_line = 1; - int32 start_character = 2; - int32 end_line = 3; - int32 end_character = 4; -} - -message Signature { - oneof sealed_value { - ClassSignature class_signature = 1; - MethodSignature method_signature = 2; - TypeSignature type_signature = 3; - ValueSignature value_signature = 4; - } -} - -message ClassSignature { - Scope type_parameters = 1; - repeated Type parents = 2; - Scope declarations = 4; -} - -message MethodSignature { - Scope type_parameters = 1; - repeated Scope parameter_lists = 2; - Type return_type = 3; - repeated Type throws = 4; -} - -message TypeSignature { - Scope type_parameters = 1; - Type lower_bound = 2; - Type upper_bound = 3; -} - -message ValueSignature { - Type tpe = 1; -} - -message SymbolInformation { - enum Kind { - reserved 1, 2, 4, 5, 15, 16; - UNKNOWN_KIND = 0; - LOCAL = 19; - FIELD = 20; - METHOD = 3; - CONSTRUCTOR = 21; - MACRO = 6; - TYPE = 7; - PARAMETER = 8; - SELF_PARAMETER = 17; - TYPE_PARAMETER = 9; - OBJECT = 10; - PACKAGE = 11; - PACKAGE_OBJECT = 12; - CLASS = 13; - TRAIT = 14; - INTERFACE = 18; - } - enum Property { - UNKNOWN_PROPERTY = 0; - reserved 0x1; - reserved 0x2; - ABSTRACT = 0x4; - FINAL = 0x8; - SEALED = 0x10; - IMPLICIT = 0x20; - LAZY = 0x40; - CASE = 0x80; - COVARIANT = 0x100; - CONTRAVARIANT = 0x200; - VAL = 0x400; - VAR = 0x800; - STATIC = 0x1000; - PRIMARY = 0x2000; - ENUM = 0x4000; - DEFAULT = 0x8000; - } - reserved 2, 6, 7, 8, 9, 10, 11, 12, 14; - string symbol = 1; - Language language = 16; - Kind kind = 3; - int32 properties = 4; - string display_name = 5; - // -- OUT OF SPEC -- // - repeated AnnotationTree annotations = 13; - // -- OUT OF SPEC -- // - Signature signature = 17; - Access access = 18; - repeated string overridden_symbols = 19; - Documentation documentation = 20; - string enclosing_symbol = 15; - - // -- OUT OF SPEC -- // - repeated string definition_relationships = 21; - // -- OUT OF SPEC -- // -} - -message Access { - oneof sealed_value { - PrivateAccess private_access = 1; - PrivateThisAccess private_this_access = 2; - PrivateWithinAccess private_within_access = 3; - ProtectedAccess protected_access = 4; - PublicAccess public_access = 7; - } -} - -message PrivateAccess {} - -message PrivateWithinAccess { - string symbol = 1; -} - -message PrivateThisAccess { -} - -message ProtectedAccess {} - -message PublicAccess {} - -message Documentation { - enum Format { - HTML = 0; - MARKDOWN = 1; - JAVADOC = 2; - SCALADOC = 3; - KDOC = 4; - } - string message = 1; - Format format = 2; -} - -message SymbolOccurrence { - enum Role { - UNKNOWN_ROLE = 0; - REFERENCE = 1; - DEFINITION = 2; - // NOTE: this role does not exist in the upstream SemanticDB spec. - // WE added SYNTHETIC_DEFINITION fix the following scip-java issue: - // https://github.com/sourcegraph/scip-java/issues/399 - SYNTHETIC_DEFINITION = 3; - } - Range range = 1; - string symbol = 2; - Role role = 3; - // NOTE: this field does not exist in the upstream SemanticDB spec. - // It is added to support SCIP's enclosing_range field. - // This is the range of the nearest non-trivial enclosing AST node. - optional Range enclosing_range = 4; -} - -message Scope { - repeated string symlinks = 1; - repeated SymbolInformation hardlinks = 2; -} - -message Type { - reserved 1, 3, 4, 5, 6, 11, 12, 15, 16; - oneof sealed_value { - TypeRef type_ref = 2; - SingleType single_type = 20; - ThisType this_type = 21; - SuperType super_type = 22; - ConstantType constant_type = 23; - IntersectionType intersection_type = 17; - UnionType union_type = 18; - WithType with_type = 19; - StructuralType structural_type = 7; - AnnotatedType annotated_type = 8; - ExistentialType existential_type = 9; - UniversalType universal_type = 10; - ByNameType by_name_type = 13; - RepeatedType repeated_type = 14; - } -} - - -message TypeRef { - Type prefix = 1; - string symbol = 2; - repeated Type type_arguments = 3; -} - -message SingleType { - Type prefix = 1; - string symbol = 2; -} - -message ThisType { - string symbol = 1; -} - -message SuperType { - Type prefix = 1; - string symbol = 2; -} - -message ConstantType { - Constant constant = 1; -} - -message IntersectionType { - repeated Type types = 1; -} - -message UnionType { - repeated Type types = 1; -} - -message WithType { - repeated Type types = 1; -} - -message StructuralType { - reserved 1, 2, 3; - Type tpe = 4; - Scope declarations = 5; -} - -message AnnotatedType { - reserved 2; - repeated AnnotationTree annotations = 3; - Type tpe = 1; -} - -message ExistentialType { - reserved 2; - Type tpe = 1; - Scope declarations = 3; -} - -message UniversalType { - reserved 1; - Scope type_parameters = 3; - Type tpe = 2; -} - -message ByNameType { - Type tpe = 1; -} - -message RepeatedType { - Type tpe = 1; -} - -message Synthetic { - Range range = 1; - Tree tree = 2; -} - -message Tree { - oneof sealed_value { - ApplyTree apply_tree = 1; - FunctionTree function_tree = 2; - IdTree id_tree = 3; - LiteralTree literal_tree = 4; - MacroExpansionTree macro_expansion_tree = 5; - OriginalTree original_tree = 6; - SelectTree select_tree = 7; - TypeApplyTree type_apply_tree = 8; - // -- OUT OF SPEC -- // - AnnotationTree annotation_tree = 9; - AssignTree assign_tree = 10; - BinaryOperatorTree binop_tree = 11; - UnaryOperatorTree unaryop_tree = 12; - CastTree cast_tree = 13; - // -- OUT OF SPEC -- // - } -} - -message ApplyTree { - Tree function = 1; - repeated Tree arguments = 2; -} - - -message FunctionTree { - repeated IdTree parameters = 1; - Tree body = 2; -} - -message IdTree { - string symbol = 1; -} - - -message LiteralTree { - Constant constant = 1; -} - -message MacroExpansionTree { - Tree before_expansion = 1; - Type tpe = 2; -} - -message OriginalTree { - Range range = 1; -} - -message SelectTree { - Tree qualifier = 1; - IdTree id = 2; -} - -message TypeApplyTree { - Tree function = 1; - repeated Type type_arguments = 2; -} - -// -- OUT OF SPEC -- // -message AnnotationTree { - Type tpe = 1; - repeated Tree parameters = 2; -} - - -message CastTree { - Type tpe = 1; - Tree value = 2; -} - -message AssignTree { - Tree lhs = 1; - Tree rhs = 2; -} - -message BinaryOperatorTree { - Tree lhs = 1; - BinaryOperator op = 2; - Tree rhs = 3; -} - -enum BinaryOperator { - PLUS = 0; - MINUS = 1; - MULTIPLY = 2; - DIVIDE = 3; - REMAINDER = 4; - GREATER_THAN = 5; - LESS_THAN = 6; - AND = 7; - XOR = 8; - OR = 9; - CONDITIONAL_AND = 10; - CONDITIONAL_OR = 11; - SHIFT_LEFT = 12; - SHIFT_RIGHT = 13; - SHIFT_RIGHT_UNSIGNED = 14; - EQUAL_TO = 15; - NOT_EQUAL_TO = 16; - GREATER_THAN_EQUAL = 17; - LESS_THAN_EQUAL = 18; -} - -// https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.15 -message UnaryOperatorTree { - UnaryOperator op = 1; - Tree tree = 2; -} - -enum UnaryOperator { - UNARY_MINUS = 0; - UNARY_PLUS = 1; - UNARY_POSTFIX_INCREMENT = 2; - UNARY_POSTFIX_DECREMENT = 3; - UNARY_PREFIX_DECREMENT = 4; - UNARY_PREFIX_INCREMENT = 5; - UNARY_BITWISE_COMPLEMENT = 6; - UNARY_LOGICAL_COMPLEMENT = 7; -} -// -- OUT OF SPEC -- // - -message Constant { - oneof sealed_value { - UnitConstant unit_constant = 1; - BooleanConstant boolean_constant = 2; - ByteConstant byte_constant = 3; - ShortConstant short_constant = 4; - CharConstant char_constant = 5; - IntConstant int_constant = 6; - LongConstant long_constant = 7; - FloatConstant float_constant = 8; - DoubleConstant double_constant = 9; - StringConstant string_constant = 10; - NullConstant null_constant = 11; - } -} - -message UnitConstant { -} - -message BooleanConstant { - bool value = 1; -} - -message ByteConstant { - int32 value = 1; -} - -message ShortConstant { - int32 value = 1; -} - -message CharConstant { - int32 value = 1; -} - -message IntConstant { - int32 value = 1; -} - -message LongConstant { - int64 value = 1; -} - -message FloatConstant { - float value = 1; -} - -message DoubleConstant { - double value = 1; -} - -message StringConstant { - string value = 1; -} - -message NullConstant { -} diff --git a/semanticdb-javac/BUILD b/semanticdb-javac/BUILD index 37a6e13f9..e7dad490c 100644 --- a/semanticdb-javac/BUILD +++ b/semanticdb-javac/BUILD @@ -34,7 +34,6 @@ java_library( srcs = glob(["src/main/java/**/*.java"]), resources = ["src/main/resources/META-INF/services/com.sun.source.util.Plugin"], deps = [ - "//semanticdb-java/src/main/protobuf:semanticdb_java_proto", "//semanticdb-java", ":javac-import", ], diff --git a/semanticdb-kotlinc/src/main/java/com/sourcegraph/semanticdb_kotlinc/SemanticdbBuilders.kt b/semanticdb-kotlinc/src/main/java/com/sourcegraph/semanticdb_kotlinc/SemanticdbBuilders.kt deleted file mode 100644 index 652ebe267..000000000 --- a/semanticdb-kotlinc/src/main/java/com/sourcegraph/semanticdb_kotlinc/SemanticdbBuilders.kt +++ /dev/null @@ -1,407 +0,0 @@ -// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -@file:JvmName("-SemanticdbBuilders") - -package com.sourcegraph.semanticdb_kotlinc - -import kotlin.DslMarker -import kotlin.Unit -import kotlin.annotation.AnnotationRetention -import kotlin.annotation.AnnotationTarget -import kotlin.annotation.Retention -import kotlin.annotation.Target -import kotlin.jvm.JvmName - -inline fun Semanticdb.TextDocuments.copy(block: Semanticdb.TextDocuments.Builder.() -> Unit): - Semanticdb.TextDocuments = this.toBuilder().apply(block).build() - -operator fun Semanticdb.TextDocuments.plus(other: Semanticdb.TextDocuments): - Semanticdb.TextDocuments = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.TextDocuments?.orDefault(): Semanticdb.TextDocuments = this ?: - Semanticdb.TextDocuments.getDefaultInstance() - -inline fun Semanticdb.TextDocuments.Builder.addDocuments(block: - Semanticdb.TextDocument.Builder.() -> Unit): Semanticdb.TextDocuments.Builder = - this.addDocuments(Semanticdb.TextDocument.newBuilder().apply(block).build()) - -inline fun Semanticdb.TextDocument.copy(block: Semanticdb.TextDocument.Builder.() -> Unit): - Semanticdb.TextDocument = this.toBuilder().apply(block).build() - -operator fun Semanticdb.TextDocument.plus(other: Semanticdb.TextDocument): Semanticdb.TextDocument = - this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.TextDocument?.orDefault(): Semanticdb.TextDocument = this ?: - Semanticdb.TextDocument.getDefaultInstance() - -inline fun Semanticdb.TextDocument.Builder.addSymbols(block: - Semanticdb.SymbolInformation.Builder.() -> Unit): Semanticdb.TextDocument.Builder = - this.addSymbols(Semanticdb.SymbolInformation.newBuilder().apply(block).build()) - -inline fun Semanticdb.TextDocument.Builder.addOccurrences(block: - Semanticdb.SymbolOccurrence.Builder.() -> Unit): Semanticdb.TextDocument.Builder = - this.addOccurrences(Semanticdb.SymbolOccurrence.newBuilder().apply(block).build()) - -inline fun Semanticdb.Range.copy(block: Semanticdb.Range.Builder.() -> Unit): Semanticdb.Range = - this.toBuilder().apply(block).build() - -operator fun Semanticdb.Range.plus(other: Semanticdb.Range): Semanticdb.Range = - this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.Range?.orDefault(): Semanticdb.Range = this ?: Semanticdb.Range.getDefaultInstance() - -inline fun Semanticdb.Signature.copy(block: Semanticdb.Signature.Builder.() -> Unit): - Semanticdb.Signature = this.toBuilder().apply(block).build() - -operator fun Semanticdb.Signature.plus(other: Semanticdb.Signature): Semanticdb.Signature = - this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.Signature?.orDefault(): Semanticdb.Signature = this ?: - Semanticdb.Signature.getDefaultInstance() - -inline fun Semanticdb.Signature.Builder.classSignature(block: - Semanticdb.ClassSignature.Builder.() -> Unit): Semanticdb.Signature.Builder = - this.setClassSignature(Semanticdb.ClassSignature.newBuilder().apply(block).build()) - -inline fun Semanticdb.Signature.Builder.methodSignature(block: - Semanticdb.MethodSignature.Builder.() -> Unit): Semanticdb.Signature.Builder = - this.setMethodSignature(Semanticdb.MethodSignature.newBuilder().apply(block).build()) - -inline fun Semanticdb.Signature.Builder.typeSignature(block: Semanticdb.TypeSignature.Builder.() -> - Unit): Semanticdb.Signature.Builder = - this.setTypeSignature(Semanticdb.TypeSignature.newBuilder().apply(block).build()) - -inline fun Semanticdb.Signature.Builder.valueSignature(block: - Semanticdb.ValueSignature.Builder.() -> Unit): Semanticdb.Signature.Builder = - this.setValueSignature(Semanticdb.ValueSignature.newBuilder().apply(block).build()) - -inline fun Semanticdb.ClassSignature.copy(block: Semanticdb.ClassSignature.Builder.() -> Unit): - Semanticdb.ClassSignature = this.toBuilder().apply(block).build() - -operator fun Semanticdb.ClassSignature.plus(other: Semanticdb.ClassSignature): - Semanticdb.ClassSignature = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.ClassSignature?.orDefault(): Semanticdb.ClassSignature = this ?: - Semanticdb.ClassSignature.getDefaultInstance() - -inline fun Semanticdb.ClassSignature.Builder.typeParameters(block: Semanticdb.Scope.Builder.() -> - Unit): Semanticdb.ClassSignature.Builder = - this.setTypeParameters(Semanticdb.Scope.newBuilder().apply(block).build()) - -inline fun Semanticdb.ClassSignature.Builder.addParents(block: Semanticdb.Type.Builder.() -> Unit): - Semanticdb.ClassSignature.Builder = - this.addParents(Semanticdb.Type.newBuilder().apply(block).build()) - -inline fun Semanticdb.ClassSignature.Builder.declarations(block: Semanticdb.Scope.Builder.() -> - Unit): Semanticdb.ClassSignature.Builder = - this.setDeclarations(Semanticdb.Scope.newBuilder().apply(block).build()) - -inline fun Semanticdb.MethodSignature.copy(block: Semanticdb.MethodSignature.Builder.() -> Unit): - Semanticdb.MethodSignature = this.toBuilder().apply(block).build() - -operator fun Semanticdb.MethodSignature.plus(other: Semanticdb.MethodSignature): - Semanticdb.MethodSignature = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.MethodSignature?.orDefault(): Semanticdb.MethodSignature = this ?: - Semanticdb.MethodSignature.getDefaultInstance() - -inline fun Semanticdb.MethodSignature.Builder.typeParameters(block: Semanticdb.Scope.Builder.() -> - Unit): Semanticdb.MethodSignature.Builder = - this.setTypeParameters(Semanticdb.Scope.newBuilder().apply(block).build()) - -inline fun Semanticdb.MethodSignature.Builder.addParameterLists(block: - Semanticdb.Scope.Builder.() -> Unit): Semanticdb.MethodSignature.Builder = - this.addParameterLists(Semanticdb.Scope.newBuilder().apply(block).build()) - -inline fun Semanticdb.MethodSignature.Builder.returnType(block: Semanticdb.Type.Builder.() -> Unit): - Semanticdb.MethodSignature.Builder = - this.setReturnType(Semanticdb.Type.newBuilder().apply(block).build()) - -inline fun Semanticdb.TypeSignature.copy(block: Semanticdb.TypeSignature.Builder.() -> Unit): - Semanticdb.TypeSignature = this.toBuilder().apply(block).build() - -operator fun Semanticdb.TypeSignature.plus(other: Semanticdb.TypeSignature): - Semanticdb.TypeSignature = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.TypeSignature?.orDefault(): Semanticdb.TypeSignature = this ?: - Semanticdb.TypeSignature.getDefaultInstance() - -inline fun Semanticdb.TypeSignature.Builder.typeParameters(block: Semanticdb.Scope.Builder.() -> - Unit): Semanticdb.TypeSignature.Builder = - this.setTypeParameters(Semanticdb.Scope.newBuilder().apply(block).build()) - -inline fun Semanticdb.TypeSignature.Builder.lowerBound(block: Semanticdb.Type.Builder.() -> Unit): - Semanticdb.TypeSignature.Builder = - this.setLowerBound(Semanticdb.Type.newBuilder().apply(block).build()) - -inline fun Semanticdb.TypeSignature.Builder.upperBound(block: Semanticdb.Type.Builder.() -> Unit): - Semanticdb.TypeSignature.Builder = - this.setUpperBound(Semanticdb.Type.newBuilder().apply(block).build()) - -inline fun Semanticdb.ValueSignature.copy(block: Semanticdb.ValueSignature.Builder.() -> Unit): - Semanticdb.ValueSignature = this.toBuilder().apply(block).build() - -operator fun Semanticdb.ValueSignature.plus(other: Semanticdb.ValueSignature): - Semanticdb.ValueSignature = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.ValueSignature?.orDefault(): Semanticdb.ValueSignature = this ?: - Semanticdb.ValueSignature.getDefaultInstance() - -inline fun Semanticdb.ValueSignature.Builder.tpe(block: Semanticdb.Type.Builder.() -> Unit): - Semanticdb.ValueSignature.Builder = - this.setTpe(Semanticdb.Type.newBuilder().apply(block).build()) - -inline fun Semanticdb.SymbolInformation.copy(block: Semanticdb.SymbolInformation.Builder.() -> - Unit): Semanticdb.SymbolInformation = this.toBuilder().apply(block).build() - -operator fun Semanticdb.SymbolInformation.plus(other: Semanticdb.SymbolInformation): - Semanticdb.SymbolInformation = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.SymbolInformation?.orDefault(): Semanticdb.SymbolInformation = this ?: - Semanticdb.SymbolInformation.getDefaultInstance() - -inline fun Semanticdb.SymbolInformation.Builder.signature(block: Semanticdb.Signature.Builder.() -> - Unit): Semanticdb.SymbolInformation.Builder = - this.setSignature(Semanticdb.Signature.newBuilder().apply(block).build()) - -inline fun Semanticdb.SymbolInformation.Builder.access(block: Semanticdb.Access.Builder.() -> Unit): - Semanticdb.SymbolInformation.Builder = - this.setAccess(Semanticdb.Access.newBuilder().apply(block).build()) - -inline fun Semanticdb.SymbolInformation.Builder.documentation(block: - Semanticdb.Documentation.Builder.() -> Unit): Semanticdb.SymbolInformation.Builder = - this.setDocumentation(Semanticdb.Documentation.newBuilder().apply(block).build()) - -inline fun Semanticdb.Access.copy(block: Semanticdb.Access.Builder.() -> Unit): Semanticdb.Access = - this.toBuilder().apply(block).build() - -operator fun Semanticdb.Access.plus(other: Semanticdb.Access): Semanticdb.Access = - this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.Access?.orDefault(): Semanticdb.Access = this ?: - Semanticdb.Access.getDefaultInstance() - -inline fun Semanticdb.Access.Builder.privateAccess(block: Semanticdb.PrivateAccess.Builder.() -> - Unit): Semanticdb.Access.Builder = - this.setPrivateAccess(Semanticdb.PrivateAccess.newBuilder().apply(block).build()) - -inline fun Semanticdb.Access.Builder.privateWithinAccess(block: - Semanticdb.PrivateWithinAccess.Builder.() -> Unit): Semanticdb.Access.Builder = - this.setPrivateWithinAccess(Semanticdb.PrivateWithinAccess.newBuilder().apply(block).build()) - -inline fun Semanticdb.Access.Builder.protectedAccess(block: Semanticdb.ProtectedAccess.Builder.() -> - Unit): Semanticdb.Access.Builder = - this.setProtectedAccess(Semanticdb.ProtectedAccess.newBuilder().apply(block).build()) - -inline fun Semanticdb.Access.Builder.publicAccess(block: Semanticdb.PublicAccess.Builder.() -> - Unit): Semanticdb.Access.Builder = - this.setPublicAccess(Semanticdb.PublicAccess.newBuilder().apply(block).build()) - -inline fun Semanticdb.PrivateAccess.copy(block: Semanticdb.PrivateAccess.Builder.() -> Unit): - Semanticdb.PrivateAccess = this.toBuilder().apply(block).build() - -operator fun Semanticdb.PrivateAccess.plus(other: Semanticdb.PrivateAccess): - Semanticdb.PrivateAccess = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.PrivateAccess?.orDefault(): Semanticdb.PrivateAccess = this ?: - Semanticdb.PrivateAccess.getDefaultInstance() - -inline fun Semanticdb.PrivateWithinAccess.copy(block: Semanticdb.PrivateWithinAccess.Builder.() -> - Unit): Semanticdb.PrivateWithinAccess = this.toBuilder().apply(block).build() - -operator fun Semanticdb.PrivateWithinAccess.plus(other: Semanticdb.PrivateWithinAccess): - Semanticdb.PrivateWithinAccess = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.PrivateWithinAccess?.orDefault(): Semanticdb.PrivateWithinAccess = this ?: - Semanticdb.PrivateWithinAccess.getDefaultInstance() - -inline fun Semanticdb.ProtectedAccess.copy(block: Semanticdb.ProtectedAccess.Builder.() -> Unit): - Semanticdb.ProtectedAccess = this.toBuilder().apply(block).build() - -operator fun Semanticdb.ProtectedAccess.plus(other: Semanticdb.ProtectedAccess): - Semanticdb.ProtectedAccess = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.ProtectedAccess?.orDefault(): Semanticdb.ProtectedAccess = this ?: - Semanticdb.ProtectedAccess.getDefaultInstance() - -inline fun Semanticdb.PublicAccess.copy(block: Semanticdb.PublicAccess.Builder.() -> Unit): - Semanticdb.PublicAccess = this.toBuilder().apply(block).build() - -operator fun Semanticdb.PublicAccess.plus(other: Semanticdb.PublicAccess): Semanticdb.PublicAccess = - this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.PublicAccess?.orDefault(): Semanticdb.PublicAccess = this ?: - Semanticdb.PublicAccess.getDefaultInstance() - -inline fun Semanticdb.Documentation.copy(block: Semanticdb.Documentation.Builder.() -> Unit): - Semanticdb.Documentation = this.toBuilder().apply(block).build() - -operator fun Semanticdb.Documentation.plus(other: Semanticdb.Documentation): - Semanticdb.Documentation = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.Documentation?.orDefault(): Semanticdb.Documentation = this ?: - Semanticdb.Documentation.getDefaultInstance() - -inline fun Semanticdb.SymbolOccurrence.copy(block: Semanticdb.SymbolOccurrence.Builder.() -> Unit): - Semanticdb.SymbolOccurrence = this.toBuilder().apply(block).build() - -operator fun Semanticdb.SymbolOccurrence.plus(other: Semanticdb.SymbolOccurrence): - Semanticdb.SymbolOccurrence = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.SymbolOccurrence?.orDefault(): Semanticdb.SymbolOccurrence = this ?: - Semanticdb.SymbolOccurrence.getDefaultInstance() - -inline fun Semanticdb.SymbolOccurrence.Builder.range(block: Semanticdb.Range.Builder.() -> Unit): - Semanticdb.SymbolOccurrence.Builder = - this.setRange(Semanticdb.Range.newBuilder().apply(block).build()) - -inline fun Semanticdb.SymbolOccurrence.Builder.enclosingRange(block: Semanticdb.Range.Builder.() -> Unit): - Semanticdb.SymbolOccurrence.Builder = - this.setEnclosingRange(Semanticdb.Range.newBuilder().apply(block).build()) - -inline fun Semanticdb.Scope.copy(block: Semanticdb.Scope.Builder.() -> Unit): Semanticdb.Scope = - this.toBuilder().apply(block).build() - -operator fun Semanticdb.Scope.plus(other: Semanticdb.Scope): Semanticdb.Scope = - this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.Scope?.orDefault(): Semanticdb.Scope = this ?: Semanticdb.Scope.getDefaultInstance() - -inline fun Semanticdb.Scope.Builder.addHardlinks(block: Semanticdb.SymbolInformation.Builder.() -> - Unit): Semanticdb.Scope.Builder = - this.addHardlinks(Semanticdb.SymbolInformation.newBuilder().apply(block).build()) - -inline fun Semanticdb.Type.copy(block: Semanticdb.Type.Builder.() -> Unit): Semanticdb.Type = - this.toBuilder().apply(block).build() - -operator fun Semanticdb.Type.plus(other: Semanticdb.Type): Semanticdb.Type = - this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.Type?.orDefault(): Semanticdb.Type = this ?: Semanticdb.Type.getDefaultInstance() - -inline fun Semanticdb.Type.Builder.typeRef(block: Semanticdb.TypeRef.Builder.() -> Unit): - Semanticdb.Type.Builder = - this.setTypeRef(Semanticdb.TypeRef.newBuilder().apply(block).build()) - -inline fun Semanticdb.Type.Builder.existentialType(block: Semanticdb.ExistentialType.Builder.() -> - Unit): Semanticdb.Type.Builder = - this.setExistentialType(Semanticdb.ExistentialType.newBuilder().apply(block).build()) - -inline fun Semanticdb.Type.Builder.intersectionType(block: Semanticdb.IntersectionType.Builder.() -> - Unit): Semanticdb.Type.Builder = - this.setIntersectionType(Semanticdb.IntersectionType.newBuilder().apply(block).build()) - -inline fun Semanticdb.TypeRef.copy(block: Semanticdb.TypeRef.Builder.() -> Unit): Semanticdb.TypeRef - = this.toBuilder().apply(block).build() - -operator fun Semanticdb.TypeRef.plus(other: Semanticdb.TypeRef): Semanticdb.TypeRef = - this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.TypeRef?.orDefault(): Semanticdb.TypeRef = this ?: - Semanticdb.TypeRef.getDefaultInstance() - -inline fun Semanticdb.TypeRef.Builder.addTypeArguments(block: Semanticdb.Type.Builder.() -> Unit): - Semanticdb.TypeRef.Builder = - this.addTypeArguments(Semanticdb.Type.newBuilder().apply(block).build()) - -inline fun Semanticdb.IntersectionType.copy(block: Semanticdb.IntersectionType.Builder.() -> Unit): - Semanticdb.IntersectionType = this.toBuilder().apply(block).build() - -operator fun Semanticdb.IntersectionType.plus(other: Semanticdb.IntersectionType): - Semanticdb.IntersectionType = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.IntersectionType?.orDefault(): Semanticdb.IntersectionType = this ?: - Semanticdb.IntersectionType.getDefaultInstance() - -inline fun Semanticdb.IntersectionType.Builder.addTypes(block: Semanticdb.Type.Builder.() -> Unit): - Semanticdb.IntersectionType.Builder = - this.addTypes(Semanticdb.Type.newBuilder().apply(block).build()) - -inline fun Semanticdb.ExistentialType.copy(block: Semanticdb.ExistentialType.Builder.() -> Unit): - Semanticdb.ExistentialType = this.toBuilder().apply(block).build() - -operator fun Semanticdb.ExistentialType.plus(other: Semanticdb.ExistentialType): - Semanticdb.ExistentialType = this.toBuilder().mergeFrom(other).build() - -fun Semanticdb.ExistentialType?.orDefault(): Semanticdb.ExistentialType = this ?: - Semanticdb.ExistentialType.getDefaultInstance() - -inline fun Semanticdb.ExistentialType.Builder.tpe(block: Semanticdb.Type.Builder.() -> Unit): - Semanticdb.ExistentialType.Builder = - this.setTpe(Semanticdb.Type.newBuilder().apply(block).build()) - -inline fun Semanticdb.ExistentialType.Builder.declarations(block: Semanticdb.Scope.Builder.() -> - Unit): Semanticdb.ExistentialType.Builder = - this.setDeclarations(Semanticdb.Scope.newBuilder().apply(block).build()) - -inline fun TextDocuments(block: Semanticdb.TextDocuments.Builder.() -> Unit): - Semanticdb.TextDocuments = Semanticdb.TextDocuments.newBuilder().apply(block).build() - -inline fun TextDocument(block: Semanticdb.TextDocument.Builder.() -> Unit): Semanticdb.TextDocument - = Semanticdb.TextDocument.newBuilder().apply(block).build() - -inline fun Range(block: Semanticdb.Range.Builder.() -> Unit): Semanticdb.Range = - Semanticdb.Range.newBuilder().apply(block).build() - -inline fun Signature(block: Semanticdb.Signature.Builder.() -> Unit): Semanticdb.Signature = - Semanticdb.Signature.newBuilder().apply(block).build() - -inline fun ClassSignature(block: Semanticdb.ClassSignature.Builder.() -> Unit): - Semanticdb.ClassSignature = Semanticdb.ClassSignature.newBuilder().apply(block).build() - -inline fun MethodSignature(block: Semanticdb.MethodSignature.Builder.() -> Unit): - Semanticdb.MethodSignature = Semanticdb.MethodSignature.newBuilder().apply(block).build() - -inline fun TypeSignature(block: Semanticdb.TypeSignature.Builder.() -> Unit): - Semanticdb.TypeSignature = Semanticdb.TypeSignature.newBuilder().apply(block).build() - -inline fun ValueSignature(block: Semanticdb.ValueSignature.Builder.() -> Unit): - Semanticdb.ValueSignature = Semanticdb.ValueSignature.newBuilder().apply(block).build() - -inline fun SymbolInformation(block: Semanticdb.SymbolInformation.Builder.() -> Unit): - Semanticdb.SymbolInformation = - Semanticdb.SymbolInformation.newBuilder().apply(block).build() - -inline fun Access(block: Semanticdb.Access.Builder.() -> Unit): Semanticdb.Access = - Semanticdb.Access.newBuilder().apply(block).build() - -inline fun PrivateAccess(block: Semanticdb.PrivateAccess.Builder.() -> Unit): - Semanticdb.PrivateAccess = Semanticdb.PrivateAccess.newBuilder().apply(block).build() - -inline fun PrivateWithinAccess(block: Semanticdb.PrivateWithinAccess.Builder.() -> Unit): - Semanticdb.PrivateWithinAccess = - Semanticdb.PrivateWithinAccess.newBuilder().apply(block).build() - -inline fun ProtectedAccess(block: Semanticdb.ProtectedAccess.Builder.() -> Unit): - Semanticdb.ProtectedAccess = Semanticdb.ProtectedAccess.newBuilder().apply(block).build() - -inline fun PublicAccess(block: Semanticdb.PublicAccess.Builder.() -> Unit): Semanticdb.PublicAccess - = Semanticdb.PublicAccess.newBuilder().apply(block).build() - -inline fun Documentation(block: Semanticdb.Documentation.Builder.() -> Unit): - Semanticdb.Documentation = Semanticdb.Documentation.newBuilder().apply(block).build() - -inline fun SymbolOccurrence(block: Semanticdb.SymbolOccurrence.Builder.() -> Unit): - Semanticdb.SymbolOccurrence = Semanticdb.SymbolOccurrence.newBuilder().apply(block).build() - -inline fun Scope(block: Semanticdb.Scope.Builder.() -> Unit): Semanticdb.Scope = - Semanticdb.Scope.newBuilder().apply(block).build() - -inline fun Type(block: Semanticdb.Type.Builder.() -> Unit): Semanticdb.Type = - Semanticdb.Type.newBuilder().apply(block).build() - -inline fun TypeRef(block: Semanticdb.TypeRef.Builder.() -> Unit): Semanticdb.TypeRef = - Semanticdb.TypeRef.newBuilder().apply(block).build() - -inline fun IntersectionType(block: Semanticdb.IntersectionType.Builder.() -> Unit): - Semanticdb.IntersectionType = Semanticdb.IntersectionType.newBuilder().apply(block).build() - -inline fun ExistentialType(block: Semanticdb.ExistentialType.Builder.() -> Unit): - Semanticdb.ExistentialType = Semanticdb.ExistentialType.newBuilder().apply(block).build() - -@DslMarker -@Target(AnnotationTarget.CLASS) -@Retention(AnnotationRetention.BINARY) -annotation class SemanticdbDslMarker - -@SemanticdbDslMarker -interface SemanticdbDslBuilder diff --git a/semanticdb-kotlinc/src/main/proto/com.sourcegraph.semanticdb_kotlin/semanticdb.proto b/semanticdb-kotlinc/src/main/proto/com.sourcegraph.semanticdb_kotlin/semanticdb.proto deleted file mode 100644 index f09cf9231..000000000 --- a/semanticdb-kotlinc/src/main/proto/com.sourcegraph.semanticdb_kotlin/semanticdb.proto +++ /dev/null @@ -1,192 +0,0 @@ -// Original source: https://github.com/scalameta/scalameta/blob/cf796cf2436b40494baf2bdc266623dc65264ad5/semanticdb/semanticdb/semanticdb.proto -// Local modifications: -// - Removes unused fields to minimize the amount of generated code. -// - Adds SymbolInformation.documentation that is pending upstream approval. -// - Adds SymbolOccurrence.enclosing_range to support SCIP's enclosing_range field. - -syntax = "proto3"; - -package com.sourcegraph.semanticdb_kotlinc; - -option java_package = "com.sourcegraph.semanticdb_kotlinc"; -option java_multiple_files = false; - -enum Schema { - LEGACY = 0; - SEMANTICDB3 = 3; - SEMANTICDB4 = 4; -} - -message TextDocuments { - repeated TextDocument documents = 1; -} - -message TextDocument { - reserved 4, 8, 9; - Schema schema = 1; - string uri = 2; - string text = 3; - string md5 = 11; - Language language = 10; - repeated SymbolInformation symbols = 5; - repeated SymbolOccurrence occurrences = 6; -} - -enum Language { - UNKNOWN_LANGUAGE = 0; - SCALA = 1; - JAVA = 2; - KOTLIN = 3; -} - -message Range { - int32 start_line = 1; - int32 start_character = 2; - int32 end_line = 3; - int32 end_character = 4; -} - -message Signature { - oneof sealed_value { - ClassSignature class_signature = 1; - MethodSignature method_signature = 2; - TypeSignature type_signature = 3; - ValueSignature value_signature = 4; - } -} - -message ClassSignature { - Scope type_parameters = 1; - repeated Type parents = 2; - Scope declarations = 4; -} - -message MethodSignature { - Scope type_parameters = 1; - repeated Scope parameter_lists = 2; - Type return_type = 3; -} - -message TypeSignature { - Scope type_parameters = 1; - Type lower_bound = 2; - Type upper_bound = 3; -} - -message ValueSignature { - Type tpe = 1; -} - -message SymbolInformation { - enum Kind { - reserved 1, 2, 4, 5, 15, 16; - UNKNOWN_KIND = 0; - LOCAL = 19; - FIELD = 20; - METHOD = 3; - CONSTRUCTOR = 21; - TYPE = 7; - PARAMETER = 8; - TYPE_PARAMETER = 9; - PACKAGE = 11; - CLASS = 13; - INTERFACE = 18; - } - enum Property { - UNKNOWN_PROPERTY = 0; - reserved 0x1; - reserved 0x2; - ABSTRACT = 0x4; - FINAL = 0x8; - SEALED = 0x10; - STATIC = 0x1000; - ENUM = 0x4000; - } - reserved 2, 6, 7, 8, 9, 10, 11, 12, 14, 15; - string symbol = 1; - Language language = 16; - Kind kind = 3; - int32 properties = 4; - string display_name = 5; - Signature signature = 17; - Access access = 18; - repeated string overridden_symbols = 19; - // NOTE: this field does not exist in the upstream SemanticDB spec. - // It is added to support documentation strings (e.g., KDoc). - Documentation documentation = 20; -} - -message Access { - oneof sealed_value { - PrivateAccess private_access = 1; - PrivateWithinAccess private_within_access = 3; - ProtectedAccess protected_access = 4; - PublicAccess public_access = 7; - } -} - -message PrivateAccess {} - -message PrivateWithinAccess { - string symbol = 1; -} - -message ProtectedAccess {} - -message PublicAccess {} - -message Documentation { - enum Format { - HTML = 0; - MARKDOWN = 1; - JAVADOC = 2; - SCALADOC = 3; - KDOC = 4; - } - string message = 1; - Format format = 2; -} - -message SymbolOccurrence { - enum Role { - UNKNOWN_ROLE = 0; - REFERENCE = 1; - DEFINITION = 2; - } - Range range = 1; - string symbol = 2; - Role role = 3; - // NOTE: this field does not exist in the upstream SemanticDB spec. - // It is added to support SCIP's enclosing_range field. - // This is the range of the nearest non-trivial enclosing AST node. - optional Range enclosing_range = 4; -} - -message Scope { - repeated string symlinks = 1; - repeated SymbolInformation hardlinks = 2; -} - -message Type { - reserved 1, 3, 4, 5, 6, 11, 12, 15, 16; - oneof sealed_value { - TypeRef type_ref = 2; - ExistentialType existential_type = 9; - IntersectionType intersection_type = 17; - } -} - -message TypeRef { - string symbol = 2; - repeated Type type_arguments = 3; -} - -message IntersectionType { - repeated Type types = 1; -} - -message ExistentialType { - reserved 2; - Type tpe = 1; - Scope declarations = 3; -} From 6ae26592883885c4cb1381321094442204c11e82 Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 13:06:38 +0200 Subject: [PATCH 19/21] PR3 (D6): scrub legacy SemanticDB wording from docs and help text The Java/Kotlin compiler plugins now emit per-file SCIP shards directly and the 'index-semanticdb' command aggregates those shards into a single SCIP index. Update user-facing strings and docs to describe the actual behavior instead of the now-removed SemanticDB->SCIP conversion step. Keep compatibility names (Xplugin:semanticdb, index-semanticdb CLI, semanticdb-targetroot directory, semanticdb-javac module/package) so existing build integrations keep working. --- CONTRIBUTING.md | 4 +-- build.sbt | 9 ++--- docs/design.md | 36 ++++++++----------- docs/getting-started.md | 6 ++-- docs/manual-configuration.md | 21 +++++------ .../scip_java/buildtools/ScipBuildTool.scala | 2 +- .../scip_java/commands/IndexCommand.scala | 2 +- .../commands/IndexSemanticdbCommand.scala | 8 ++--- .../SemanticdbJavacOptions.java | 2 +- .../AnalyzerCommandLineProcessor.kt | 2 +- 10 files changed, 44 insertions(+), 48 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 808c2bef5..b94c20909 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,8 +31,8 @@ If you'd rather install tools manually, you'll need at least: These are the main components of the project. -- `semanticdb-javac/src/main/java`: the Java compiler plugin that creates - SemanticDB files. +- `semanticdb-javac/src/main/java`: the Java compiler plugin that emits + SCIP shard files. - `tests/minimized`: minimized Java source files that reproduce interesting test cases. - `tests/unit`: fast running unit tests that are helpful for local edit-and-test diff --git a/build.sbt b/build.sbt index c560f042c..285154984 100644 --- a/build.sbt +++ b/build.sbt @@ -443,9 +443,10 @@ lazy val semanticdbKotlinc = project // `semanticdbKotlincMinimized` mirrors the (still-present) Gradle build at // semanticdb-kotlinc/minimized/build.gradle.kts. It compiles a small set of // Kotlin and Java fixtures with the assembled `semanticdbKotlinc` plugin -// attached to kotlinc/javac, producing *.semanticdb files under -// target/semanticdb-targetroot/ which are then converted to SCIP and rendered -// as the human-readable golden snapshots by the `snapshots` task. +// attached to kotlinc/javac, producing *.scip shard files under +// target/semanticdb-targetroot/ which are then aggregated into a single SCIP +// index and rendered as the human-readable golden snapshots by the +// `snapshots` task. lazy val semanticdbKotlincMinimized = project .in(file("semanticdb-kotlinc/minimized")) .enablePlugins(KotlinPlugin) @@ -509,7 +510,7 @@ lazy val semanticdbKotlincMinimized = project // ----- snapshots regeneration task ----- // Invokes `com.sourcegraph.scip_java.ScipJava.main` twice in the cli JVM // (forked — ScipJava.main calls System.exit on failure). First pass - // converts the *.semanticdb files under target/semanticdb-targetroot/ + // aggregates the *.scip shard files under target/semanticdb-targetroot/ // into an index.scip; second pass renders that index as the human-readable // golden snapshots. // diff --git a/docs/design.md b/docs/design.md index af79ca5f6..4f3e54db0 100644 --- a/docs/design.md +++ b/docs/design.md @@ -5,10 +5,9 @@ title: Design This project is implemented as a [Java compiler plugin](https://docs.oracle.com/en/java/javase/11/docs/api/jdk.compiler/com/sun/source/util/Plugin.html) -that generates one -[SemanticDB](https://scalameta.org/docs/semanticdb/specification.html) file for -every `*.java` source file. After compilation completes, the SemanticDB files -are processed to produce SCIP. +that emits one [SCIP](https://github.com/sourcegraph/scip) shard file for every +`*.java` source file. After compilation completes, the per-file SCIP shards are +aggregated into a single SCIP index. ### Why Java compiler plugin? @@ -25,23 +24,18 @@ There are several benefits to implementing scip-java as a compiler plugin: installed system dependencies, custom compiler options and custom annotation processors. -### Why SemanticDB? +### Why per-file SCIP shards? -SemanticDB is Protobuf schema for information about symbols and types in Java -programs and other languages. There are several benefits to using SemanticDB as -an intermediary representation for SCIP: +The compiler plugin writes a small SCIP shard per compilation unit and a +separate step aggregates the shards into a single SCIP index. There are several +benefits to this two-phase pipeline: - **Simplicity**: It's easy to translate a single Java source file into a single - SemanticDB file inside a compiler plugin. It's more complicated to produce - SCIP because compiler plugins does not have access to a project-wide context, - which is necessary to produce accurate definitions and hovers in multi-module - projects with external library dependencies. -- **Performance**: SemanticDB is fast to write and read. Each compilation unit - can be processed independently to keep memory usage low. The final conversion - from SemanticDB to SCIP can be safely parallelized. -- **Cross-repository**: Compiler plugins have access to both source code and the - classpath (compiled bytecode of upstream dependencies). SemanticDB has been - designed so that it's also possible to generate spec-compliant symbols from - the classpath alone (no source code) and from the syntax tree of an individual - source file (no classpath). This flexibility will be helpful for scip-java in - the future to unblock cross-repository navigation. + SCIP shard inside a compiler plugin. It would be more complicated to produce + a full SCIP index from inside the plugin because compiler plugins don't have + access to a project-wide context, which is necessary to produce accurate + definitions and hovers in multi-module projects with external library + dependencies. +- **Performance**: Each compilation unit can be processed independently to keep + memory usage low. The final aggregation of the shards into a single SCIP + index can be safely parallelized. diff --git a/docs/getting-started.md b/docs/getting-started.md index 93d896a09..9e1a3515a 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -351,10 +351,10 @@ Next, run the following command to generate the SCIP index (`index.scip`). ``` bazel run @scip_java//scip-semanticdb:bazel -- --sourceroot $PWD -# (optional) Validate that SemanticDB files were generated. +# (optional) Validate that SCIP shard files were generated. # The command below works for the `examples/bazel-example` directory in the sourcegraph/scip-java repository. -❯ jar tf bazel-bin/src/main/java/example/libexample.jar | grep semanticdb$ -META-INF/semanticdb/src/main/java/example/Example.java.semanticdb +❯ jar tf bazel-bin/src/main/java/example/libexample.jar | grep scip$ +META-INF/scip/src/main/java/example/Example.java.scip ``` Finally, run the following commands to upload the SCIP index to Sourcegraph. diff --git a/docs/manual-configuration.md b/docs/manual-configuration.md index 49e3597d5..557abbf4b 100644 --- a/docs/manual-configuration.md +++ b/docs/manual-configuration.md @@ -12,10 +12,11 @@ fails. Indexing a codebase consists of two independent phases: -- Compile the codebase with the SemanticDB compiler plugin. -- Generate SCIP index from SemanticDB files. +- Compile the codebase with the SemanticDB compiler plugin, which writes one + SCIP shard per Java source file. +- Aggregate the SCIP shards into a single SCIP index. -![A three stage pipeline that starts with a list of Java sources, creates a list of SemanticDB files that then become a single SCIP index.](assets/semanticdb-javac-pipeline.svg) +![A three stage pipeline that starts with a list of Java sources, creates a list of per-file SCIP shards that then become a single SCIP index.](assets/semanticdb-javac-pipeline.svg) The first phase can be complicated to configure and it can take a while to run. The second phase is quite simple to configure and it usually runs very fast. @@ -63,7 +64,7 @@ compiler plugin. To do this you need to explicitly configure two directories: It's important that all of the source files that should be index live under this directory. - `-targetroot:PATH`: the absolute path to the directory where to generate - SemanticDB file. This directory can be anywhere on your file system. + SCIP shard files. This directory can be anywhere on your file system. Alternatively, pass in `-targetroot:javac-classes-directory` for the plugin to automatically use the `javac` output directory. @@ -112,13 +113,13 @@ examples: - Maven: `mvn clean verify -DskipTests` - Bazel: `bazel build //...` -If everything went well, you should have a lot of `*.semanticdb` files in the +If everything went well, you should have a lot of `*.scip` shard files in the targetroot directory. ``` ❯ find $TARGETROOT -type f -build/semanticdb-targetroot/META-INF/semanticdb/j11/src/test/java/example/ExampleTest.java.semanticdb -build/semanticdb-targetroot/META-INF/semanticdb/j11/src/main/java/example/Example.java.semanticdb +build/semanticdb-targetroot/META-INF/scip/j11/src/test/java/example/ExampleTest.java.scip +build/semanticdb-targetroot/META-INF/scip/j11/src/main/java/example/Example.java.scip ... ``` @@ -198,13 +199,13 @@ Which allows you to invoke it by simply running `mvn sourcegraph:sourcegraphDepe Cross-repository navigation is a feature that allows "goto definition" and "find references" to show results from multiple repositories. -## Step 5: Generate SCIP index from SemanticDB files +## Step 5: Aggregate SCIP shards into a single SCIP index First, install the `scip-java` command-line tool according to the instructions in the [getting started guide](getting-started.md). -Next, run the `scip-java index-semanticdb` command to convert SemanticDB files -into SCIP. +Next, run the `scip-java index-semanticdb` command to aggregate the per-file +SCIP shards into a single SCIP index. ```sh ❯ scip-java index-semanticdb $TARGETROOT diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala index 7656a8dd0..3bcb1bae6 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/buildtools/ScipBuildTool.scala @@ -206,7 +206,7 @@ class ScipBuildTool(index: IndexCommand) extends BuildTool("SCIP", index) { .app .reporter .info( - "Some SemanticDB files got generated even if there were compile errors. " + + "Some SCIP shard files got generated even if there were compile errors. " + "In most cases, this means that scip-java managed to index everything " + "except the locations that had compile errors and you can ignore the compile errors." ) diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexCommand.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexCommand.scala index 566fc0c0e..04e962280 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexCommand.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexCommand.scala @@ -29,7 +29,7 @@ case class IndexCommand( @Description("The path where to generate the SCIP index.") output: Path = Paths.get("index.scip"), @Description( - "The directory where to generate SemanticDB files. " + + "The directory where to generate SCIP shard files. " + "Defaults to a build-specific path. " + "For example, the default value for Gradle is 'build/semanticdb-targetroot' and for Maven it's 'target/semanticdb-targetroot'" ) diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala index 9d94c6eaa..999b2c9b7 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala @@ -21,7 +21,7 @@ import moped.cli.CommandParser import ujson.Arr import ujson.Obj -@Description("Converts SemanticDB files into a single SCIP index file.") +@Description("Aggregates SCIP shard files into a single SCIP index file.") @Usage("scip-java index-semanticdb [OPTIONS ...] [POSITIONAL ARGUMENTS ...]") @ExampleUsage( "scip-java index-semanticdb --out=myindex.scip my/targetroot1 my/targetroot2" @@ -30,10 +30,10 @@ import ujson.Obj final case class IndexSemanticdbCommand( @Description("The name of the output file.") output: Path = Paths.get("index.scip"), - @Description("Whether to process the SemanticDB files in parallel") + @Description("Whether to process the SCIP shard files in parallel") parallel: Boolean = true, @Description( - "Whether to infer the location of SemanticDB files based as produced by Bazel" + "Whether to infer the location of SCIP shard files based as produced by Bazel" ) bazel: Boolean = true, @Description( @@ -44,7 +44,7 @@ final case class IndexSemanticdbCommand( @Description("URL to a PackageHub instance") @Hidden packagehub: Option[String] = None, - @Description("Directories that contain SemanticDB files.") + @Description("Directories that contain SCIP shard files.") @PositionalArguments() targetroot: List[Path] = Nil, @Description( 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 9ad47ef4b..e42c9fa43 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 @@ -18,7 +18,7 @@ /** Settings that can be configured alongside the -Xplugin compiler option. */ public class SemanticdbJavacOptions { - /** The directory to place META-INF and its .semanticdb files */ + /** The directory to place META-INF and its SCIP shard files */ public Path targetroot; public Path sourceroot; diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCommandLineProcessor.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCommandLineProcessor.kt index 4c67ac789..291dd6ec7 100644 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCommandLineProcessor.kt +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerCommandLineProcessor.kt @@ -28,7 +28,7 @@ class AnalyzerCommandLineProcessor : CommandLineProcessor { CliOption( VAL_TARGET, "", - "the absolute path to the directory where to generate SemanticDB files.", + "the absolute path to the directory where to generate SCIP shard files.", required = true)) override fun processOption( From 900a2a688053c960892fbfbcba2d4de6ca570544 Mon Sep 17 00:00:00 2001 From: jupblb Date: Fri, 29 May 2026 15:54:47 +0200 Subject: [PATCH 20/21] docs: remove per-file SCIP shards section --- docs/design.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/docs/design.md b/docs/design.md index 4f3e54db0..853fc6f25 100644 --- a/docs/design.md +++ b/docs/design.md @@ -23,19 +23,3 @@ There are several benefits to implementing scip-java as a compiler plugin: tool, we minimize the risk of diverging from the CI build environment such as installed system dependencies, custom compiler options and custom annotation processors. - -### Why per-file SCIP shards? - -The compiler plugin writes a small SCIP shard per compilation unit and a -separate step aggregates the shards into a single SCIP index. There are several -benefits to this two-phase pipeline: - -- **Simplicity**: It's easy to translate a single Java source file into a single - SCIP shard inside a compiler plugin. It would be more complicated to produce - a full SCIP index from inside the plugin because compiler plugins don't have - access to a project-wide context, which is necessary to produce accurate - definitions and hovers in multi-module projects with external library - dependencies. -- **Performance**: Each compilation unit can be processed independently to keep - memory usage low. The final aggregation of the shards into a single SCIP - index can be safely parallelized. From f6ce6109bafa013deb4c274130594e15cc2cd098 Mon Sep 17 00:00:00 2001 From: jupblb Date: Fri, 29 May 2026 15:56:33 +0200 Subject: [PATCH 21/21] docs: remove dangling pipeline.svg reference --- docs/manual-configuration.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/manual-configuration.md b/docs/manual-configuration.md index 557abbf4b..98c473fb4 100644 --- a/docs/manual-configuration.md +++ b/docs/manual-configuration.md @@ -16,8 +16,6 @@ Indexing a codebase consists of two independent phases: SCIP shard per Java source file. - Aggregate the SCIP shards into a single SCIP index. -![A three stage pipeline that starts with a list of Java sources, creates a list of per-file SCIP shards that then become a single SCIP index.](assets/semanticdb-javac-pipeline.svg) - The first phase can be complicated to configure and it can take a while to run. The second phase is quite simple to configure and it usually runs very fast.

Symbols are produced through {@link GlobalSymbolsCache} and then translated to the + * placeholder SCIP form via {@link ScipSymbols#fromSemanticdbSymbol(String)}. Signature * documentation is produced by {@link ScipSignatureFormatter} directly from javac's element model. */ public final class ScipVisitor extends TreePathScanner { 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 8b50817da..9ad47ef4b 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 @@ -24,14 +24,6 @@ public class SemanticdbJavacOptions { public Path sourceroot; public boolean includeText = false; public boolean verboseEnabled = false; - /** - * Controls whether the plugin emits {@code *.scip} shards under {@code META-INF/scip/...} - * alongside the existing {@code *.semanticdb} files. Defaults to {@code true}: producing the - * extra shard is cheap and lets the {@code scip-java index-semanticdb --use-scip-shards} - * pipeline run without any additional compiler-side configuration. Legacy users that only - * consume {@code .semanticdb} are unaffected. Pass {@code -emit-scip:off} to disable. - */ - public boolean emitScip = true; public final ArrayList errors; public boolean alreadyReportedErrors = false; @@ -106,10 +98,9 @@ public static SemanticdbJavacOptions parse(String[] args, JavacTask task) { result.verboseEnabled = true; } else if (arg.equals("-verbose:off")) { result.verboseEnabled = false; - } else if (arg.equals("-emit-scip:on")) { - result.emitScip = true; - } else if (arg.equals("-emit-scip:off")) { - result.emitScip = false; + } else if (arg.equals("-emit-scip:on") || arg.equals("-emit-scip:off")) { + // Deprecated no-op: SCIP shard emission is now unconditional. The flag is still parsed so + // older callers / cached compiler options keep working without errors. } else if (arg.startsWith("-randomtimestamp")) { } else { result.errors.add(String.format("unknown flag '%s'\n", arg)); diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbSignatures.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbSignatures.java deleted file mode 100644 index 6e4fedf0e..000000000 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbSignatures.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.sourcegraph.semanticdb_javac; - -import com.sourcegraph.semanticdb_javac.Semanticdb.*; - -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.element.VariableElement; -import javax.lang.model.element.TypeParameterElement; -import javax.lang.model.type.TypeVariable; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.util.Types; -import java.util.List; -import java.util.stream.Collectors; - -import static com.sourcegraph.semanticdb_javac.SemanticdbBuilders.*; -import static com.sourcegraph.semanticdb_javac.SemanticdbTypeVisitor.UNRESOLVED_TYPE_REF; - -public final class SemanticdbSignatures { - private final GlobalSymbolsCache cache; - private final LocalSymbolsCache locals; - private final Types types; - - public SemanticdbSignatures(GlobalSymbolsCache cache, LocalSymbolsCache locals, Types types) { - this.cache = cache; - this.locals = locals; - this.types = types; - } - - public Signature generateSignature(Element sym) { - if (sym instanceof TypeElement) { - return generateClassSignature((TypeElement) sym); - } else if (sym instanceof ExecutableElement) { - return generateMethodSignature((ExecutableElement) sym); - } else if (sym instanceof VariableElement) { - return generateFieldSignature((VariableElement) sym); - } else if (sym instanceof TypeParameterElement) { - return generateTypeSignature((TypeParameterElement) sym); - } - return null; - } - - private Signature generateClassSignature(TypeElement sym) { - ClassSignature.Builder builder = ClassSignature.newBuilder(); - - builder.setTypeParameters(generateScope(sym.getTypeParameters())); - - for (TypeMirror superType : types.directSupertypes(sym.asType())) { - Semanticdb.Type semanticdbType = generateType(superType); - if (semanticdbType == null) { - semanticdbType = UNRESOLVED_TYPE_REF; - } - builder.addParents(semanticdbType); - } - - builder.setDeclarations(generateScope(sym.getEnclosedElements())); - - return signature(builder); - } - - private Signature generateMethodSignature(ExecutableElement sym) { - MethodSignature.Builder builder = MethodSignature.newBuilder(); - - builder.setTypeParameters(generateScope(sym.getTypeParameters())); - - builder.addParameterLists(generateScope(sym.getParameters())); - - Semanticdb.Type returnType = generateType(sym.getReturnType()); - if (returnType != null) { - builder.setReturnType(returnType); - } - - List thrownTypes = - sym.getThrownTypes().stream().map(this::generateType).collect(Collectors.toList()); - builder.addAllThrows(thrownTypes); - - return signature(builder); - } - - private Signature generateFieldSignature(VariableElement sym) { - Semanticdb.Type generateType = generateType(sym.asType()); - if (generateType == null) { - generateType = UNRESOLVED_TYPE_REF; - } - return signature(ValueSignature.newBuilder().setTpe(generateType)); - } - - private Signature generateTypeSignature(TypeParameterElement sym) { - TypeSignature.Builder builder = TypeSignature.newBuilder(); - - if (sym instanceof TypeElement) { - builder.setTypeParameters(generateScope(((TypeElement) sym).getTypeParameters())); - } - - TypeMirror varType = sym.asType(); - if (varType instanceof TypeVariable) { - Semanticdb.Type upperBound = generateType(((TypeVariable) varType).getUpperBound()); - if (upperBound != null) builder.setUpperBound(upperBound); - else builder.setUpperBound(UNRESOLVED_TYPE_REF); - } else builder.setUpperBound(UNRESOLVED_TYPE_REF); - - return signature(builder); - } - - private Scope generateScope(List elements) { - Scope.Builder scope = Scope.newBuilder(); - for (Element typeVar : elements) { - scope.addSymlinks(cache.semanticdbSymbol(typeVar, locals)); - } - return scope.build(); - } - - private Semanticdb.Type generateType(TypeMirror mirror) { - return new SemanticdbTypeVisitor(cache, locals, types).semanticdbType(mirror); - } -} 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 7f96fd017..c7ce170ef 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 @@ -8,18 +8,18 @@ import javax.lang.model.util.Types; import javax.tools.JavaFileObject; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintWriter; import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; /** - * Callback hook that generates SemanticDB when the compiler has completed typechecking a Java - * source file. + * Callback hook that drives {@link ScipVisitor} after javac finishes typechecking a Java source + * file. The visitor builds a self-contained {@code *.scip} shard which is written (or merged) + * under {@code META-INF/scip/...}. */ public final class SemanticdbTaskListener implements TaskListener { private final SemanticdbJavacOptions options; @@ -46,18 +46,14 @@ public SemanticdbTaskListener( @Override public void started(TaskEvent e) { - // Upon first encounter with a file (before any other tasks are run) - // we remove the semanticdb file for this source file to ensure - // stale data doesn't cause problems + // Upon first encounter with a file (before any other tasks are run) we remove any prior SCIP + // shard for this source file to avoid accumulating stale occurrences across builds. if (e.getKind() == TaskEvent.Kind.ENTER) { inferBazelSourceroot(e.getSourceFile()); - Result semanticdbPath = semanticdbOutputPath(options, e); - if (semanticdbPath.isOk()) { + Result shardPath = scipShardOutputPath(options, e); + if (shardPath != null && shardPath.isOk()) { try { - Path sdb = semanticdbPath.getOrThrow(); - Files.deleteIfExists(sdb); - // Also drop any stale SCIP shard so we don't accumulate occurrences across builds. - Files.deleteIfExists(scipShardPath(sdb)); + Files.deleteIfExists(shardPath.getOrThrow()); } catch (IOException ex) { this.reportException(ex, e); } @@ -81,12 +77,8 @@ public void finished(TaskEvent e) { try { onFinishedAnalyze(e); } catch (Throwable ex) { - // Catch exceptions because we don't want to stop the compilation even if this - // plugin has a + // 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. Throwable throwable = ex; if (e.getSourceFile() != null) { throwable = @@ -97,10 +89,8 @@ public void finished(TaskEvent e) { } } - // Uses reporter.error with the full stack trace of the exception instead of - // reporter.exception - // because reporter.exception doesn't seem to print any meaningful information - // about the + // Uses reporter.error with the full stack trace of the exception instead of reporter.exception + // because reporter.exception doesn't seem to print any meaningful information about the // exception, it just prints the location with an empty message. private void reportException(Throwable exception, TaskEvent e) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -111,157 +101,21 @@ private void reportException(Throwable exception, TaskEvent e) { } private void onFinishedAnalyze(TaskEvent e) { - Result path = semanticdbOutputPath(options, e); - if (path != null) { - if (path.isOk()) { - Semanticdb.TextDocument textDocument = - new SemanticdbVisitor(globals, e.getCompilationUnit(), options, types, trees, elements) - .buildTextDocument(e.getCompilationUnit()); - Path output = path.getOrThrow(); - if (Files.exists(output)) appendSemanticdb(e, output, textDocument); - else writeSemanticdb(e, output, textDocument); - - if (options.emitScip) { - emitScipShard(e, output); - } - } else { - reporter.error(path.getErrorOrThrow(), e); - } + Result path = scipShardOutputPath(options, e); + if (path == null) return; + if (!path.isOk()) { + reporter.error(path.getErrorOrThrow(), e); + return; } - } - /** - * Drives {@link ScipVisitor} over the compilation unit to build a {@code *.scip} shard under the - * matching {@code META-INF/scip/} path. During the SemanticDB→SCIP transition this is a second - * AST walk; once the legacy {@code *.semanticdb} output is removed the SCIP walk will be the only - * one. - */ - private void emitScipShard(TaskEvent event, Path semanticdbPath) { + Path shardPath = path.getOrThrow(); try { - Path shardPath = scipShardPath(semanticdbPath); com.sourcegraph.Scip.Index shard = - new ScipVisitor(globals, event.getCompilationUnit(), options, types, trees, elements) - .buildShard(event.getCompilationUnit()); + new ScipVisitor(globals, e.getCompilationUnit(), options, types, trees, elements) + .buildShard(e.getCompilationUnit()); ScipShardWriter.writeOrMerge(shardPath, shard); } catch (IOException ex) { - this.reportException(ex, event); - } - } - - /** - * Converts a {@code META-INF/semanticdb/.semanticdb} path into the matching {@code - * META-INF/scip/.scip} path. - */ - static Path scipShardPath(Path semanticdbPath) { - Path filename = semanticdbPath.getFileName(); - String name = filename.toString(); - if (name.endsWith(".semanticdb")) { - name = name.substring(0, name.length() - ".semanticdb".length()) + ".scip"; - } else { - name = name + ".scip"; - } - // Replace the trailing ".../META-INF/semanticdb/" prefix with ".../META-INF/scip/" - Path withoutFile = semanticdbPath.getParent(); - Path scipParent = rewriteSemanticdbToScip(withoutFile); - return scipParent.resolve(name); - } - - private static Path rewriteSemanticdbToScip(Path dir) { - // Walk up looking for a `semanticdb` segment immediately under `META-INF` and replace it. - Path root = dir.getRoot(); - java.util.ArrayList parts = new java.util.ArrayList<>(); - for (Path p : dir) parts.add(p.getFileName().toString()); - for (int i = parts.size() - 1; i > 0; i--) { - if (parts.get(i).equals("semanticdb") && parts.get(i - 1).equals("META-INF")) { - parts.set(i, "scip"); - break; - } - } - Path result = root == null ? Paths.get("") : root; - for (String part : parts) result = result.resolve(part); - return result; - } - - private void writeSemanticdb(TaskEvent event, Path output, Semanticdb.TextDocument textDocument) { - try { - byte[] bytes = - Semanticdb.TextDocuments.newBuilder().addDocuments(textDocument).build().toByteArray(); - Files.createDirectories(output.getParent()); - Files.write(output, bytes); - } catch (IOException e) { - this.reportException(e, event); - } - } - - private void appendSemanticdb( - TaskEvent event, Path output, Semanticdb.TextDocument textDocument) { - /* - * If there already is a semanticdb file at the given path, - * we do the following: - * - Read a documents collection - * - Try to find the document with the matching relative path (matching the incoming textDocument) - * - Then, depending on whether a matching document already exists in the collection: - * - if YES, mutate it in place to only add entries from the incoming document - * - if NO, simply add the incoming text document to the collection - * - Write the collection back to disk - * */ - Semanticdb.TextDocument document = null; - int documentIndex = -1; - Semanticdb.TextDocuments documents = null; - - try (InputStream is = Files.newInputStream(output.toFile().toPath())) { - documents = Semanticdb.TextDocuments.parseFrom(is); - - for (int i = 0; i < documents.getDocumentsCount(); i++) { - Semanticdb.TextDocument candidate = documents.getDocuments(i); - if (document == null && candidate.getUri().equals(textDocument.getUri())) { - document = candidate; - documentIndex = i; - } - } - - } catch (IOException e) { - this.reportException(e, event); - return; - } - - if (document != null) { - // If there is a previous semanticdb document at this path, we need - // to deduplicate symbols and occurrences and mutate the document in place - Set symbols = new HashSet<>(textDocument.getSymbolsList()); - Set occurrences = - new HashSet<>(textDocument.getOccurrencesList()); - Set synthetics = new HashSet<>(textDocument.getSyntheticsList()); - - symbols.addAll(document.getSymbolsList()); - occurrences.addAll(document.getOccurrencesList()); - synthetics.addAll(document.getSyntheticsList()); - - documents - .toBuilder() - .addDocuments( - documentIndex, - document - .toBuilder() - .clearOccurrences() - .addAllOccurrences(occurrences) - .clearSymbols() - .addAllSymbols(symbols) - .clearSynthetics() - .addAllSynthetics(synthetics)); - - } else { - // If no prior document was found, we can just add the incoming one to the collection - documents = documents.toBuilder().addDocuments(textDocument).build(); - } - - byte[] bytes = documents.toByteArray(); - - try { - Files.createDirectories(output.getParent()); - Files.write(output, bytes); - } catch (IOException e) { - this.reportException(e, event); + this.reportException(ex, e); } } @@ -278,16 +132,11 @@ public static Path absolutePathFromUri(SemanticdbJavacOptions options, JavaFileO } } else 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. - // The Bazel Java compiler constructs `SimpleFileObject/DirectoryFileObject` - // with a - // "user-friendly" name that points to the original source file and an - // underlying/actual - // file path in a temporary directory. We're constrained by having to use only - // public APIs of - // the Java compiler and `toString()` seems to be the only way to access the - // user-friendly + // This solution is hacky, and it would be very nice to use a dedicated API instead. + // The Bazel Java compiler constructs `SimpleFileObject/DirectoryFileObject` with a + // "user-friendly" name that points to the original source file and an underlying/actual + // file path in a temporary directory. We're constrained by having to use only public APIs of + // the Java compiler and `toString()` seems to be the only way to access the user-friendly // path. String[] knownBazelToStringPatterns = new String[] {"SimpleFileObject[", "DirectoryFileObject["}; @@ -314,19 +163,7 @@ private void inferBazelSourceroot(JavaFileObject file) { } Path absolutePath = absolutePathFromUri(options, file); Path uriPath = Paths.get(file.toUri()); - // absolutePath is the "human-readable" original path, for example - // /home/repo/com/example/Hello.java - // uriPath is the sandbox/temporary file path, for example - // /private/var/tmp/com/example/Hello.java - // - // We infer sourceroot by iterating the names of both files in reverse order - // and stop at the first entry where the two paths are different. For the - // example above, we compare "Hello.java", then "example", then "com", and - // when we reach "repo" != "tmp" then we guess that "/home/repo" is the - // sourceroot. This logic is brittle and it would be nice to use more - // dedicated APIs, but Bazel actively makes an effort to sandbox - // compilation and hide access to the original workspace, which is why we - // resort to solutions like this. + // See comments in the previous implementation for the rationale of the inference loop below. int relativePathDepth = 0; int uriPathDepth = uriPath.getNameCount(); int absolutePathDepth = absolutePath.getNameCount(); @@ -344,41 +181,36 @@ private void inferBazelSourceroot(JavaFileObject file) { .resolve(absolutePath.subpath(0, absolutePathDepth - relativePathDepth)); } - private Result semanticdbOutputPath(SemanticdbJavacOptions options, TaskEvent e) { + private Result scipShardOutputPath(SemanticdbJavacOptions options, TaskEvent e) { Path absolutePath = absolutePathFromUri(options, e.getSourceFile()); if (absolutePath.startsWith(options.sourceroot)) { Path relativePath = options.sourceroot.relativize(absolutePath); - String filename = relativePath.getFileName().toString() + ".semanticdb"; - Path semanticdbOutputPath = + String filename = relativePath.getFileName().toString() + ".scip"; + Path scipOutputPath = options .targetroot .resolve("META-INF") - .resolve("semanticdb") + .resolve("scip") .resolve(relativePath) .resolveSibling(filename); - return Result.ok(semanticdbOutputPath); + return Result.ok(scipOutputPath); } switch (options.noRelativePath) { case INDEX_ANYWAY: - // Come up with a unique relative path for this file even if it's not under the - // sourceroot. - // By indexing auto-generated files, we collect SymbolInformation for - // auto-generated symbol, - // which results in more useful hover tooltips in the editor. - // In the future, we may want to additionally embed the full text contents of - // these files - // so that it's possible to browse generated files with precise code navigation. + // Come up with a unique relative path for this file even if it's not under the sourceroot. + // By indexing auto-generated files, we collect SymbolInformation for auto-generated + // symbols, which results in more useful hover tooltips in the editor. String uniqueFilename = - String.format("%d.%s.semanticdb", ++noRelativePathCounter, absolutePath.getFileName()); - Path semanticdbOutputPath = + String.format("%d.%s.scip", ++noRelativePathCounter, absolutePath.getFileName()); + Path scipOutputPath = options .targetroot .resolve("META-INF") - .resolve("semanticdb") + .resolve("scip") .resolve("no-relative-path") .resolve(uniqueFilename); - return Result.ok(semanticdbOutputPath); + return Result.ok(scipOutputPath); case WARNING: reporter.info( String.format( diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTrees.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTrees.java deleted file mode 100644 index f78b5abe6..000000000 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTrees.java +++ /dev/null @@ -1,258 +0,0 @@ -package com.sourcegraph.semanticdb_javac; - -import com.sun.source.tree.*; -import com.sun.source.util.Trees; -import javax.lang.model.element.Element; -import javax.lang.model.util.Types; -import javax.lang.model.type.TypeMirror; -import com.sun.source.util.TreePath; -import com.sun.source.tree.Tree; -import com.sun.source.tree.Tree.Kind; - -import java.util.HashMap; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import static com.sourcegraph.semanticdb_javac.SemanticdbBuilders.*; -import static com.sourcegraph.semanticdb_javac.SemanticdbTypeVisitor.ARRAY_SYMBOL; - -public class SemanticdbTrees { - public SemanticdbTrees( - GlobalSymbolsCache globals, - LocalSymbolsCache locals, - String semanticdbUri, - Types types, - Trees trees, - HashMap nodes) { - this.globals = globals; - this.locals = locals; - this.semanticdbUri = semanticdbUri; - this.types = types; - this.trees = trees; - this.nodes = nodes; - this.typeVisitor = new SemanticdbTypeVisitor(globals, locals, types); - } - - private final GlobalSymbolsCache globals; - private final LocalSymbolsCache locals; - private final String semanticdbUri; - private final Types types; - private final Trees trees; - private final HashMap nodes; - private final SemanticdbTypeVisitor typeVisitor; - - public List annotations(Tree node) { - if (!(node instanceof ClassTree) - && !(node instanceof MethodTree) - && !(node instanceof VariableTree)) return null; - - List annotations = new ArrayList<>(); - - ModifiersTree mods; - if (node instanceof ClassTree) { - mods = ((ClassTree) node).getModifiers(); - } else if (node instanceof MethodTree) { - mods = ((MethodTree) node).getModifiers(); - } else { - mods = ((VariableTree) node).getModifiers(); - } - - for (AnnotationTree annotation : mods.getAnnotations()) { - annotations.add(annotationBuilder(annotation)); - } - - return annotations; - } - - public Semanticdb.AnnotationTree annotationBuilder(AnnotationTree annotation) { - ArrayList params = new ArrayList<>(annotation.getArguments().size()); - - for (ExpressionTree param : annotation.getArguments()) { - // anecdotally not always AssignmentTree in some situations when a compilation - // unit can't - // resolve symbols fully - if (param instanceof AssignmentTree) { - AssignmentTree assign = (AssignmentTree) param; - ExpressionTree assignValue = assign.getExpression(); - TreePath variableTreePath = nodes.get(assign.getVariable()); - if (variableTreePath != null) { - Element variableSym = trees.getElement(variableTreePath); - String symbol = globals.semanticdbSymbol(variableSym, locals); - params.add(tree(assignTree(tree(idTree(symbol)), annotationParameter(assignValue)))); - } - } else { - params.add(annotationParameter(param)); - } - } - - TreePath annotationTreePath = nodes.get(annotation); - Element annotationSym = trees.getElement(annotationTreePath); - - Semanticdb.Type type = typeVisitor.semanticdbType(annotationSym.asType()); - return annotationTree(type, params); - } - - private TypeMirror getTreeType(Tree tree) { - TreePath path = nodes.get(tree); - return trees.getTypeMirror(path); - } - - private Semanticdb.Tree annotationParameter(ExpressionTree expr) { - if (expr instanceof MemberSelectTree) { - TreePath expressionTreePath = nodes.get(expr); - Element expressionSym = trees.getElement(expressionTreePath); - return tree( - selectTree( - tree(idTree(globals.semanticdbSymbol(expressionSym.getEnclosingElement(), locals))), - idTree(globals.semanticdbSymbol(expressionSym, locals)))); - } else if (expr instanceof NewArrayTree) { - NewArrayTree rhs = (NewArrayTree) expr; - return tree( - applyTree( - tree(idTree(ARRAY_SYMBOL)), - rhs.getInitializers().stream() - .map(this::annotationParameter) - .collect(Collectors.toList()))); - } else if (expr instanceof LiteralTree) { - // Literals can either be a primitive or String - Object value = ((LiteralTree) expr).getValue(); - final Semanticdb.Constant constant; - // Technically, annotation parameter values cannot be null, - // according to JLS: https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.7.1 - // But this codepath is still possible to hit when compiling invalid code - and - // we should handle the null const case in order to fail more gracefully - if (value == null) constant = nullConst(); - else if (value instanceof String) constant = stringConst((String) value); - else if (value instanceof Boolean) constant = booleanConst((Boolean) value); - else if (value instanceof Byte) constant = byteConst((Byte) value); - else if (value instanceof Short) constant = shortConst((Short) value); - else if (value instanceof Integer) constant = intConst((Integer) value); - else if (value instanceof Long) constant = longConst((Long) value); - else if (value instanceof Character) constant = charConst((Character) value); - else if (value instanceof Float) constant = floatConst((Float) value); - else if (value instanceof Double) constant = doubleConst((Double) value); - else - throw new IllegalStateException( - semanticdbUri - + ": annotation parameter rhs was of unexpected class type " - + value.getClass() - + "\n" - + value); - return tree(literalTree(constant)); - } else if (expr instanceof AnnotationTree) { - return tree(annotationBuilder((AnnotationTree) expr)); - } else if (expr instanceof IdentifierTree) { - TreePath expressionTreePath = nodes.get(expr); - Element expressionSym = trees.getElement(expressionTreePath); - return tree(idTree(globals.semanticdbSymbol(expressionSym, locals))); - } else if (expr instanceof BinaryTree) { - BinaryTree binExpr = (BinaryTree) expr; - return tree( - binopTree( - annotationParameter(binExpr.getLeftOperand()), - semanticdbBinaryOperator(expr.getKind()), - annotationParameter(binExpr.getRightOperand()))); - } else if (expr instanceof UnaryTree) { - UnaryTree unaryExpr = (UnaryTree) expr; - return tree( - unaryOpTree( - semanticdbUnaryOperator(unaryExpr.getKind()), - annotationParameter(unaryExpr.getExpression()))); - } else if (expr instanceof ParenthesizedTree) { - ParenthesizedTree parenExpr = (ParenthesizedTree) expr; - return annotationParameter(parenExpr.getExpression()); - } else if (expr instanceof TypeCastTree) { - TypeCastTree tree = (TypeCastTree) expr; - return tree( - castTree( - typeVisitor.semanticdbType(getTreeType(tree.getType())), - annotationParameter(tree.getExpression()))); - } else { - throw new IllegalArgumentException( - semanticdbUri - + ": annotation parameter rhs was of unexpected tree node type " - + expr.getClass() - + "\n" - + expr); - } - } - - private Semanticdb.BinaryOperator semanticdbBinaryOperator(Tree.Kind kind) { - switch (kind) { - case PLUS: - return Semanticdb.BinaryOperator.PLUS; - case MINUS: - return Semanticdb.BinaryOperator.MINUS; - case MULTIPLY: - return Semanticdb.BinaryOperator.MULTIPLY; - case DIVIDE: - return Semanticdb.BinaryOperator.DIVIDE; - case REMAINDER: - return Semanticdb.BinaryOperator.REMAINDER; - case LESS_THAN: - return Semanticdb.BinaryOperator.LESS_THAN; - case GREATER_THAN: - return Semanticdb.BinaryOperator.GREATER_THAN; - case LEFT_SHIFT: - return Semanticdb.BinaryOperator.SHIFT_LEFT; - case RIGHT_SHIFT: - return Semanticdb.BinaryOperator.SHIFT_RIGHT; - case UNSIGNED_RIGHT_SHIFT: - return Semanticdb.BinaryOperator.SHIFT_RIGHT_UNSIGNED; - case EQUAL_TO: - return Semanticdb.BinaryOperator.EQUAL_TO; - case NOT_EQUAL_TO: - return Semanticdb.BinaryOperator.NOT_EQUAL_TO; - case LESS_THAN_EQUAL: - return Semanticdb.BinaryOperator.LESS_THAN_EQUAL; - case GREATER_THAN_EQUAL: - return Semanticdb.BinaryOperator.GREATER_THAN_EQUAL; - case CONDITIONAL_AND: - return Semanticdb.BinaryOperator.CONDITIONAL_AND; - case CONDITIONAL_OR: - return Semanticdb.BinaryOperator.CONDITIONAL_OR; - case AND: - return Semanticdb.BinaryOperator.AND; - case OR: - return Semanticdb.BinaryOperator.OR; - case XOR: - return Semanticdb.BinaryOperator.XOR; - default: - throw new IllegalStateException( - semanticdbUri + ": unexpected binary expression operator kind " + kind); - } - } - - private Semanticdb.UnaryOperator semanticdbUnaryOperator(Tree.Kind kind) { - switch (kind) { - case UNARY_MINUS: - return Semanticdb.UnaryOperator.UNARY_MINUS; - - case UNARY_PLUS: - return Semanticdb.UnaryOperator.UNARY_PLUS; - - case POSTFIX_INCREMENT: - return Semanticdb.UnaryOperator.UNARY_POSTFIX_INCREMENT; - - case POSTFIX_DECREMENT: - return Semanticdb.UnaryOperator.UNARY_POSTFIX_DECREMENT; - - case PREFIX_INCREMENT: - return Semanticdb.UnaryOperator.UNARY_PREFIX_INCREMENT; - - case PREFIX_DECREMENT: - return Semanticdb.UnaryOperator.UNARY_PREFIX_DECREMENT; - - case BITWISE_COMPLEMENT: - return Semanticdb.UnaryOperator.UNARY_BITWISE_COMPLEMENT; - - case LOGICAL_COMPLEMENT: - return Semanticdb.UnaryOperator.UNARY_LOGICAL_COMPLEMENT; - - default: - throw new IllegalStateException( - semanticdbUri + ": unexpected unary expression operator kind " + kind); - } - } -} diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTypeVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTypeVisitor.java deleted file mode 100644 index 0733dbbfd..000000000 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbTypeVisitor.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.sourcegraph.semanticdb_javac; - -import javax.lang.model.element.Element; -import javax.lang.model.util.SimpleTypeVisitor8; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.type.ArrayType; -import javax.lang.model.type.WildcardType; -import javax.lang.model.type.TypeVariable; -import javax.lang.model.type.IntersectionType; -import javax.lang.model.type.PrimitiveType; -import javax.lang.model.type.TypeKind; -import javax.lang.model.type.NoType; -import javax.lang.model.util.Types; -import java.util.ArrayList; - -import static com.sourcegraph.semanticdb_javac.SemanticdbBuilders.*; - -/** A TypeMirror tree visitor that constructs a recursive SemanticDB Type structure. */ -class SemanticdbTypeVisitor extends SimpleTypeVisitor8 { - static final Semanticdb.Type UNRESOLVED_TYPE_REF = typeRef("unresolved_type#"); - - static final String ARRAY_SYMBOL = "scala/Array#"; - - private final GlobalSymbolsCache cache; - private final LocalSymbolsCache locals; - private final Types types; - - SemanticdbTypeVisitor(GlobalSymbolsCache cache, LocalSymbolsCache locals, Types types) { - this.cache = cache; - this.locals = locals; - this.types = types; - } - - public Semanticdb.Type semanticdbType(TypeMirror tpe) { - Semanticdb.Type result = super.visit(tpe); - return result == null ? UNRESOLVED_TYPE_REF : result; - } - - @Override - public Semanticdb.Type visitDeclared(DeclaredType t, Void unused) { - boolean isExistential = - t.getTypeArguments().stream().anyMatch((type) -> type instanceof WildcardType); - - ArrayList typeParams = new ArrayList<>(); - Semanticdb.Scope.Builder declarations = Semanticdb.Scope.newBuilder(); - for (TypeMirror type : t.getTypeArguments()) { - typeParams.add(semanticdbType(type)); - - if (type instanceof WildcardType) { - Semanticdb.TypeSignature.Builder typeSig = Semanticdb.TypeSignature.newBuilder(); - WildcardType wildcardType = (WildcardType) type; - - // semanticdb spec asks for List() not None for type_parameters field - typeSig.setTypeParameters(Semanticdb.Scope.newBuilder()); - - if (wildcardType.getExtendsBound() != null) { - typeSig.setUpperBound(super.visit(wildcardType.getExtendsBound())); - } else if (wildcardType.getSuperBound() != null) { - typeSig.setLowerBound(super.visit(wildcardType.getSuperBound())); - } - - declarations.addHardlinks( - Semanticdb.SymbolInformation.newBuilder() - .setSymbol("local_wildcard") - .setSignature(Semanticdb.Signature.newBuilder().setTypeSignature(typeSig))); - } else { - Element element = types.asElement(type); - declarations.addSymlinks(cache.semanticdbSymbol(element, locals)); - } - } - - if (!isExistential) { - return typeRef(cache.semanticdbSymbol(t.asElement(), locals), typeParams); - } else { - return existentialType( - typeRef(cache.semanticdbSymbol(t.asElement(), locals), typeParams), declarations.build()); - } - } - - @Override - public Semanticdb.Type visitArray(ArrayType t, Void unused) { - ArrayList types = new ArrayList(); - types.add(semanticdbType(t.getComponentType())); - return typeRef(ARRAY_SYMBOL, types); - } - - @Override - public Semanticdb.Type visitPrimitive(PrimitiveType t, Void unused) { - return typeRef(primitiveSymbol(t.getKind())); - } - - @Override - public Semanticdb.Type visitTypeVariable(TypeVariable t, Void unused) { - return typeRef(cache.semanticdbSymbol(t.asElement(), locals)); - } - - @Override - public Semanticdb.Type visitIntersection(IntersectionType t, Void unused) { - ArrayList types = new ArrayList<>(); - for (TypeMirror type : t.getBounds()) { - types.add(super.visit(type)); - } - - return intersectionType(types); - } - - @Override - public Semanticdb.Type visitWildcard(WildcardType t, Void unused) { - // https://github.com/scalameta/scalameta/issues/1703 - // https://sourcegraph.com/github.com/scalameta/scalameta/-/blob/semanticdb/metacp/src/main/scala/scala/meta/internal/javacp/Javacp.scala#L452:19 - return typeRef("local_wildcard"); - } - - @Override - public Semanticdb.Type visitNoType(NoType t, Void unused) { - return typeRef(primitiveSymbol(t.getKind())); - } - - public String primitiveSymbol(TypeKind kind) { - switch (kind) { - case BOOLEAN: - return "scala/Boolean#"; - case BYTE: - return "scala/Byte#"; - case SHORT: - return "scala/Short#"; - case INT: - return "scala/Int#"; - case LONG: - return "scala/Long#"; - case CHAR: - return "scala/Char#"; - case FLOAT: - return "scala/Float#"; - case DOUBLE: - return "scala/Double#"; - case VOID: - return "scala/Unit#"; - default: - throw new IllegalArgumentException("got " + kind.name()); - } - } -} 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 deleted file mode 100644 index 3a24aa885..000000000 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java +++ /dev/null @@ -1,701 +0,0 @@ -package com.sourcegraph.semanticdb_javac; - -import com.sun.source.util.SourcePositions; -import com.sun.source.util.Trees; -import com.sun.source.util.TreePathScanner; -import com.sun.source.util.TreePath; -import com.sun.source.tree.CompilationUnitTree; -import com.sun.source.tree.MemberReferenceTree; -import com.sun.source.tree.IdentifierTree; -import com.sun.source.tree.VariableTree; -import com.sun.source.tree.ClassTree; -import com.sun.source.tree.Tree; -import com.sun.source.tree.MethodTree; -import com.sun.source.tree.LineMap; -import com.sun.source.tree.ExpressionTree; -import com.sun.source.tree.NewClassTree; -import com.sun.source.tree.MemberSelectTree; -import com.sun.source.tree.PackageTree; -import com.sun.source.tree.TypeCastTree; -import com.sun.source.tree.TypeParameterTree; -import com.sun.source.tree.ParameterizedTypeTree; -import com.sun.source.tree.AnnotatedTypeTree; - -import javax.tools.Diagnostic; -import javax.lang.model.element.Element; -import javax.lang.model.element.Modifier; -import javax.lang.model.element.Name; -import javax.lang.model.element.ElementKind; -import javax.lang.model.element.TypeElement; -import javax.lang.model.element.ExecutableElement; -import javax.lang.model.type.NoType; -import javax.lang.model.type.TypeMirror; -import javax.lang.model.type.DeclaredType; -import javax.lang.model.util.Types; -import javax.lang.model.util.Elements; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Kind; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolInformation.Property; -import com.sourcegraph.semanticdb_javac.Semanticdb.SymbolOccurrence.Role; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.List; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.HashSet; -import java.util.Set; -import java.util.Objects; -import java.util.Optional; -import java.util.Iterator; -import java.security.NoSuchAlgorithmException; -import java.util.stream.Collectors; - -import static com.sourcegraph.semanticdb_javac.SemanticdbBuilders.*; - -/** Walks the AST of a typechecked compilation unit and generates a SemanticDB TextDocument. */ -public class SemanticdbVisitor extends TreePathScanner { - - private final GlobalSymbolsCache globals; - private final LocalSymbolsCache locals; - private final Types types; - private final Trees trees; - private final CompilationUnitTree compUnitTree; - private final Elements elements; - private final SemanticdbJavacOptions options; - private final ArrayList occurrences; - private final ArrayList symbolInfos; - private String source; - private String uri; - - private final LinkedHashMap nodes; - - public SemanticdbVisitor( - GlobalSymbolsCache globals, - CompilationUnitTree compUnitTree, - SemanticdbJavacOptions options, - Types types, - Trees trees, - Elements elements) { - this.globals = globals; // Reused cache between compilation units. - this.locals = new LocalSymbolsCache(); // Fresh cache per compilation unit. - this.options = options; - this.types = types; - this.elements = elements; - this.trees = trees; - this.compUnitTree = compUnitTree; - this.occurrences = new ArrayList<>(); - this.symbolInfos = new ArrayList<>(); - this.source = semanticdbText(); - this.uri = semanticdbUri(compUnitTree, options); - this.nodes = new LinkedHashMap<>(); - } - - public Semanticdb.TextDocument buildTextDocument(CompilationUnitTree tree) { - this.scan(tree, null); // Trigger recursive AST traversal to collect SemanticDB information. - - resolveNodes(); - - return Semanticdb.TextDocument.newBuilder() - .setSchema(Semanticdb.Schema.SEMANTICDB4) - .setLanguage(Semanticdb.Language.JAVA) - .setUri(uri) - .setText(options.includeText ? this.source : "") - .setMd5(semanticdbMd5()) - .addAllOccurrences(occurrences) - .addAllSymbols(symbolInfos) - .build(); - } - - private Optional emitSymbolOccurrence( - Element sym, Tree tree, Name name, Role role, CompilerRange kind) { - if (sym == null || name == null) return Optional.empty(); - Optional range = semanticdbRange(tree, kind, sym, name.toString()); - if (role == Role.DEFINITION) { - emitSymbolOccurrence(sym, range, role, computeEnclosingRange(tree)); - // Only emit SymbolInformation for symbols that are defined in this compilation unit. - emitSymbolInformation(sym, tree); - return range; - } - emitSymbolOccurrence(sym, range, role, Optional.empty()); - return range; - } - - private void emitSymbolOccurrence( - Element sym, - Optional range, - Role role, - Optional enclosingRange) { - if (sym == null) return; - Optional occ = - semanticdbOccurrence(sym, range, role, enclosingRange); - occ.ifPresent(occurrences::add); - } - - private void emitSymbolInformation(Element sym, Tree tree) { - String symbol = semanticdbSymbol(sym); - Semanticdb.SymbolInformation.Builder builder = symbolInformation(symbol); - Semanticdb.Documentation documentation = semanticdbDocumentation(tree); - if (documentation != null) builder.setDocumentation(documentation); - Semanticdb.Signature signature = semanticdbSignature(sym); - if (signature != null) builder.setSignature(signature); - if (SemanticdbSymbols.isLocal(symbol)) { - String enclosingSymbol = semanticdbSymbol(sym.getEnclosingElement()); - if (enclosingSymbol != null) builder.setEnclosingSymbol(enclosingSymbol); - } - - List annotations = - new SemanticdbTrees(globals, locals, uri, types, trees, nodes).annotations(tree); - if (annotations != null) builder.addAllAnnotations(annotations); - - builder - .setProperties(semanticdbSymbolInfoProperties(sym)) - .setDisplayName(sym.getSimpleName().toString()) - .setAccess(semanticdbAccess(sym)); - - switch (sym.getKind()) { - case ENUM: - case CLASS: - builder.setKind(Kind.CLASS); - builder.addAllOverriddenSymbols(semanticdbParentSymbols((TypeElement) sym)); - break; - case INTERFACE: - case ANNOTATION_TYPE: - builder.setKind(Kind.INTERFACE); - builder.addAllOverriddenSymbols(semanticdbParentSymbols((TypeElement) sym)); - break; - case FIELD: - builder.setKind(Kind.FIELD); - break; - case METHOD: - builder.setKind(Kind.METHOD); - builder.addAllOverriddenSymbols( - semanticdbOverrides( - (ExecutableElement) sym, sym.getEnclosingElement(), new HashSet<>())); - break; - case CONSTRUCTOR: - builder.setKind(Kind.CONSTRUCTOR); - break; - case TYPE_PARAMETER: - builder.setKind(Kind.TYPE_PARAMETER); - break; - case ENUM_CONSTANT: // overwrite previous value here - String args = - ((NewClassTree) ((VariableTree) tree).getInitializer()) - .getArguments().stream() - .map(ExpressionTree::toString) - .collect(Collectors.joining(", ")); - if (!args.isEmpty()) - builder.setDisplayName(sym.getSimpleName().toString() + "(" + args + ")"); - break; - case LOCAL_VARIABLE: - builder.setKind(Kind.LOCAL); - break; - } - - Semanticdb.SymbolInformation info = builder.build(); - - symbolInfos.add(info); - } - - void resolveNodes() { - // ignore parts of NewClassTree. It would cause references to classes in addition to references - // to constructors. In these cases, the references to classes aren't wanted - HashSet ignoreNodes = new HashSet<>(); - for (Tree node : nodes.keySet()) - if (node instanceof NewClassTree) { - NewClassTree newClassTree = (NewClassTree) node; - if (newClassTree.getClassBody() == null) { - if (newClassTree.getIdentifier() instanceof ParameterizedTypeTree) { - ParameterizedTypeTree paramNode = (ParameterizedTypeTree) newClassTree.getIdentifier(); - ignoreNodes.add(paramNode.getType()); - } - ignoreNodes.add(newClassTree.getIdentifier()); - } - } - - for (Map.Entry entry : nodes.entrySet()) { - Tree node = entry.getKey(); - if (!ignoreNodes.contains(node)) { - if (node instanceof TypeParameterTree) { - resolveTypeParameterTree((TypeParameterTree) node, entry.getValue()); - } else if (node instanceof ClassTree) { - resolveClassTree((ClassTree) node, entry.getValue()); - } else if (node instanceof MethodTree) { - resolveMethodTree((MethodTree) node, entry.getValue()); - } else if (node instanceof VariableTree) { - resolveVariableTree((VariableTree) node, entry.getValue()); - } else if (node instanceof IdentifierTree) { - resolveIdentifierTree((IdentifierTree) node, entry.getValue()); - } else if (node instanceof MemberReferenceTree) { - resolveMemberReferenceTree((MemberReferenceTree) node, entry.getValue()); - } else if (node instanceof MemberSelectTree) { - resolveMemberSelectTree((MemberSelectTree) node, entry.getValue()); - } else if (node instanceof NewClassTree) { - resolveNewClassTree((NewClassTree) node, entry.getValue()); - } - } - } - } - - // ======================================= - // Overridden methods from TreePathScanner - // ======================================= - @Override - public Void scan(Tree tree, Void unused) { - if (tree != null) { - TreePath path = new TreePath(getCurrentPath(), tree); - nodes.put(tree, path); - } - return super.scan(tree, unused); - } - - @Override - public Void visitPackage(PackageTree node, Void unused) { - // Stop traversal at the package declaration. JDK 17+ TreePathScanner - // recurses into the package name's identifiers and would emit a - // self-reference for `package X.Y;`; JDK 11 does not. Skipping the - // whole package subtree keeps semanticdb output stable across JDKs and - // matches the long-standing JDK 8/11 behavior of not emitting a - // reference for the package declaration itself. - return null; - } - - private boolean isAnonymous(Element sym) { - return sym.getSimpleName().length() == 0; - } - - public static B bar(A paramA, B paramB) { - return paramB; - } - - private void resolveClassTree(ClassTree node, TreePath treePath) { - Element sym = trees.getElement(treePath); - if (sym != null && sym.getSimpleName().length() > 0) { - emitSymbolOccurrence( - sym, - node, - sym.getSimpleName(), - Role.DEFINITION, - CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); - } - } - - private void resolveTypeParameterTree(TypeParameterTree node, TreePath treePath) { - Element sym = trees.getElement(treePath); - if (sym != null && sym.getSimpleName().length() > 0) { - emitSymbolOccurrence( - sym, node, sym.getSimpleName(), Role.DEFINITION, CompilerRange.FROM_POINT_TO_SYMBOL_NAME); - } - } - - private void resolveMethodTree(MethodTree node, TreePath treePath) { - Element sym = trees.getElement(treePath); - if (sym != null) { - Element enclosingElement = sym.getEnclosingElement(); - if (sym.getKind() != ElementKind.CONSTRUCTOR || !isAnonymous(enclosingElement)) { - Name name; - if (sym.getKind() == ElementKind.CONSTRUCTOR) name = enclosingElement.getSimpleName(); - else name = sym.getSimpleName(); - - emitSymbolOccurrence( - sym, node, name, Role.DEFINITION, CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); - } - } - } - - private void resolveVariableTree(VariableTree node, TreePath treePath) { - Element sym = trees.getElement(treePath); - if (sym != null) { - Optional range = - emitSymbolOccurrence( - sym, - node, - sym.getSimpleName(), - Role.DEFINITION, - CompilerRange.FROM_POINT_WITH_TEXT_SEARCH); - if (sym.getKind() == ElementKind.ENUM_CONSTANT) { - TreePath typeTreePath = nodes.get(node.getInitializer()); - Element typeSym = trees.getElement(typeTreePath); - if (typeSym != null) emitSymbolOccurrence(typeSym, range, Role.REFERENCE, Optional.empty()); - } - } - } - - private void resolveIdentifierTree(IdentifierTree node, TreePath treePath) { - Name nodeName = node.getName(); - if (nodeName != null) { - Element sym = trees.getElement(treePath); - if (sym != null) { - boolean isThis = nodeName.toString().equals("this"); - boolean isSuper = !isThis && nodeName.toString().equals("super"); - // exclude `this.` references but include `this(` and `super(` references - if (((sym.getKind() == ElementKind.CONSTRUCTOR) == isThis) || (isSuper)) { - TreePath parentPath = treePath.getParentPath(); - Element parentSym = trees.getElement(parentPath); - if (parentSym == null || parentSym.getKind() != null) { - emitSymbolOccurrence( - sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_START_TO_END); - } - } - } - } - } - - private void resolveMemberReferenceTree(MemberReferenceTree node, TreePath treePath) { - Element sym = trees.getElement(treePath); - if (sym != null) { - emitSymbolOccurrence( - sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_END_TO_SYMBOL_NAME); - } - } - - private void resolveMemberSelectTree(MemberSelectTree node, TreePath treePath) { - Element sym = trees.getElement(treePath); - if (sym != null) { - emitSymbolOccurrence( - sym, node, sym.getSimpleName(), Role.REFERENCE, CompilerRange.FROM_END_TO_SYMBOL_NAME); - } - } - - private void resolveNewClassTree(NewClassTree node, TreePath treePath) { - // ignore anonymous classes - otherwise there will be a local reference to itself - if (node.getIdentifier() != null && node.getClassBody() == null) { - Element sym = trees.getElement(treePath); - if (sym != null) { - TreePath parentPath = treePath.getParentPath(); - Element parentSym = trees.getElement(parentPath); - - if (parentSym == null || parentSym.getKind() != ElementKind.ENUM_CONSTANT) { - TreePath identifierTreePath = nodes.get(node.getIdentifier()); - Element identifierSym = trees.getElement(identifierTreePath); - // Simplest case, e.g. `new String()` - if (identifierSym != null) { - emitSymbolOccurrence( - sym, - node, - identifierSym.getSimpleName(), - Role.REFERENCE, - CompilerRange.FROM_TEXT_SEARCH); - } - // More complex case, where the type is annotated: `new @TypeParameters String()` - else if (node.getIdentifier().getKind() == Tree.Kind.ANNOTATED_TYPE) { - AnnotatedTypeTree annotatedTypeTree = (AnnotatedTypeTree) node.getIdentifier(); - if (annotatedTypeTree.getUnderlyingType() != null - && annotatedTypeTree.getUnderlyingType().getKind() == Tree.Kind.IDENTIFIER) { - IdentifierTree ident = (IdentifierTree) annotatedTypeTree.getUnderlyingType(); - emitSymbolOccurrence( - sym, ident, ident.getName(), Role.REFERENCE, CompilerRange.FROM_TEXT_SEARCH); - } - } - } - } - } - } - - // ================================================= - // Utilities to generate SemanticDB data structures. - // ================================================= - - private Semanticdb.Signature semanticdbSignature(Element sym) { - - return new SemanticdbSignatures(globals, locals, types).generateSignature(sym); - } - - private String semanticdbSymbol(Element sym) { - return globals.semanticdbSymbol(sym, locals); - } - - private Optional semanticdbRange( - Tree tree, CompilerRange kind, Element sym, String name) { - if (sym == null) return Optional.empty(); - - SourcePositions sourcePositions = trees.getSourcePositions(); - int start = (int) sourcePositions.getStartPosition(compUnitTree, tree); - int end = (int) sourcePositions.getEndPosition(compUnitTree, tree); - if (kind.isPlusOne()) start++; - - if (name != null) { - if (kind.isFromTextSearch() && name.length() > 0) { - Optional startEndRange = - RangeFinder.findRange(sym, name, start, end, this.source, kind.isFromEnd()); - if (startEndRange.isPresent()) { - start = startEndRange.get().start; - end = startEndRange.get().end; - } - } else if (kind.isFromPoint()) { - if (start != Diagnostic.NOPOS) { - // text may not exist or may be out of bounds (e.g. generated source like Lombok) - int testEnd = start + name.length(); - if (source.length() > testEnd && source.substring(start, testEnd).equals(name)) - end = testEnd; - } - } else if (kind.isFromEndPoint()) { - if (end != Diagnostic.NOPOS) { - // text may not exist or may be out of bounds (e.g. generated source like Lombok) - int testStart = end - name.length(); - if (testStart >= 0 - && source.length() > end - && source.substring(testStart, end).equals(name)) start = testStart; - } - } - } - - if (start != Diagnostic.NOPOS && end != Diagnostic.NOPOS && end > start) { - LineMap lineMap = compUnitTree.getLineMap(); - Semanticdb.Range range = - Semanticdb.Range.newBuilder() - .setStartLine((int) lineMap.getLineNumber(start) - 1) - .setStartCharacter((int) lineMap.getColumnNumber(start) - 1) - .setEndLine((int) lineMap.getLineNumber(end) - 1) - .setEndCharacter((int) lineMap.getColumnNumber(end) - 1) - .build(); - - range = correctForTabs(range, lineMap, start); - - return Optional.of(range); - } - return Optional.empty(); - } - - private Semanticdb.Range correctForTabs(Semanticdb.Range range, LineMap lineMap, int start) { - int startLinePos = (int) lineMap.getPosition(lineMap.getLineNumber(start), 0); - - // javac replaces every tab with 8 spaces in the linemap. As this is potentially inconsistent - // with the source file itself, we adjust for that here if the line is actually indented with - // tabs. - // As for every tab there are 8 spaces, we remove 7 spaces for every tab to get the correct - // char offset (note: different to _column_ offset your editor shows) - if (this.source.charAt(startLinePos) == '\t') { - int count = 1; - while (this.source.charAt(++startLinePos) == '\t') count++; - range = - range - .toBuilder() - .setStartCharacter(range.getStartCharacter() - (count * 7)) - .setEndCharacter(range.getEndCharacter() - (count * 7)) - .build(); - } - - return range; - } - - private Optional semanticdbOccurrence( - Element sym, - Optional range, - Role role, - Optional enclosingRange) { - if (range.isPresent()) { - String ssym = semanticdbSymbol(sym); - if (!ssym.equals(SemanticdbSymbols.NONE)) { - Semanticdb.SymbolOccurrence occ = symbolOccurrence(ssym, range.get(), role, enclosingRange); - return Optional.of(occ); - } else { - return Optional.empty(); - } - } else { - return Optional.empty(); - } - } - - /** - * Computes the enclosing range for the given tree node. Returns the range of the nearest - * non-trivial enclosing AST node. For definition occurrences, this includes the entire definition - * including documentation. For reference occurrences, this includes the parent expression bounds. - */ - private Optional computeEnclosingRange(Tree tree) { - if (tree == null) return Optional.empty(); - - TreePath path = nodes.get(tree); - if (path == null) return Optional.empty(); - - // For method, class, and variable definitions, use the tree itself as the enclosing range - // since we're processing the definition node - Tree enclosingTree = tree; - if (!(tree instanceof MethodTree - || tree instanceof ClassTree - || tree instanceof VariableTree)) { - // For non-definition nodes (like references), use the parent - TreePath parentPath = path.getParentPath(); - if (parentPath == null) return Optional.empty(); - enclosingTree = parentPath.getLeaf(); - if (enclosingTree == null || enclosingTree == compUnitTree) return Optional.empty(); - } - - SourcePositions sourcePositions = trees.getSourcePositions(); - int start = (int) sourcePositions.getStartPosition(compUnitTree, enclosingTree); - int end = (int) sourcePositions.getEndPosition(compUnitTree, enclosingTree); - - if (start != Diagnostic.NOPOS && end != Diagnostic.NOPOS && end > start) { - LineMap lineMap = compUnitTree.getLineMap(); - Semanticdb.Range range = - Semanticdb.Range.newBuilder() - .setStartLine((int) lineMap.getLineNumber(start) - 1) - .setStartCharacter((int) lineMap.getColumnNumber(start) - 1) - .setEndLine((int) lineMap.getLineNumber(end) - 1) - .setEndCharacter((int) lineMap.getColumnNumber(end) - 1) - .build(); - - range = correctForTabs(range, lineMap, start); - - return Optional.of(range); - } - - return Optional.empty(); - } - - private String semanticdbText() { - if (source != null) return source; - try { - source = compUnitTree.getSourceFile().getCharContent(true).toString(); - } catch (IOException e) { - source = ""; - } - return source; - } - - private String semanticdbMd5() { - try { - return MD5.digest(compUnitTree.getSourceFile().getCharContent(true).toString()); - } catch (IOException | NoSuchAlgorithmException e) { - return ""; - } - } - - private int semanticdbSymbolInfoProperties(Element sym) { - int properties = 0; - properties |= - sym.getKind() == ElementKind.ENUM || sym.getKind() == ElementKind.ENUM_CONSTANT - ? Property.ENUM_VALUE - : 0; - for (Modifier modifier : sym.getModifiers()) { - if (modifier == Modifier.STATIC) properties |= Property.STATIC_VALUE; - else if (modifier == Modifier.DEFAULT) properties |= Property.DEFAULT_VALUE; - else if (modifier == Modifier.FINAL) properties |= Property.FINAL_VALUE; - else if (modifier == Modifier.ABSTRACT) properties |= Property.ABSTRACT_VALUE; - } - // for default interface methods, Modifier.ABSTRACT is also set... - if (((properties & Property.ABSTRACT_VALUE) > 0) && ((properties & Property.DEFAULT_VALUE) > 0)) - properties ^= Property.ABSTRACT_VALUE; - return properties; - } - - private List semanticdbParentSymbols(TypeElement typeElement) { - ArrayList parentSymbols = new ArrayList<>(); - Set parentElements = semanticdbParentTypeElements(typeElement, new HashSet<>()); - for (TypeElement parentElement : parentElements) { - String ssym = semanticdbSymbol(parentElement); - if (!Objects.equals(ssym, SemanticdbSymbols.NONE)) { - parentSymbols.add(ssym); - } - } - return parentSymbols; - } - - private Set semanticdbParentTypeElements( - TypeElement typeElement, Set result) { - TypeMirror superType = typeElement.getSuperclass(); - semanticdbParentSymbol(superType, result); - for (TypeMirror interfaceType : typeElement.getInterfaces()) { - semanticdbParentSymbol(interfaceType, result); - } - - return result; - } - - private void semanticdbParentSymbol(TypeMirror elementType, Set result) { - if (!(elementType instanceof NoType)) { - Element superElement = types.asElement(elementType); - if (superElement != null && superElement instanceof TypeElement) { - result.add((TypeElement) superElement); - semanticdbParentTypeElements((TypeElement) superElement, result); - } - } - } - - private Set semanticdbOverrides( - ExecutableElement sym, Element enclosingElement, HashSet overriddenSymbols) { - if (enclosingElement instanceof TypeElement) { - List superTypes = types.directSupertypes(enclosingElement.asType()); - // iterate through all super types - for (TypeMirror superType : superTypes) { - if (superType instanceof DeclaredType) { - Element superElement = ((DeclaredType) superType).asElement(); - // find all elements of super class - if (superElement instanceof TypeElement) { - boolean methodFound = false; - List enclosedElements = - ((TypeElement) superElement).getEnclosedElements(); - for (Element enclosedElement : enclosedElements) { - // check the element is a method - if (enclosedElement instanceof ExecutableElement) { - ExecutableElement enclosedExecutableElement = (ExecutableElement) enclosedElement; - // check the method overrides the original method - if (elements.overrides( - sym, enclosedExecutableElement, (TypeElement) sym.getEnclosingElement())) { - String symbol = semanticdbSymbol(enclosedExecutableElement); - overriddenSymbols.add(symbol); - methodFound = true; - semanticdbOverrides(enclosedExecutableElement, superElement, overriddenSymbols); - } - } - } - if (!methodFound) { - semanticdbOverrides(sym, superElement, overriddenSymbols); - } - } - } - } - } - return overriddenSymbols; - } - - private Semanticdb.Access semanticdbAccess(Element sym) { - for (Modifier modifier : sym.getModifiers()) { - if (modifier == Modifier.PRIVATE) return privateAccess(); - if (modifier == Modifier.PUBLIC) return publicAccess(); - if (modifier == Modifier.PROTECTED) return protectedAccess(); - } - return privateWithinAccess(semanticdbSymbol(sym.getEnclosingElement())); - } - - private static String semanticdbUri( - CompilationUnitTree compUnitTree, SemanticdbJavacOptions options) { - Path absolutePath = - SemanticdbTaskListener.absolutePathFromUri(options, compUnitTree.getSourceFile()); - Path uriPath = - absolutePath.startsWith(options.sourceroot) - ? options.sourceroot.relativize(absolutePath) - : absolutePath; - StringBuilder out = new StringBuilder(); - Iterator it = uriPath.iterator(); - if (it.hasNext()) out.append(it.next().getFileName().toString()); - while (it.hasNext()) { - Path part = it.next(); - out.append('/').append(part.getFileName().toString()); - } - return out.toString(); - } - - private Semanticdb.Documentation semanticdbDocumentation(Tree tree) { - try { - TreePath treePath = nodes.get(tree); - String doc = trees.getDocComment(treePath); - if (doc == null) return null; - - return Semanticdb.Documentation.newBuilder() - .setFormat(Semanticdb.Documentation.Format.JAVADOC) - .setMessage(doc) - .build(); - } catch (NullPointerException e) { - // Can happen in `getDocComment()` - // Caused by: java.lang.NullPointerException - // at com.sun.tools.javac.model.JavacElements.cast(JavacElements.java:605) - // at com.sun.tools.javac.model.JavacElements.getTreeAndTopLevel(JavacElements.java:543) - // at com.sun.tools.javac.model.JavacElements.getDocComment(JavacElements.java:321) - // at - // com.sourcegraph.semanticdb_javac.SemanticdbVisitor.semanticdbDocumentation(SemanticdbVisitor.java:233) - return null; - } - } -} diff --git a/tests/buildTools/src/test/scala/tests/BaseBuildToolSuite.scala b/tests/buildTools/src/test/scala/tests/BaseBuildToolSuite.scala index 45b12f5fd..f50f602a3 100644 --- a/tests/buildTools/src/test/scala/tests/BaseBuildToolSuite.scala +++ b/tests/buildTools/src/test/scala/tests/BaseBuildToolSuite.scala @@ -54,9 +54,12 @@ abstract class BaseBuildToolSuite extends MopedSuite(ScipJava.app) { } } - private val semanticdbPattern = FileSystems + // Matches per-source SCIP shards produced by the Java/Kotlin compiler plug-ins. The + // historical parameter names still say "Semanticdb" for backwards compatibility with the + // callers; renaming them is deferred to a follow-up rename PR. + private val scipShardPattern = FileSystems .getDefault - .getPathMatcher("glob:**.semanticdb") + .getPathMatcher("glob:**/META-INF/scip/**.scip") def checkBuild( options: TestOptions, @@ -123,17 +126,17 @@ abstract class BaseBuildToolSuite extends MopedSuite(ScipJava.app) { case None => assertEquals(exit, 0, clues(app.capturedOutput)) } - val semanticdbFiles = + val scipShards = if (!Files.isDirectory(targetroot)) Nil else FileIO .listAllFilesRecursively(AbsolutePath(targetroot)) - .filter(p => semanticdbPattern.matches(p.toNIO)) - if (semanticdbFiles.length != expectedSemanticdbFiles) { + .filter(p => scipShardPattern.matches(p.toNIO)) + if (scipShards.length != expectedSemanticdbFiles) { fail( - s"Expected $expectedSemanticdbFiles SemanticDB file(s) to be generated.", - clues(semanticdbFiles, app.capturedOutput) + s"Expected $expectedSemanticdbFiles SCIP shard file(s) to be generated.", + clues(scipShards, app.capturedOutput) ) } if (expectedPackages.nonEmpty) { diff --git a/tests/snapshots/src/main/scala/tests/SemanticdbFile.scala b/tests/snapshots/src/main/scala/tests/SemanticdbFile.scala deleted file mode 100644 index 0ba4dbd9a..000000000 --- a/tests/snapshots/src/main/scala/tests/SemanticdbFile.scala +++ /dev/null @@ -1,49 +0,0 @@ -package tests - -import java.nio.file.Files - -import scala.meta.internal.io.FileIO -import scala.meta.io.AbsolutePath -import scala.meta.io.RelativePath - -import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocument -import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocuments - -case class SemanticdbFile( - sourceroot: AbsolutePath, - relativePath: RelativePath, - sourceDirectory: AbsolutePath, - targetroot: AbsolutePath -) { - def javaPath: AbsolutePath = sourceroot.resolve(relativePath) - def semanticdbPath: AbsolutePath = targetroot - .resolve("META-INF") - .resolve("semanticdb") - .resolve(relativePath.toString() + ".semanticdb") - def textDocument: TextDocument = { - val docs = TextDocuments.parseFrom(Files.readAllBytes(semanticdbPath.toNIO)) - if (docs.getDocumentsCount == 0) - TextDocument.newBuilder().build() - else - docs.getDocuments(0) - } -} - -object SemanticdbFile { - def fromDirectory( - sourceDirectory: AbsolutePath, - sourceroot: AbsolutePath, - targetroot: AbsolutePath - ): Seq[SemanticdbFile] = { - FileIO - .listAllFilesRecursively(sourceDirectory) - .map { file => - SemanticdbFile( - sourceroot, - file.toRelative(sourceroot), - sourceDirectory, - targetroot - ) - } - } -} diff --git a/tests/unit/src/main/scala/tests/CompileResult.scala b/tests/unit/src/main/scala/tests/CompileResult.scala index 5c582337f..000b20a28 100644 --- a/tests/unit/src/main/scala/tests/CompileResult.scala +++ b/tests/unit/src/main/scala/tests/CompileResult.scala @@ -1,28 +1,22 @@ package tests -import com.sourcegraph.semanticdb_javac.Semanticdb +import scala.jdk.CollectionConverters._ + +import com.sourcegraph.Scip case class CompileResult( byteCode: Array[Byte], stdout: String, - textDocuments: Semanticdb.TextDocuments, + documents: List[Scip.Document], isSuccess: Boolean ) { - def textDocument: Option[Semanticdb.TextDocument] = { - Option.when(textDocuments.getDocumentsCount() > 0) { - textDocuments.getDocuments(0) - } - } + def document: Option[Scip.Document] = documents.headOption def merge(other: CompileResult): CompileResult = { copy( byteCode = this.byteCode ++ other.byteCode, stdout = this.stdout ++ other.stdout, - textDocuments = this - .textDocuments - .toBuilder - .addAllDocuments(other.textDocuments.getDocumentsList) - .build(), + documents = this.documents ++ other.documents, isSuccess = this.isSuccess && other.isSuccess ) } @@ -32,7 +26,15 @@ object CompileResult { val empty: CompileResult = CompileResult( Array.emptyByteArray, "", - Semanticdb.TextDocuments.getDefaultInstance, + Nil, isSuccess = true ) + + /** + * Parses a `*.scip` shard from disk and returns its documents. Shards always + * have a single document per source file, but we expose the list to keep the + * call sites uniform when callers compile multiple inputs. + */ + def documentsFromShard(bytes: Array[Byte]): List[Scip.Document] = + Scip.Index.parseFrom(bytes).getDocumentsList.asScala.toList } diff --git a/tests/unit/src/main/scala/tests/TestCompiler.scala b/tests/unit/src/main/scala/tests/TestCompiler.scala index 37c4e86b6..58d60ac80 100644 --- a/tests/unit/src/main/scala/tests/TestCompiler.scala +++ b/tests/unit/src/main/scala/tests/TestCompiler.scala @@ -13,8 +13,6 @@ import scala.meta.Input import scala.meta.internal.io.FileIO import scala.meta.io.AbsolutePath -import com.sourcegraph.semanticdb_javac.Semanticdb - object TestCompiler { val PROCESSOR_PATH = System.getProperty("java.class.path") } @@ -23,7 +21,7 @@ class TestCompiler( val classpath: String, val javacOptions: List[String], val targetroot: Path, - val sourceroot: Path = Files.createTempDirectory("semanticdb-javac") + val sourceroot: Path = Files.createTempDirectory("scip-javac") ) { private val compiler = ToolProvider.getSystemJavaCompiler @@ -37,10 +35,19 @@ class TestCompiler( this(TestCompiler.PROCESSOR_PATH, Nil, targetroot) } + /** + * Compiles every `*.java` file under [[dir]] with the SCIP shard plugin attached + * to javac. The resulting shards are read back from disk and exposed through + * [[CompileResult.documents]]. + */ def compileSemanticdbDirectory(dir: Path): CompileResult = { compileSemanticdb(inputsFromDirectory(dir)) } + /** + * Compiles the given inputs with the SCIP shard plugin attached to javac and + * reads the produced `*.scip` shards back from disk. + */ def compileSemanticdb(inputs: Seq[Input.VirtualFile]): CompileResult = { compile( inputs, @@ -94,23 +101,19 @@ class TestCompiler( var bytecode = new Array[Byte](0) if (!fileManager.compiled.isEmpty) bytecode = fileManager.compiled.iterator.next.getCompiledBinaries - val textDocuments = Semanticdb.TextDocuments.newBuilder - inputs.map { input => - val outputPath = targetroot + val documents = ListBuffer.empty[com.sourcegraph.Scip.Document] + inputs.foreach { input => + val shardPath = targetroot .resolve("META-INF") - .resolve("semanticdb") - .resolve(input.path + ".semanticdb") - if (Files.isRegularFile(outputPath)) { - textDocuments.addAllDocuments( - Semanticdb - .TextDocuments - .parseFrom(Files.readAllBytes(outputPath)) - .getDocumentsList - ) + .resolve("scip") + .resolve(input.path + ".scip") + if (Files.isRegularFile(shardPath)) { + documents ++= + CompileResult.documentsFromShard(Files.readAllBytes(shardPath)) } } val stdout = output.toString - CompileResult(bytecode, stdout, textDocuments.build(), isSuccess) + CompileResult(bytecode, stdout, documents.toList, isSuccess) } private def inputsFromDirectory(dir: Path): Seq[Input.VirtualFile] = { diff --git a/tests/unit/src/test/scala/tests/GeneratedConstructorSuite.scala b/tests/unit/src/test/scala/tests/GeneratedConstructorSuite.scala index 6862c7d56..a4a68260f 100644 --- a/tests/unit/src/test/scala/tests/GeneratedConstructorSuite.scala +++ b/tests/unit/src/test/scala/tests/GeneratedConstructorSuite.scala @@ -2,7 +2,7 @@ package tests import scala.meta.inputs.Input -import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocument +import com.sourcegraph.Scip import munit.FunSuite import munit.TestOptions @@ -15,7 +15,7 @@ class GeneratedConstructorSuite extends FunSuite with TempDirectories { def doSomething( options: TestOptions, original: String, - fn: (TextDocument, List[String]) => Unit, + fn: (Scip.Document, List[String]) => Unit, qualifiedClassName: String = "example.Test" )(implicit loc: munit.Location): Unit = { test(options) { diff --git a/tests/unit/src/test/scala/tests/JavacClassesDirectorySuite.scala b/tests/unit/src/test/scala/tests/JavacClassesDirectorySuite.scala index 4a3d51155..6674ba015 100644 --- a/tests/unit/src/test/scala/tests/JavacClassesDirectorySuite.scala +++ b/tests/unit/src/test/scala/tests/JavacClassesDirectorySuite.scala @@ -36,12 +36,12 @@ class JavacClassesDirectorySuite extends FunSuite with TempDirectories { ) ) assert(clue(compileResult).isSuccess) - val semanticdbPath = Paths + val shardPath = Paths .get("META-INF") - .resolve("semanticdb") + .resolve("scip") .resolve("example") - .resolve("Example.java.semanticdb") - assert(Files.isRegularFile(clue(sourceroot().resolve(semanticdbPath)))) + .resolve("Example.java.scip") + assert(Files.isRegularFile(clue(sourceroot().resolve(shardPath)))) } } diff --git a/tests/unit/src/test/scala/tests/OverridesSuite.scala b/tests/unit/src/test/scala/tests/OverridesSuite.scala index 15b069aff..a252b4e93 100644 --- a/tests/unit/src/test/scala/tests/OverridesSuite.scala +++ b/tests/unit/src/test/scala/tests/OverridesSuite.scala @@ -1,10 +1,9 @@ package tests -import java.util.stream.Collectors - +import scala.jdk.CollectionConverters._ import scala.meta.Input -import com.sourcegraph.scip_semanticdb.Symtab +import com.sourcegraph.semanticdb_javac.ScipSymbols import munit.FunSuite import munit.TestOptions @@ -26,16 +25,37 @@ class OverridesSuite extends FunSuite with TempDirectories { val relativePath = "example.Parent".replace('.', '/') + ".java" val input = Input.VirtualFile(relativePath, source) val result = compiler.compileSemanticdb(List(input)) - val symtab = new Symtab(result.textDocument.orNull) + val document = result.document.getOrElse(fail("no SCIP document emitted")) + + val placeholderSymbol = ScipSymbols.PLACEHOLDER_PREFIX + extractSymbol + val info = document + .getSymbolsList + .asScala + .find(_.getSymbol == placeholderSymbol) + .getOrElse( + fail( + s"symbol $extractSymbol not found in document; symbols = " + + document + .getSymbolsList + .asScala + .map(_.getSymbol) + .mkString("\n ", "\n ", "") + ) + ) + val obtainedSymbols = info + .getRelationshipsList + .asScala + .filter(_.getIsImplementation) + .map(_.getSymbol) + .map { sym => + if (sym.startsWith(ScipSymbols.PLACEHOLDER_PREFIX)) + sym.substring(ScipSymbols.PLACEHOLDER_PREFIX.length) + else + sym + } val expectedSyms = expectedSymbols.mkString("\n") - val syms = symtab - .symbols - .get(extractSymbol) - .getOverriddenSymbolsList - .stream - .collect(Collectors.joining("\n")) - assertNoDiff(syms, expectedSyms) + assertNoDiff(obtainedSymbols.mkString("\n"), expectedSyms) } } diff --git a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala index cc3544fea..063a16689 100644 --- a/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala +++ b/tests/unit/src/test/scala/tests/ScipShardEmissionSuite.scala @@ -10,8 +10,8 @@ import com.sourcegraph.semanticdb_javac.ScipSymbols import munit.FunSuite /** - * Verifies that the plugin produces a parseable `*.scip` shard alongside the - * existing `*.semanticdb` file by default, and that `-emit-scip:off` disables it. + * Verifies that the Java compiler plug-in produces a parseable `*.scip` shard + * under `META-INF/scip/...` and no longer writes any `*.semanticdb` files. */ class ScipShardEmissionSuite extends FunSuite { @@ -28,7 +28,7 @@ class ScipShardEmissionSuite extends FunSuite { |""".stripMargin ) - test("compiler emits a parseable SCIP shard by default") { + test("compiler emits a parseable SCIP shard and no SemanticDB file") { val targetroot = Files.createTempDirectory("scip-shard-emission-") val sourceroot = Files.createTempDirectory("scip-shard-emission-src-") val compiler = @@ -46,7 +46,7 @@ class ScipShardEmissionSuite extends FunSuite { ) val scipPath = targetroot.resolve("META-INF/scip/example/Foo.java.scip") - assert(Files.isRegularFile(semanticdbPath), s"missing $semanticdbPath") + assert(!Files.exists(semanticdbPath), s"unexpected semanticdb $semanticdbPath") assert(Files.isRegularFile(scipPath), s"missing $scipPath") val shard = Scip.Index.parseFrom(Files.readAllBytes(scipPath)) @@ -103,7 +103,7 @@ class ScipShardEmissionSuite extends FunSuite { assert(barText.contains("int bar("), s"unexpected bar signature: $barText") } - test("compiler does not emit SCIP shards when -emit-scip:off is set") { + test("compiler accepts the deprecated -emit-scip:off flag without erroring") { val targetroot = Files.createTempDirectory("scip-shard-off-") val sourceroot = Files.createTempDirectory("scip-shard-off-src-") val compiler = @@ -115,8 +115,8 @@ class ScipShardEmissionSuite extends FunSuite { ) ) assert(result.isSuccess, s"javac failed:\n${result.stdout}") - + // The flag is now a deprecated no-op; the shard is still emitted. val scipPath = targetroot.resolve("META-INF/scip/example/Foo.java.scip") - assert(!Files.exists(scipPath), s"unexpected scip shard at $scipPath") + assert(Files.exists(scipPath), s"expected shard at $scipPath") } } diff --git a/tests/unit/src/test/scala/tests/TargetedSuite.scala b/tests/unit/src/test/scala/tests/TargetedSuite.scala index 1fa200d51..e039897a5 100644 --- a/tests/unit/src/test/scala/tests/TargetedSuite.scala +++ b/tests/unit/src/test/scala/tests/TargetedSuite.scala @@ -7,8 +7,7 @@ import scala.meta.Input import scala.meta.Position import scala.meta.internal.inputs._ -import com.sourcegraph.semanticdb_javac.Semanticdb -import com.sourcegraph.semanticdb_javac.Semanticdb.TextDocument +import com.sourcegraph.Scip import munit.FunSuite import munit.TestOptions @@ -20,10 +19,23 @@ class TargetedSuite extends FunSuite with TempDirectories { override def munitFixtures: Seq[Fixture[_]] = super.munitFixtures ++ List(targetroot) + /** Encodes a position the same way SCIP encodes a single-line range. */ + private def asScipRange(pos: Position): java.util.List[Integer] = { + if (pos.startLine == pos.endLine) + List[Integer](pos.startLine, pos.startColumn, pos.endColumn).asJava + else + List[Integer]( + pos.startLine, + pos.startColumn, + pos.endLine, + pos.endColumn + ).asJava + } + def checkDoc( options: TestOptions, original: String, - fn: (TextDocument, List[String]) => Unit, + fn: (Scip.Document, List[String]) => Unit, qualifiedClassName: String = "example.Test" )(implicit loc: munit.Location): Unit = { test(options) { @@ -44,18 +56,11 @@ class TargetedSuite extends FunSuite with TempDirectories { }) .toList val result = compiler.compileSemanticdb(List(input)) - val textDocument = result.textDocument.orNull - val occurrences = textDocument.getOccurrencesList.asScala.toList + val document = result.document.getOrElse(fail("no SCIP document emitted")) + val occurrences = document.getOccurrencesList.asScala.toList val symbols: List[String] = positions.map { pos => - val posRange = Semanticdb - .Range - .newBuilder() - .setStartLine(pos.startLine) - .setStartCharacter(pos.startColumn) - .setEndLine(pos.endLine) - .setEndCharacter(pos.endColumn) - .build() - val matchingOccurrences = occurrences.filter(_.getRange == posRange) + val expected = asScipRange(pos) + val matchingOccurrences = occurrences.filter(_.getRangeList == expected) matchingOccurrences match { case Nil => fail( @@ -63,7 +68,7 @@ class TargetedSuite extends FunSuite with TempDirectories { "error", s"no symbol occurrence for this position." ), - clues(occurrences, posRange) + clues(occurrences, expected) ) case sym :: Nil => sym.getSymbol @@ -73,11 +78,11 @@ class TargetedSuite extends FunSuite with TempDirectories { "error", s"ambiguous symbols for this position" ), - clues(many, occurrences, posRange) + clues(many, occurrences, expected) ) } } - fn(textDocument, symbols) + fn(document, symbols) } } @@ -98,10 +103,19 @@ class TargetedSuite extends FunSuite with TempDirectories { |} |""".stripMargin, { case (_, List(a, b, c, d)) => - assertNoDiff(a, "java/lang/String#lastIndexOf().") - assertNoDiff(b, "java/lang/String#lastIndexOf(+1).") - assertNoDiff(c, "java/lang/String#lastIndexOf(+2).") - assertNoDiff(d, "java/lang/String#lastIndexOf(+3).") + assertNoDiff(stripPlaceholder(a), "java/lang/String#lastIndexOf().") + assertNoDiff(stripPlaceholder(b), "java/lang/String#lastIndexOf(+1).") + assertNoDiff(stripPlaceholder(c), "java/lang/String#lastIndexOf(+2).") + assertNoDiff(stripPlaceholder(d), "java/lang/String#lastIndexOf(+3).") } ) + + /** Strips the placeholder prefix that compiler-emitted shards use for globals. */ + private def stripPlaceholder(symbol: String): String = { + import com.sourcegraph.semanticdb_javac.ScipSymbols.PLACEHOLDER_PREFIX + if (symbol.startsWith(PLACEHOLDER_PREFIX)) + symbol.substring(PLACEHOLDER_PREFIX.length) + else + symbol + } } From 6a01dd52e1727b69c3524126614feb040eff53e5 Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:54:02 +0200 Subject: [PATCH 16/21] PR3 (D3): semanticdb-kotlinc emits only SCIP shards Drop the legacy SemanticDB code path from the Kotlin compiler plug-in: * ScipRole: new local enum mirroring the DEFINITION/REFERENCE subset of Semanticdb.SymbolOccurrence.Role. * SemanticdbVisitor: drop the documentBuilder field and build()/Semanticdb.TextDocument helper; the visitor now only feeds ScipTextDocumentBuilder and uses ScipRole at every emit site. * ScipTextDocumentBuilder: switch role parameter from Semanticdb.SymbolOccurrence.Role to ScipRole. * PostAnalysisExtension: remove the SemanticDB write path and the (Semanticdb.TextDocument) -> Unit callback; the extension now only walks the visitors and writes META-INF/scip/.scip shards. * AnalyzerRegistrar: remove the SemanticDB callback parameter. Delete the legacy implementation source: * SemanticdbTextDocumentBuilder.kt Delete the legacy Kotlin test suites that asserted on Semanticdb protobuf output: * src/test/kotlin/.../test/AnalyzerTest.kt (1528 lines) * src/test/kotlin/.../test/SemanticdbSymbolsTest.kt (726 lines) * src/test/kotlin/.../test/Utils.kt (203 lines) The Kotlin compiler plug-in behavior remains covered end-to-end by the existing snapshot suites (semanticdb-kotlinc/minimized fixtures + the exposed-core library snapshot regenerated in PR2 K5). Validation: sbt unit/test (28 passing), sbt snapshots/test (102 passing). --- .../semanticdb_kotlinc/AnalyzerRegistrar.kt | 6 +- .../PostAnalysisExtension.kt | 32 +- .../semanticdb_kotlinc/ScipRole.kt | 11 + .../ScipTextDocumentBuilder.kt | 13 +- .../SemanticdbTextDocumentBuilder.kt | 227 --- .../semanticdb_kotlinc/SemanticdbVisitor.kt | 43 +- .../semanticdb_kotlinc/test/AnalyzerTest.kt | 1528 ----------------- .../test/SemanticdbSymbolsTest.kt | 726 -------- .../semanticdb_kotlinc/test/Utils.kt | 203 --- 9 files changed, 48 insertions(+), 2741 deletions(-) create mode 100644 semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipRole.kt delete mode 100644 semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt delete mode 100644 semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/AnalyzerTest.kt delete mode 100644 semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/SemanticdbSymbolsTest.kt delete mode 100644 semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/Utils.kt diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerRegistrar.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerRegistrar.kt index 410dee517..2d65d45de 100644 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerRegistrar.kt +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/AnalyzerRegistrar.kt @@ -9,8 +9,7 @@ import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter @OptIn(ExperimentalCompilerApi::class) @ExperimentalContracts -class AnalyzerRegistrar(private val callback: (Semanticdb.TextDocument) -> Unit = {}) : - CompilerPluginRegistrar() { +class AnalyzerRegistrar : CompilerPluginRegistrar() { override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { FirExtensionRegistrarAdapter.registerExtension( AnalyzerFirExtensionRegistrar(sourceroot = configuration[KEY_SOURCES]!!) @@ -18,8 +17,7 @@ class AnalyzerRegistrar(private val callback: (Semanticdb.TextDocument) -> Unit IrGenerationExtension.registerExtension( PostAnalysisExtension( sourceRoot = configuration[KEY_SOURCES]!!, - targetRoot = configuration[KEY_TARGET]!!, - callback = callback)) + targetRoot = configuration[KEY_TARGET]!!)) } override val supportsK2: Boolean diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/PostAnalysisExtension.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/PostAnalysisExtension.kt index 8c4718693..2552e8c15 100644 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/PostAnalysisExtension.kt +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/PostAnalysisExtension.kt @@ -16,24 +16,22 @@ import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +/** + * IR generation extension that runs after FIR analysis to write the per-source SCIP shards + * collected by [SemanticdbVisitor]. The legacy SemanticDB protobuf output has been removed. + */ class PostAnalysisExtension( private val sourceRoot: Path, private val targetRoot: Path, - private val callback: (Semanticdb.TextDocument) -> Unit ) : IrGenerationExtension { @OptIn(ExperimentalContracts::class) override fun generate(moduleFragment: IrModuleFragment, pluginContext: IrPluginContext) { try { for ((ktSourceFile, visitor) in AnalyzerCheckers.visitors) { try { - val document = visitor.build() - semanticdbOutPathForFile(ktSourceFile)?.apply { - Files.write(this, TextDocuments { addDocuments(document) }.toByteArray()) - } scipShardOutPathForFile(ktSourceFile)?.apply { ScipShardWriter.write(this, visitor.buildScipIndex()) } - callback(document) } catch (e: Exception) { handleException(e) } @@ -43,33 +41,23 @@ class PostAnalysisExtension( } } - private fun semanticdbOutPathForFile(file: KtSourceFile): Path? = - outPathForFile(file, subdir = "semanticdb", suffix = ".semanticdb") - - private fun scipShardOutPathForFile(file: KtSourceFile): Path? = - outPathForFile(file, subdir = "scip", suffix = ".scip") - - private fun outPathForFile(file: KtSourceFile, subdir: String, suffix: String): Path? { + private fun scipShardOutPathForFile(file: KtSourceFile): Path? { val normalizedPath = Paths.get(file.path).normalize() if (normalizedPath.startsWith(sourceRoot)) { val relative = sourceRoot.relativize(normalizedPath) - val filename = relative.fileName.toString() + suffix + val filename = relative.fileName.toString() + ".scip" val outPath = targetRoot .resolve("META-INF") - .resolve(subdir) + .resolve("scip") .resolve(relative) .resolveSibling(filename) Files.createDirectories(outPath.parent) return outPath } - // Only warn once across both files; the SemanticDB path is the canonical pre-existing - // emission, so we keep the warning attached to it. - if (subdir == "semanticdb") { - System.err.println( - "given file is not under the sourceroot.\n\tSourceroot: $sourceRoot\n\tFile path: ${file.path}\n\tNormalized file path: $normalizedPath") - } + System.err.println( + "given file is not under the sourceroot.\n\tSourceroot: $sourceRoot\n\tFile path: ${file.path}\n\tNormalized file path: $normalizedPath") return null } @@ -96,7 +84,7 @@ class PostAnalysisExtension( writer.println("Exception in semanticdb-kotlin compiler plugin:") e.printStackTrace(writer) writer.println( - "Please report a bug to https://github.com/sourcegraph/scip-kotlin with the stack trace above.") + "Please report a bug to https://github.com/sourcegraph/scip-java with the stack trace above.") writer.close() } } diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipRole.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipRole.kt new file mode 100644 index 000000000..1b639a623 --- /dev/null +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipRole.kt @@ -0,0 +1,11 @@ +package com.sourcegraph.semanticdb_kotlinc + +/** + * Minimal role enum used by the direct-to-SCIP visitor and builder. Mirrors the subset of + * `Semanticdb.SymbolOccurrence.Role` that the Kotlin plug-in needs after the SemanticDB protobuf + * dependency has been removed. + */ +enum class ScipRole { + DEFINITION, + REFERENCE +} diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipTextDocumentBuilder.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipTextDocumentBuilder.kt index f03187404..5bb1e527f 100644 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipTextDocumentBuilder.kt +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/ScipTextDocumentBuilder.kt @@ -1,7 +1,6 @@ package com.sourcegraph.semanticdb_kotlinc import com.sourcegraph.Scip -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.SymbolOccurrence.Role import kotlin.contracts.ExperimentalContracts import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.KtSourceFile @@ -19,7 +18,7 @@ import org.jetbrains.kotlin.text /** * Builds a single-document [Scip.Index] shard for one Kotlin source file from per-element callbacks - * fired by [SemanticdbVisitor]. This is the SCIP analogue of [SemanticdbTextDocumentBuilder]. + * fired by [SemanticdbVisitor]. * * Symbols are emitted using the placeholder scheme [ScipSymbols.PLACEHOLDER_PREFIX]; the * `scip-aggregator` rewrites them into final `scip-java maven g a v ...` form once Maven @@ -56,14 +55,14 @@ class ScipTextDocumentBuilder( firBasedSymbol: FirBasedSymbol<*>?, symbol: Symbol, element: KtSourceElement, - role: Role, + role: ScipRole, context: CheckerContext, enclosingSource: KtSourceElement? = null, ) { if (symbol == Symbol.NONE) return emitOccurrence(symbol, element, role, enclosingSource) - if (role == Role.DEFINITION) { + if (role == ScipRole.DEFINITION) { emitSymbolInformation(firBasedSymbol, symbol, element, context) } } @@ -71,7 +70,7 @@ class ScipTextDocumentBuilder( private fun emitOccurrence( symbol: Symbol, element: KtSourceElement, - role: Role, + role: ScipRole, enclosingSource: KtSourceElement?, ) { val builder = @@ -264,9 +263,9 @@ class ScipTextDocumentBuilder( else -> firBasedSymbol.toString() } - private fun scipRole(role: Role): Int = + private fun scipRole(role: ScipRole): Int = when (role) { - Role.DEFINITION -> Scip.SymbolRole.Definition_VALUE + ScipRole.DEFINITION -> Scip.SymbolRole.Definition_VALUE else -> 0 } diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt deleted file mode 100644 index d37d5bee1..000000000 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbTextDocumentBuilder.kt +++ /dev/null @@ -1,227 +0,0 @@ -package com.sourcegraph.semanticdb_kotlinc - -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.SymbolOccurrence.Role -import java.nio.file.Path -import java.nio.file.Paths -import java.security.MessageDigest -import kotlin.contracts.ExperimentalContracts -import org.jetbrains.kotlin.KtSourceElement -import org.jetbrains.kotlin.KtSourceFile -import org.jetbrains.kotlin.com.intellij.lang.java.JavaLanguage -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext -import org.jetbrains.kotlin.fir.analysis.checkers.directOverriddenSymbolsSafe -import org.jetbrains.kotlin.fir.analysis.checkers.toClassLikeSymbol -import org.jetbrains.kotlin.fir.analysis.getChild -import org.jetbrains.kotlin.fir.renderer.* -import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol -import org.jetbrains.kotlin.fir.symbols.SymbolInternals -import org.jetbrains.kotlin.fir.symbols.impl.* -import org.jetbrains.kotlin.fir.types.impl.FirImplicitAnyTypeRef -import org.jetbrains.kotlin.idea.KotlinLanguage -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi -import org.jetbrains.kotlin.text - -@ExperimentalContracts -class SemanticdbTextDocumentBuilder( - private val sourceroot: Path, - private val file: KtSourceFile, - private val lineMap: LineMap, - private val cache: SymbolsCache, -) { - private val occurrences = mutableListOf() - private val symbols = mutableListOf() - private val fileText = file.getContentsAsStream().reader().readText() - private val semanticMd5 = semanticdbMD5() - - fun build() = TextDocument { - this.text = fileText - this.uri = semanticdbURI() - this.md5 = semanticMd5 - this.schema = Semanticdb.Schema.SEMANTICDB4 - this.language = Semanticdb.Language.KOTLIN - occurrences.sortWith(compareBy({ it.range.startLine }, { it.range.startCharacter })) - this.addAllOccurrences(occurrences) - this.addAllSymbols(symbols) - } - - fun emitSemanticdbData( - firBasedSymbol: FirBasedSymbol<*>?, - symbol: Symbol, - element: KtSourceElement, - role: Role, - context: CheckerContext, - enclosingSource: KtSourceElement? = null, - ) { - symbolOccurrence(symbol, element, role, enclosingSource).let { - if (!occurrences.contains(it)) { - occurrences.add(it) - } - } - val symbolInformation = symbolInformation(firBasedSymbol, symbol, element, context) - if (role == Role.DEFINITION && !symbols.contains(symbolInformation)) - symbols.add(symbolInformation) - } - - @OptIn(SymbolInternals::class) - private fun symbolInformation( - firBasedSymbol: FirBasedSymbol<*>?, - symbol: Symbol, - element: KtSourceElement, - context: CheckerContext, - ): Semanticdb.SymbolInformation { - val supers = - when (firBasedSymbol) { - is FirClassSymbol -> - firBasedSymbol - .resolvedSuperTypeRefs - .filter { it !is FirImplicitAnyTypeRef } - .map { it.toClassLikeSymbol(firBasedSymbol.moduleData.session) } - .filterNotNull() - .flatMap { cache[it] } - is FirFunctionSymbol<*> -> - firBasedSymbol.directOverriddenSymbolsSafe(context).flatMap { cache[it] } - else -> emptyList().asIterable() - } - return SymbolInformation { - this.symbol = symbol.toString() - this.displayName = - if (firBasedSymbol != null) { - displayName(firBasedSymbol) - } else { - element.text.toString() - } - this.documentation = - if (firBasedSymbol != null) { - semanticdbDocumentation(firBasedSymbol.fir) - } else { - Documentation { - format = Semanticdb.Documentation.Format.MARKDOWN - message = "" - } - } - this.addAllOverriddenSymbols(supers.map { it.toString() }) - this.language = - when (element.psi?.language ?: KotlinLanguage.INSTANCE) { - is KotlinLanguage -> Semanticdb.Language.KOTLIN - is JavaLanguage -> Semanticdb.Language.JAVA - else -> throw IllegalArgumentException("unexpected language") - } - } - } - - private fun symbolOccurrence( - symbol: Symbol, - element: KtSourceElement, - role: Role, - enclosingSource: KtSourceElement? = null, - ): Semanticdb.SymbolOccurrence { - return SymbolOccurrence { - this.symbol = symbol.toString() - this.role = role - this.range = semanticdbRange(element) - if (enclosingSource != null) { - this.enclosingRange = semanticdbEnclosingRange(enclosingSource) - } - } - } - - private fun semanticdbRange(element: KtSourceElement): Semanticdb.Range { - return Range { - startCharacter = lineMap.startCharacter(element) - startLine = lineMap.lineNumber(element) - 1 - endCharacter = lineMap.endCharacter(element) - endLine = lineMap.lineNumber(element) - 1 - } - } - - private fun semanticdbEnclosingRange(element: KtSourceElement): Semanticdb.Range { - return Range { - startLine = lineMap.lineNumber(element) - 1 - startCharacter = lineMap.startCharacter(element) - endLine = lineMap.lineNumberForOffset(element.endOffset) - 1 - endCharacter = lineMap.columnForOffset(element.endOffset) - } - } - - private fun semanticdbURI(): String { - // TODO: unix-style only - val relative = sourceroot.relativize(Paths.get(file.path)) - return relative.toString() - } - - private fun semanticdbMD5(): String = - MessageDigest.getInstance("MD5") - .digest(file.getContentsAsStream().readBytes()) - .joinToString("") { "%02X".format(it) } - - private fun semanticdbDocumentation(element: FirElement): Semanticdb.Documentation = Documentation { - format = Semanticdb.Documentation.Format.MARKDOWN - // Like FirRenderer().forReadability, but using FirAllModifierRenderer instead of FirPartialModifierRenderer - val renderer = FirRenderer( - typeRenderer = ConeTypeRenderer(), - idRenderer = ConeIdShortRenderer(), - classMemberRenderer = FirNoClassMemberRenderer(), - bodyRenderer = null, - propertyAccessorRenderer = null, - callArgumentsRenderer = FirCallNoArgumentsRenderer(), - modifierRenderer = FirAllModifierRenderer(), - callableSignatureRenderer = FirCallableSignatureRendererForReadability(), - declarationRenderer = FirDeclarationRenderer("local "), - ) - val renderOutput = renderer.renderElementAsString(element) - val kdoc = element.source?.getChild(KtTokens.DOC_COMMENT)?.text?.toString() ?: "" - message = "```kotlin\n$renderOutput\n```${stripKDocAsterisks(kdoc)}" - } - - // Returns the kdoc string with all leading and trailing "/*" tokens removed. Naive - // implementation that can - // be replaced with a utility method from the compiler in the future, if one exists. - private fun stripKDocAsterisks(kdoc: String): String { - if (kdoc.isEmpty()) return kdoc - val out = StringBuilder().append("\n\n").append("----").append("\n") - kdoc.lineSequence().forEach { line -> - if (line.isEmpty()) return@forEach - var start = 0 - while (start < line.length && line[start].isWhitespace()) { - start++ - } - if (start < line.length && line[start] == '/') { - start++ - } - while (start < line.length && line[start] == '*') { - start++ - } - var end = line.length - 1 - if (end > start && line[end] == '/') { - end-- - } - while (end > start && line[end] == '*') { - end-- - } - while (end > start && line[end].isWhitespace()) { - end-- - } - start = minOf(start, line.length - 1) - if (end > start) { - end++ - } - out.append("\n").append(line, start, end) - } - return out.toString() - } - - companion object { - @OptIn(SymbolInternals::class) - private fun displayName(firBasedSymbol: FirBasedSymbol<*>): String = - when (firBasedSymbol) { - is FirClassSymbol -> firBasedSymbol.classId.shortClassName.asString() - is FirPropertyAccessorSymbol -> firBasedSymbol.fir.propertySymbol.name.asString() - is FirFunctionSymbol -> firBasedSymbol.callableId.callableName.asString() - is FirPropertySymbol -> firBasedSymbol.callableId.callableName.asString() - is FirVariableSymbol -> firBasedSymbol.name.asString() - else -> firBasedSymbol.toString() - } - } -} diff --git a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbVisitor.kt b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbVisitor.kt index 9247dd4b1..2b4408226 100644 --- a/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbVisitor.kt +++ b/semanticdb-kotlinc/src/main/kotlin/com/sourcegraph/semanticdb_kotlinc/SemanticdbVisitor.kt @@ -1,7 +1,6 @@ package com.sourcegraph.semanticdb_kotlinc import com.sourcegraph.Scip -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.SymbolOccurrence.Role import java.nio.file.Path import java.nio.file.Paths import kotlin.contracts.ExperimentalContracts @@ -15,6 +14,11 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.name.FqName +/** + * Walks the FIR analysis tree for a single Kotlin source file and builds a self-contained + * `Scip.Index` shard via [ScipTextDocumentBuilder]. The legacy SemanticDB protobuf path has been + * removed; the visitor only emits SCIP. + */ @ExperimentalContracts class SemanticdbVisitor( sourceroot: Path, @@ -25,7 +29,6 @@ class SemanticdbVisitor( ) { private val cache = SymbolsCache(globals, locals) private val relativePath: String = computeRelativePath(sourceroot, file) - private val documentBuilder = SemanticdbTextDocumentBuilder(sourceroot, file, lineMap, cache) private val scipBuilder = ScipTextDocumentBuilder(file, lineMap, cache, relativePath) private data class SymbolDescriptorPair( @@ -33,22 +36,17 @@ class SemanticdbVisitor( val symbol: Symbol ) - fun build(): Semanticdb.TextDocument { - return documentBuilder.build() - } - fun buildScipIndex(): Scip.Index = scipBuilder.buildIndex() fun scipRelativePath(): String = relativePath private fun Sequence?.emitAll( element: KtSourceElement, - role: Role, + role: ScipRole, context: CheckerContext, enclosingSource: KtSourceElement? = null, ): List? = this?.onEach { (firBasedSymbol, symbol) -> - documentBuilder.emitSemanticdbData(firBasedSymbol, symbol, element, role, context, enclosingSource) scipBuilder.emitScipData(firBasedSymbol, symbol, element, role, context, enclosingSource) } ?.map { it.symbol } @@ -58,57 +56,55 @@ class SemanticdbVisitor( this.map { SymbolDescriptorPair(firBasedSymbol, it) } fun visitPackage(pkg: FqName, element: KtSourceElement, context: CheckerContext) { - cache[pkg].with(null).emitAll(element, Role.REFERENCE, context) + cache[pkg].with(null).emitAll(element, ScipRole.REFERENCE, context) } fun visitClassReference(firClassSymbol: FirClassLikeSymbol<*>, element: KtSourceElement, context: CheckerContext) { - cache[firClassSymbol].with(firClassSymbol).emitAll(element, Role.REFERENCE, context) + cache[firClassSymbol].with(firClassSymbol).emitAll(element, ScipRole.REFERENCE, context) } fun visitCallableReference(firClassSymbol: FirCallableSymbol<*>, element: KtSourceElement, context: CheckerContext) { - cache[firClassSymbol].with(firClassSymbol).emitAll(element, Role.REFERENCE, context) + cache[firClassSymbol].with(firClassSymbol).emitAll(element, ScipRole.REFERENCE, context) } fun visitClassOrObject(firClass: FirClassLikeDeclaration, element: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { - cache[firClass.symbol].with(firClass.symbol).emitAll(element, Role.DEFINITION, context, enclosingSource) + cache[firClass.symbol].with(firClass.symbol).emitAll(element, ScipRole.DEFINITION, context, enclosingSource) } fun visitPrimaryConstructor(firConstructor: FirConstructor, source: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { - // if the constructor is not denoted by the 'constructor' keyword, we want to link it to the - // class ident - cache[firConstructor.symbol].with(firConstructor.symbol).emitAll(source, Role.DEFINITION, context, enclosingSource) + cache[firConstructor.symbol].with(firConstructor.symbol).emitAll(source, ScipRole.DEFINITION, context, enclosingSource) } fun visitSecondaryConstructor(firConstructor: FirConstructor, source: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { - cache[firConstructor.symbol].with(firConstructor.symbol).emitAll(source, Role.DEFINITION, context, enclosingSource) + cache[firConstructor.symbol].with(firConstructor.symbol).emitAll(source, ScipRole.DEFINITION, context, enclosingSource) } fun visitNamedFunction(firFunction: FirFunction, source: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { - cache[firFunction.symbol].with(firFunction.symbol).emitAll(source, Role.DEFINITION, context, enclosingSource) + cache[firFunction.symbol].with(firFunction.symbol).emitAll(source, ScipRole.DEFINITION, context, enclosingSource) } fun visitProperty(firProperty: FirProperty, source: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { - cache[firProperty.symbol].with(firProperty.symbol).emitAll(source, Role.DEFINITION, context, enclosingSource) + cache[firProperty.symbol].with(firProperty.symbol).emitAll(source, ScipRole.DEFINITION, context, enclosingSource) } fun visitParameter(firParameter: FirValueParameter, source: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { - cache[firParameter.symbol].with(firParameter.symbol).emitAll(source, Role.DEFINITION, context, enclosingSource) + cache[firParameter.symbol].with(firParameter.symbol).emitAll(source, ScipRole.DEFINITION, context, enclosingSource) } fun visitTypeParameter(firTypeParameter: FirTypeParameter, source: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { cache[firTypeParameter.symbol] .with(firTypeParameter.symbol) - .emitAll(source, Role.DEFINITION, context, enclosingSource) + .emitAll(source, ScipRole.DEFINITION, context, enclosingSource) } fun visitTypeAlias(firTypeAlias: FirTypeAlias, source: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { - cache[firTypeAlias.symbol].with(firTypeAlias.symbol).emitAll(source, Role.DEFINITION, context, enclosingSource) + cache[firTypeAlias.symbol].with(firTypeAlias.symbol).emitAll(source, ScipRole.DEFINITION, context, enclosingSource) } fun visitPropertyAccessor(firPropertyAccessor: FirPropertyAccessor, source: KtSourceElement, context: CheckerContext, enclosingSource: KtSourceElement? = null) { cache[firPropertyAccessor.symbol] .with(firPropertyAccessor.symbol) - .emitAll(source, Role.DEFINITION, context, enclosingSource) + .emitAll(source, ScipRole.DEFINITION, context, enclosingSource) } fun visitSimpleNameExpression( @@ -117,7 +113,7 @@ class SemanticdbVisitor( ) { cache[firResolvedNamedReference.resolvedSymbol] .with(firResolvedNamedReference.resolvedSymbol) - .emitAll(source, Role.REFERENCE, context) + .emitAll(source, ScipRole.REFERENCE, context) } } @@ -134,4 +130,3 @@ private fun computeRelativePath(sourceroot: Path, file: KtSourceFile): String { normalized.toString().replace('\\', '/') } } - diff --git a/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/AnalyzerTest.kt b/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/AnalyzerTest.kt deleted file mode 100644 index 09724ed34..000000000 --- a/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/AnalyzerTest.kt +++ /dev/null @@ -1,1528 +0,0 @@ -package com.sourcegraph.semanticdb_kotlinc.test - -import com.sourcegraph.semanticdb_kotlinc.* -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.Language.KOTLIN -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.SymbolOccurrence.Role -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.TextDocument -import com.tschuchort.compiletesting.KotlinCompilation -import com.tschuchort.compiletesting.PluginOption -import com.tschuchort.compiletesting.SourceFile -import io.kotest.assertions.assertSoftly -import io.kotest.assertions.fail -import io.kotest.assertions.withClue -import io.kotest.matchers.collections.shouldContain -import io.kotest.matchers.shouldBe -import io.kotest.matchers.shouldNotBe -import java.io.File -import java.nio.file.Path -import kotlin.contracts.ExperimentalContracts -import kotlin.test.Test -import kotlin.test.assertEquals -import org.intellij.lang.annotations.Language -import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi -import org.junit.jupiter.api.io.TempDir -import java.nio.file.Paths - -@OptIn(ExperimentalCompilerApi::class) -@ExperimentalContracts -class AnalyzerTest { - fun compileSemanticdb(path: Path, @Language("kotlin") code: String): TextDocument { - val buildPath = File(path.resolve("build").toString()).apply { mkdir() } - val source = SourceFile.testKt(code) - lateinit var document: TextDocument - - val result = - KotlinCompilation() - .apply { - sources = listOf(source) - compilerPluginRegistrars = listOf(AnalyzerRegistrar { document = it }) - verbose = false - pluginOptions = - listOf( - PluginOption("semanticdb-kotlinc", "sourceroot", path.toString()), - PluginOption("semanticdb-kotlinc", "targetroot", buildPath.toString()) - ) - commandLineProcessors = listOf(AnalyzerCommandLineProcessor()) - workingDir = path.toFile() - } - .compile() - - result.exitCode shouldBe KotlinCompilation.ExitCode.OK - document shouldNotBe null - return document - } - - @Test - fun `basic test`(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample - class Banana { - fun foo() { } - }""" - ) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.REFERENCE - symbol = "sample/" - range { - startLine = 0 - startCharacter = 8 - endLine = 0 - endCharacter = 14 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Banana#" - range { - startLine = 1 - startCharacter = 6 - endLine = 1 - endCharacter = 12 - } - enclosingRange { - startLine = 1 - endLine = 3 - endCharacter = 1 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Banana#foo()." - range { - startLine = 2 - startCharacter = 8 - endLine = 2 - endCharacter = 11 - } - enclosingRange { - startLine = 2 - startCharacter = 4 - endLine = 2 - endCharacter = 17 - } - }) - assertSoftly(document.occurrencesList) { - withClue(this) { occurrences.forEach(::shouldContain) } - } - - val symbols = - arrayOf( - SymbolInformation { - symbol = "sample/Banana#" - language = KOTLIN - displayName = "Banana" - documentation = - Documentation { - format = Semanticdb.Documentation.Format.MARKDOWN - message = "```kotlin\npublic final class Banana : Any\n```" - } - }, - SymbolInformation { - symbol = "sample/Banana#foo()." - language = KOTLIN - displayName = "foo" - documentation = - Documentation { - format = Semanticdb.Documentation.Format.MARKDOWN - message = "```kotlin\npublic final fun foo(): Unit\n```" - } - }) - assertSoftly(document.symbolsList) { withClue(this) { symbols.forEach(::shouldContain) } } - } - - @Test - fun imports(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample - - import kotlin.Boolean - import kotlin.Int as KInt - """ - ) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.REFERENCE - symbol = "sample/" - range { - startLine = 0 - startCharacter = 8 - endLine = 0 - endCharacter = 14 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "kotlin/" - range { - startLine = 2 - startCharacter = 7 - endLine = 2 - endCharacter = 13 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "kotlin/Boolean#" - range { - startLine = 2 - startCharacter = 14 - endLine = 2 - endCharacter = 21 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "kotlin/" - range { - startLine = 3 - startCharacter = 7 - endLine = 3 - endCharacter = 13 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "kotlin/Int#" - range { - startLine = 3 - startCharacter = 14 - endLine = 3 - endCharacter = 17 - } - }, - ) - assertSoftly(document.occurrencesList) { - withClue(this) { occurrences.forEach(::shouldContain) } - } - } - - @Test - fun `local classes`(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample - - fun foo() { - class LocalClass { - fun localClassMethod() {} - } - } - """ - ) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/foo()." - range { - startLine = 2 - startCharacter = 4 - endLine = 2 - endCharacter = 7 - } - enclosingRange { - startLine = 2 - endLine = 6 - endCharacter = 1 - } - }, - // LocalClass - SymbolOccurrence { - role = Role.DEFINITION - symbol = "local0" - range { - startLine = 3 - startCharacter = 8 - endLine = 3 - endCharacter = 18 - } - enclosingRange { - startLine = 3 - startCharacter = 2 - endLine = 5 - endCharacter = 3 - } - }, - // LocalClass constructor - SymbolOccurrence { - role = Role.DEFINITION - symbol = "local1" - range { - startLine = 3 - startCharacter = 8 - endLine = 3 - endCharacter = 18 - } - enclosingRange { - startLine = 3 - startCharacter = 2 - endLine = 5 - endCharacter = 3 - } - }, - // localClassMethod - SymbolOccurrence { - role = Role.DEFINITION - symbol = "local2" - range { - startLine = 4 - startCharacter = 8 - endLine = 4 - endCharacter = 24 - } - enclosingRange { - startLine = 4 - startCharacter = 4 - endLine = 4 - endCharacter = 29 - } - }, - ) - assertSoftly(document.occurrencesList) { - withClue(this) { occurrences.forEach(::shouldContain) } - } - - val symbols = - arrayOf( - SymbolInformation { - symbol = "sample/foo()." - displayName = "foo" - language = KOTLIN - documentation { - message = "```kotlin\npublic final fun foo(): Unit\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - }, - SymbolInformation { - symbol = "local0" - displayName = "LocalClass" - language = KOTLIN - documentation { - message = "```kotlin\nlocal final class LocalClass : Any\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - }, - SymbolInformation { - symbol = "local1" - displayName = "LocalClass" - language = KOTLIN - documentation { - message = "```kotlin\npublic constructor(): LocalClass\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - }, - SymbolInformation { - symbol = "local2" - displayName = "localClassMethod" - language = KOTLIN - documentation { - message = "```kotlin\npublic final fun localClassMethod(): Unit\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - }, - ) - assertSoftly(document.symbolsList) { withClue(this) { symbols.forEach(::shouldContain) } } - } - - @Test - fun overrides(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample - - interface Interface { - fun foo() - } - - class Class : Interface { - override fun foo() {} - } - """ - ) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.REFERENCE - symbol = "sample/" - range { - startLine = 0 - startCharacter = 8 - endLine = 0 - endCharacter = 14 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Interface#" - range { - startLine = 2 - startCharacter = 10 - endLine = 2 - endCharacter = 19 - } - enclosingRange { - startLine = 2 - endLine = 4 - endCharacter = 1 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Interface#foo()." - range { - startLine = 3 - startCharacter = 8 - endLine = 3 - endCharacter = 11 - } - enclosingRange { - startLine = 3 - startCharacter = 4 - endLine = 3 - endCharacter = 13 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Class#" - range { - startLine = 6 - startCharacter = 6 - endLine = 6 - endCharacter = 11 - } - enclosingRange { - startLine = 6 - endLine = 8 - endCharacter = 1 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "sample/Interface#" - range { - startLine = 6 - startCharacter = 14 - endLine = 6 - endCharacter = 23 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Class#foo()." - range { - startLine = 7 - startCharacter = 17 - endLine = 7 - endCharacter = 20 - } - enclosingRange { - startLine = 7 - startCharacter = 4 - endLine = 7 - endCharacter = 25 - } - }, - ) - assertSoftly(document.occurrencesList) { - withClue(this) { occurrences.forEach(::shouldContain) } - } - - val symbols = - arrayOf( - SymbolInformation { - symbol = "sample/Interface#" - displayName = "Interface" - language = KOTLIN - documentation { - message = "```kotlin\npublic abstract interface Interface : Any\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - }, - SymbolInformation { - symbol = "sample/Interface#foo()." - displayName = "foo" - language = KOTLIN - documentation { - message = "```kotlin\npublic abstract fun foo(): Unit\n\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - }, - SymbolInformation { - symbol = "sample/Class#" - displayName = "Class" - language = KOTLIN - documentation { - message = "```kotlin\npublic final class Class : Interface\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - addOverriddenSymbols("sample/Interface#") - }, - SymbolInformation { - symbol = "sample/Class#foo()." - displayName = "foo" - language = KOTLIN - documentation { - message = "```kotlin\npublic open override fun foo(): Unit\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - addOverriddenSymbols("sample/Interface#foo().") - }, - ) - assertSoftly(document.symbolsList) { withClue(this) { symbols.forEach(::shouldContain) } } - } - - @Test - fun `anonymous object`(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample - - interface Interface { - fun foo() - } - - fun main() { - val a = object : Interface { - override fun foo() {} - } - val b = object : Interface { - override fun foo() {} - } - } - """ - ) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.REFERENCE - symbol = "sample/" - range { - startLine = 0 - startCharacter = 8 - endLine = 0 - endCharacter = 14 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Interface#" - range { - startLine = 2 - startCharacter = 10 - endLine = 2 - endCharacter = 19 - } - enclosingRange { - startLine = 2 - endLine = 4 - endCharacter = 1 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Interface#foo()." - range { - startLine = 3 - startCharacter = 8 - endLine = 3 - endCharacter = 11 - } - enclosingRange { - startLine = 3 - startCharacter = 4 - endLine = 3 - endCharacter = 13 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/``#" - range { - startLine = 7 - startCharacter = 12 - endLine = 7 - endCharacter = 18 - } - enclosingRange { - startLine = 7 - startCharacter = 12 - endLine = 9 - endCharacter = 5 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/``#``()." - range { - startLine = 7 - startCharacter = 12 - endLine = 7 - endCharacter = 18 - } - enclosingRange { - startLine = 7 - startCharacter = 12 - endLine = 9 - endCharacter = 5 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "sample/Interface#" - range { - startLine = 7 - startCharacter = 21 - endLine = 7 - endCharacter = 30 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/``#foo()." - range { - startLine = 8 - startCharacter = 21 - endLine = 8 - endCharacter = 24 - } - enclosingRange { - startLine = 8 - startCharacter = 8 - endLine = 8 - endCharacter = 29 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/``#" - range { - startLine = 10 - startCharacter = 12 - endLine = 10 - endCharacter = 18 - } - enclosingRange { - startLine = 10 - startCharacter = 12 - endLine = 12 - endCharacter = 5 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/``#``()." - range { - startLine = 10 - startCharacter = 12 - endLine = 10 - endCharacter = 18 - } - enclosingRange { - startLine = 10 - startCharacter = 12 - endLine = 12 - endCharacter = 5 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "sample/Interface#" - range { - startLine = 10 - startCharacter = 21 - endLine = 10 - endCharacter = 30 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/``#foo()." - range { - startLine = 11 - startCharacter = 21 - endLine = 11 - endCharacter = 24 - } - enclosingRange { - startLine = 11 - startCharacter = 8 - endLine = 11 - endCharacter = 29 - } - }, - ) - assertSoftly(document.occurrencesList) { - withClue(this) { occurrences.forEach(::shouldContain) } - } - - val symbols = - arrayOf( - SymbolInformation { - symbol = "sample/Interface#" - displayName = "Interface" - language = KOTLIN - documentation { - message = "```kotlin\npublic abstract interface Interface : Any\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - }, - SymbolInformation { - symbol = "sample/``#" - displayName = "" - language = KOTLIN - documentation { - message = "```kotlin\nobject : Interface\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - addOverriddenSymbols("sample/Interface#") - }, - SymbolInformation { - symbol = "sample/``#foo()." - displayName = "foo" - language = KOTLIN - documentation { - message = "```kotlin\npublic open override fun foo(): Unit\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - addOverriddenSymbols("sample/Interface#foo().") - }, - SymbolInformation { - symbol = "sample/``#" - displayName = "" - language = KOTLIN - documentation { - message = "```kotlin\nobject : Interface\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - addOverriddenSymbols("sample/Interface#") - }, - SymbolInformation { - symbol = "sample/``#foo()." - displayName = "foo" - language = KOTLIN - documentation { - message = "```kotlin\npublic open override fun foo(): Unit\n```" - format = Semanticdb.Documentation.Format.MARKDOWN - } - addOverriddenSymbols("sample/Interface#foo().") - }, - ) - assertSoftly(document.symbolsList) { withClue(this) { symbols.forEach(::shouldContain) } } - } - - @Test - fun `function return type`(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample - - fun foo(arg: Int): Boolean = true - """ - ) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/foo()." - range { - startLine = 2 - startCharacter = 4 - endLine = 2 - endCharacter = 7 - } - enclosingRange { - startLine = 2 - endLine = 2 - endCharacter = 33 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/foo().(arg)" - range { - startLine = 2 - startCharacter = 8 - endLine = 2 - endCharacter = 11 - } - enclosingRange { - startLine = 2 - startCharacter = 8 - endLine = 2 - endCharacter = 16 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "kotlin/Int#" - range { - startLine = 2 - startCharacter = 13 - endLine = 2 - endCharacter = 16 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "kotlin/Boolean#" - range { - startLine = 2 - startCharacter = 19 - endLine = 2 - endCharacter = 26 - } - }, - ) - assertSoftly(document.occurrencesList) { - withClue(this) { occurrences.forEach(::shouldContain) } - } - } - - @Test - fun `type operators`(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample - - fun foo(x: Any) { - when (x) { - is Int -> true - else -> x as Float - } - } - """) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.REFERENCE - symbol = "kotlin/Int#" - range { - startLine = 4 - startCharacter = 11 - endLine = 4 - endCharacter = 14 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "kotlin/Float#" - range { - startLine = 5 - startCharacter = 21 - endLine = 5 - endCharacter = 26 - } - }, - ) - assertSoftly(document.occurrencesList) { - withClue(this) { occurrences.forEach(::shouldContain) } - } - } - - @Test - fun `exception test`(@TempDir path: Path) { - val buildPath = File(path.resolve("build").toString()).apply { mkdir() } - val result = - KotlinCompilation() - .apply { - sources = listOf(SourceFile.testKt("")) - compilerPluginRegistrars = - listOf(AnalyzerRegistrar { throw Exception("sample text") }) - verbose = false - pluginOptions = - listOf( - PluginOption("semanticdb-kotlinc", "sourceroot", path.toString()), - PluginOption("semanticdb-kotlinc", "targetroot", buildPath.toString()) - ) - commandLineProcessors = listOf(AnalyzerCommandLineProcessor()) - workingDir = path.toFile() - } - .compile() - - result.exitCode shouldBe KotlinCompilation.ExitCode.OK - } - - @Test - // shamelessly stolen code snippet from https://learnxinyminutes.com/docs/kotlin/ - fun `learn x in y test`(@TempDir path: Path) { - val buildPath = File(path.resolve("build").toString()).apply { mkdir() } - - val source = - SourceFile.testKt( - """ - @file:Suppress("UNUSED_VARIABLE", "UNUSED_PARAMETER", "NAME_SHADOWING", "ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE", "UNUSED_VALUE") - package sample - - fun main(args: Array) { - val fooVal = 10 // we cannot later reassign fooVal to something else - var fooVar = 10 - fooVar = 20 // fooVar can be reassigned - - /* - In most cases, Kotlin can determine what the type of a variable is, - so we don't have to explicitly specify it every time. - We can explicitly declare the type of a variable like so: - */ - val foo: Int = 7 - - /* - Strings can be represented in a similar way as in Java. - Escaping is done with a backslash. - */ - val fooString = "My String Is Here!" - val barString = "Printing on a new line?\nNo Problem!" - val bazString = "Do you want to add a tab?\tNo Problem!" - println(fooString) - println(barString) - println(bazString) - - /* - Strings can contain template expressions. - A template expression starts with a dollar sign (${'$'}). - */ - val fooTemplateString = "$'fooString' has ${"fooString.length"} characters" - println(fooTemplateString) // => My String Is Here! has 18 characters - - /* - For a variable to hold null it must be explicitly specified as nullable. - A variable can be specified as nullable by appending a ? to its type. - We can access a nullable variable by using the ?. operator. - We can use the ?: operator to specify an alternative value to use - if a variable is null. - */ - var fooNullable: String? = "abc" - println(fooNullable?.length) // => 3 - println(fooNullable?.length ?: -1) // => 3 - fooNullable = null - println(fooNullable?.length) // => null - println(fooNullable?.length ?: -1) // => -1 - - /* - Functions can be declared using the "fun" keyword. - Function arguments are specified in brackets after the function name. - Function arguments can optionally have a default value. - The function return type, if required, is specified after the arguments. - */ - fun hello(name: String = "world"): String { - return "Hello, $'name'!" - } - println(hello("foo")) // => Hello, foo! - println(hello(name = "bar")) // => Hello, bar! - println(hello()) // => Hello, world! - - /* - A function parameter may be marked with the "vararg" keyword - to allow a variable number of arguments to be passed to the function. - */ - fun varargExample(vararg names: Int) { - println("Argument has ${"names.size"} elements") - } - varargExample() // => Argument has 0 elements - varargExample(1) // => Argument has 1 elements - varargExample(1, 2, 3) // => Argument has 3 elements - - /* - When a function consists of a single expression then the curly brackets can - be omitted. The body is specified after the = symbol. - */ - fun odd(x: Int): Boolean = x % 2 == 1 - println(odd(6)) // => false - println(odd(7)) // => true - - // If the return type can be inferred then we don't need to specify it. - fun even(x: Int) = x % 2 == 0 - println(even(6)) // => true - println(even(7)) // => false - - // Functions can take functions as arguments and return functions. - fun not(f: (Int) -> Boolean): (Int) -> Boolean { - return {n -> !f.invoke(n)} - } - // Named functions can be specified as arguments using the :: operator. - val notOdd = not(::odd) - val notEven = not(::even) - // Lambda expressions can be specified as arguments. - val notZero = not {n -> n == 0} - /* - If a lambda has only one parameter - then its declaration can be omitted (along with the ->). - The name of the single parameter will be "it". - */ - val notPositive = not {it > 0} - for (i in 0..4) { - println("${"notOdd(i)"} ${"notEven(i)"} ${"notZero(i)"} ${"notPositive(i)"}") - } - - // The "class" keyword is used to declare classes. - class ExampleClass(val x: Int) { - fun memberFunction(y: Int): Int { - return x + y - } - - infix fun infixMemberFunction(y: Int): Int { - return x * y - } - } - /* - To create a new instance we call the constructor. - Note that Kotlin does not have a "new" keyword. - */ - val fooExampleClass = ExampleClass(7) - // Member functions can be called using dot notation. - println(fooExampleClass.memberFunction(4)) // => 11 - /* - If a function has been marked with the "infix" keyword then it can be - called using infix notation. - */ - println(fooExampleClass infixMemberFunction 4) // => 28 - - /* - Data classes are a concise way to create classes that just hold data. - The "hashCode"/"equals" and "toString" methods are automatically generated. - */ - data class DataClassExample (val x: Int, val y: Int, val z: Int) - val fooData = DataClassExample(1, 2, 4) - println(fooData) // => DataClassExample(x=1, y=2, z=4) - - // Data classes have a "copy" function. - val fooCopy = fooData.copy(y = 100) - println(fooCopy) // => DataClassExample(x=1, y=100, z=4) - - // Objects can be destructured into multiple variables. - val (a, b, c) = fooCopy - println("$'a' $'b' $'c'") // => 1 100 4 - - // destructuring in "for" loop - for ((a, b, c) in listOf(fooData)) { - println("$'a' $'b' $'c'") // => 1 2 4 - } - - val mapData = mapOf("a" to 1, "b" to 2) - // Map.Entry is destructurable as well - for ((key, value) in mapData) { - println("$'key' -> $'value'") - } - - // The "with" function is similar to the JavaScript "with" statement. - data class MutableDataClassExample (var x: Int, var y: Int, var z: Int) - val fooMutableData = MutableDataClassExample(7, 4, 9) - with (fooMutableData) { - x -= 2 - y += 2 - z-- - } - println(fooMutableData) // => MutableDataClassExample(x=5, y=6, z=8) - - /* - We can create a list using the "listOf" function. - The list will be immutable - elements cannot be added or removed. - */ - val fooList = listOf("a", "b", "c") - println(fooList.size) // => 3 - println(fooList.first()) // => a - println(fooList.last()) // => c - // Elements of a list can be accessed by their index. - println(fooList[1]) // => b - - // A mutable list can be created using the "mutableListOf" function. - val fooMutableList = mutableListOf("a", "b", "c") - fooMutableList.add("d") - println(fooMutableList.last()) // => d - println(fooMutableList.size) // => 4 - - // We can create a set using the "setOf" function. - val fooSet = setOf("a", "b", "c") - println(fooSet.contains("a")) // => true - println(fooSet.contains("z")) // => false - - // We can create a map using the "mapOf" function. - val fooMap = mapOf("a" to 8, "b" to 7, "c" to 9) - // Map values can be accessed by their key. - println(fooMap["a"]) // => 8 - - /* - Sequences represent lazily-evaluated collections. - We can create a sequence using the "generateSequence" function. - */ - val fooSequence = generateSequence(1, { it + 1 }) - val x = fooSequence.take(10).toList() - println(x) // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - - // An example of using a sequence to generate Fibonacci numbers: - fun fibonacciSequence(): Sequence { - var a = 0L - var b = 1L - - fun next(): Long { - val result = a + b - a = b - b = result - return a - } - - return generateSequence(::next) - } - val y = fibonacciSequence().take(10).toList() - println(y) // => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] - - // Kotlin provides higher-order functions for working with collections. - val z = (1..9).map {it * 3} - .filter {it < 20} - .groupBy {it % 2 == 0} - .mapKeys {if (it.key) "even" else "odd"} - println(z) // => {odd=[3, 9, 15], even=[6, 12, 18]} - - // A "for" loop can be used with anything that provides an iterator. - for (c in "hello") { - println(c) - } - - // "while" loops work in the same way as other languages. - var ctr = 0 - while (ctr < 5) { - println(ctr) - ctr++ - } - do { - println(ctr) - ctr++ - } while (ctr < 10) - - /* - "if" can be used as an expression that returns a value. - For this reason the ternary ?: operator is not needed in Kotlin. - */ - val num = 5 - val message = if (num % 2 == 0) "even" else "odd" - println("$'num' is $'message'") // => 5 is odd - - // "when" can be used as an alternative to "if-else if" chains. - val i = 10 - when { - i < 7 -> println("first block") - fooString.startsWith("hello") -> println("second block") - else -> println("else block") - } - - // "when" can be used with an argument. - when (i) { - 0, 21 -> println("0 or 21") - in 1..20 -> println("in the range 1 to 20") - else -> println("none of the above") - } - - // "when" can be used as a function that returns a value. - var result = when (i) { - 0, 21 -> "0 or 21" - in 1..20 -> "in the range 1 to 20" - else -> "none of the above" - } - println(result) - - /* - We can check if an object is of a particular type by using the "is" operator. - If an object passes a type check then it can be used as that type without - explicitly casting it. - */ - fun smartCastExample(x: Any) : Boolean { - if (x is Boolean) { - // x is automatically cast to Boolean - return x - } else if (x is Int) { - // x is automatically cast to Int - return x > 0 - } else if (x is String) { - // x is automatically cast to String - return x.isNotEmpty() - } else { - return false - } - } - println(smartCastExample("Hello, world!")) // => true - println(smartCastExample("")) // => false - println(smartCastExample(5)) // => true - println(smartCastExample(0)) // => false - println(smartCastExample(true)) // => true - - // Smartcast also works with when block - fun smartCastWhenExample(x: Any) = when (x) { - is Boolean -> x - is Int -> x > 0 - is String -> x.isNotEmpty() - else -> false - } - - /* - Extensions are a way to add new functionality to a class. - This is similar to C# extension methods. - */ - fun String.remove(c: Char): String { - return this.filter {it != c} - } - println("Hello, world!".remove('l')) // => Heo, word! - } - - // Enum classes are similar to Java enum types. - enum class EnumExample { - A, B, C // Enum constants are separated with commas. - } - fun printEnum() = println(EnumExample.A) // => A - - // Since each enum is an instance of the enum class, they can be initialized as: - enum class EnumExample1(val value: Int) { - A(value = 1), - B(value = 2), - C(value = 3) - } - fun printProperty() = println(EnumExample1.A.value) // => 1 - - // Every enum has properties to obtain its name and ordinal(position) in the enum class declaration: - fun printName() = println(EnumExample1.A.name) // => A - fun printPosition() = println(EnumExample1.A.ordinal) // => 0 - - /* - The "object" keyword can be used to create singleton objects. - We cannot instantiate it but we can refer to its unique instance by its name. - This is similar to Scala singleton objects. - */ - object ObjectExample { - fun hello(): String { - return "hello" - } - - override fun toString(): String { - return "Hello, it's me, ${"ObjectExample::class.simpleName"}" - } - } - - - fun useSingletonObject() { - println(ObjectExample.hello()) // => hello - // In Kotlin, "Any" is the root of the class hierarchy, just like "Object" is in Java - val someRef: Any = ObjectExample - println(someRef) // => Hello, it's me, ObjectExample - } - - - /* The not-null assertion operator (!!) converts any value to a non-null type and - throws an exception if the value is null. - */ - var b: String? = "abc" - val l = b!!.length - - data class Counter(var value: Int) { - // overload Counter += Int - operator fun plusAssign(increment: Int) { - this.value += increment - } - - // overload Counter++ and ++Counter - operator fun inc() = Counter(value + 1) - - // overload Counter + Counter - operator fun plus(other: Counter) = Counter(this.value + other.value) - - // overload Counter * Counter - operator fun times(other: Counter) = Counter(this.value * other.value) - - // overload Counter * Int - operator fun times(value: Int) = Counter(this.value * value) - - // overload Counter in Counter - operator fun contains(other: Counter) = other.value == this.value - - // overload Counter[Int] = Int - operator fun set(index: Int, value: Int) { - this.value = index + value - } - - // overload Counter instance invocation - operator fun invoke() = println("The value of the counter is $'value'") - - } - /* You can also overload operators through extension methods */ - // overload -Counter - operator fun Counter.unaryMinus() = Counter(-this.value) - - fun operatorOverloadingDemo() { - var counter1 = Counter(0) - var counter2 = Counter(5) - counter1 += 7 - println(counter1) // => Counter(value=7) - println(counter1 + counter2) // => Counter(value=12) - println(counter1 * counter2) // => Counter(value=35) - println(counter2 * 2) // => Counter(value=10) - println(counter1 in Counter(5)) // => false - println(counter1 in Counter(7)) // => true - counter1[26] = 10 - println(counter1) // => Counter(value=36) - counter1() // => The value of the counter is 36 - println(-counter2) // => Counter(value=-5) - } - """ - ) - - val result = - KotlinCompilation() - .apply { - sources = listOf(source) - compilerPluginRegistrars = listOf(AnalyzerRegistrar()) - verbose = false - pluginOptions = - listOf( - PluginOption("semanticdb-kotlinc", "sourceroot", path.toString()), - PluginOption("semanticdb-kotlinc", "targetroot", buildPath.toString()) - ) - commandLineProcessors = listOf(AnalyzerCommandLineProcessor()) - workingDir = path.toFile() - } - .compile() - - result.exitCode shouldBe KotlinCompilation.ExitCode.OK - } - - - @Test - fun `compound package name semicolon test`(@TempDir path: Path) { - val document = - compileSemanticdb( - path, """ - package hello.sample; - class Apple - """.trimIndent() - ) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.REFERENCE - symbol = "hello/" - range { - startLine = 0 - startCharacter = 8 - endLine = 0 - endCharacter = 13 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "hello/sample/" - range { - startLine = 0 - startCharacter = 14 - endLine = 0 - endCharacter = 20 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "hello/sample/Apple#" - range { - startLine = 1 - startCharacter = 6 - endLine = 1 - endCharacter = 11 - } - enclosingRange { - startLine = 1 - endLine = 1 - endCharacter = 11 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "hello/sample/Apple#``()." - range { - startLine = 1 - startCharacter = 6 - endLine = 1 - endCharacter = 11 - } - enclosingRange { - startLine = 1 - endLine = 1 - endCharacter = 11 - } - }, - ) - - assertSoftly(document.occurrencesList) { - withClue(document.occurrencesList) { occurrences.forEach(::shouldContain) } - } - - val symbols = - arrayOf( - SymbolInformation { - symbol = "hello/sample/Apple#" - language = KOTLIN - displayName = "Apple" - documentation = - Documentation { - format = Semanticdb.Documentation.Format.MARKDOWN - message = "```kotlin\npublic final class Apple : Any\n```" - } - }) - - assertSoftly(document.symbolsList) { withClue(this) { symbols.forEach(::shouldContain) } } - } - - - @Test - fun `simple package name semicolon test`(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample; - class Banana { - fun foo() { } - }""" - ) - - val occurrences = - arrayOf( - SymbolOccurrence { - role = Role.REFERENCE - symbol = "sample/" - range { - startLine = 0 - startCharacter = 8 - endLine = 0 - endCharacter = 14 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Banana#" - range { - startLine = 1 - startCharacter = 6 - endLine = 1 - endCharacter = 12 - } - enclosingRange { - startLine = 1 - endLine = 3 - endCharacter = 1 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Banana#foo()." - range { - startLine = 2 - startCharacter = 8 - endLine = 2 - endCharacter = 11 - } - enclosingRange { - startLine = 2 - startCharacter = 4 - endLine = 2 - endCharacter = 17 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "sample/Banana#" - range { - startLine = 1 - startCharacter = 6 - endLine = 1 - endCharacter = 12 - } - enclosingRange { - startLine = 1 - endLine = 3 - endCharacter = 1 - } - }, - ) - assertSoftly(document.occurrencesList) { - withClue(this) { occurrences.forEach(::shouldContain) } - } - - val symbols = - arrayOf( - SymbolInformation { - symbol = "sample/Banana#" - language = KOTLIN - displayName = "Banana" - documentation = - Documentation { - format = Semanticdb.Documentation.Format.MARKDOWN - message = "```kotlin\npublic final class Banana : Any\n```" - } - }, - SymbolInformation { - symbol = "sample/Banana#foo()." - language = KOTLIN - displayName = "foo" - documentation = - Documentation { - format = Semanticdb.Documentation.Format.MARKDOWN - message = "```kotlin\npublic final fun foo(): Unit\n```" - } - }) - assertSoftly(document.symbolsList) { withClue(this) { symbols.forEach(::shouldContain) } } - } - - @Test - fun documentation(@TempDir path: Path) { - val document = - compileSemanticdb( - path, - """ - package sample - import java.io.Serializable - abstract class DocstringSuperclass - - /** Example class docstring */ - class Docstrings: DocstringSuperclass(), Serializable - - /** - * Example method docstring - * - **/ - inline fun docstrings(msg: String): Int { return msg.length } - """.trimIndent() - ) - document.assertDocumentation("sample/Docstrings#", "Example class docstring") - document.assertDocumentation("sample/docstrings().", "Example method docstring") - } - - private fun TextDocument.assertDocumentation(symbol: String, expectedDocumentation: String) { - val markdown = - this.symbolsList.find { it.symbol == symbol }?.documentation?.message - ?: fail("no documentation for symbol $symbol") - val obtainedDocumentation = markdown.split("----").last().trim() - assertEquals(expectedDocumentation, obtainedDocumentation) - } -} diff --git a/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/SemanticdbSymbolsTest.kt b/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/SemanticdbSymbolsTest.kt deleted file mode 100644 index d3cef3027..000000000 --- a/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/SemanticdbSymbolsTest.kt +++ /dev/null @@ -1,726 +0,0 @@ -package com.sourcegraph.semanticdb_kotlinc.test - -import com.sourcegraph.semanticdb_kotlinc.* -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.Documentation.Format -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.Language -import com.sourcegraph.semanticdb_kotlinc.Semanticdb.SymbolOccurrence.Role -import com.sourcegraph.semanticdb_kotlinc.test.ExpectedSymbols.SemanticdbData -import com.sourcegraph.semanticdb_kotlinc.test.ExpectedSymbols.SymbolCacheData -import com.tschuchort.compiletesting.SourceFile -import kotlin.contracts.ExperimentalContracts -import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi -import org.junit.jupiter.api.TestFactory - -@ExperimentalCompilerApi -@ExperimentalContracts -class SemanticdbSymbolsTest { - @TestFactory - fun `method disambiguator`() = - listOf( - ExpectedSymbols( - "Basic two methods", - SourceFile.testKt( - """ - |class Test { - | fun sample() {} - | fun sample(x: Int) {} - |} - |""".trimMargin()), - symbolsCacheData = - SymbolCacheData( - listOf("Test#sample().".symbol(), "Test#sample(+1).".symbol()), - )), - ExpectedSymbols( - "Inline class constructor", - SourceFile.testKt( - """ - |class Test(val x: Int) - |""".trimMargin()), - symbolsCacheData = SymbolCacheData(listOf("Test#``().(x)".symbol()))), - ExpectedSymbols( - "Inline + secondary class constructors", - SourceFile.testKt( - """ - |class Test(val x: Int) { - | constructor(y: Long): this(y.toInt()) - | constructor(z: String): this(z.toInt()) - |} - |""".trimMargin()), - symbolsCacheData = - SymbolCacheData( - listOf( - "Test#``().(x)".symbol(), - "Test#``(+1).(y)".symbol(), - "Test#``(+2).(z)".symbol()))), - ExpectedSymbols( - "Disambiguator number is not affected by different named methods", - SourceFile.testKt( - """ - |class Test { - | fun sample() {} - | fun test() {} - | fun test(x: Int) {} - |} - |""".trimMargin()), - symbolsCacheData = - SymbolCacheData( - listOf("Test#test().".symbol(), "Test#test(+1).".symbol()))), - ExpectedSymbols( - "Top level overloaded functions", - SourceFile.testKt( - """ - |fun test() {} - |fun test(x: Int) {} - |""".trimMargin()), - symbolsCacheData = - SymbolCacheData(listOf("test().".symbol(), "test(+1).(x)".symbol()))), - ExpectedSymbols( - "Annotations incl annotation type alias", - SourceFile.testKt( - """ - |import kotlin.contracts.ExperimentalContracts - |import kotlin.test.Test - | - |@ExperimentalContracts - |class Banaan { - | @Test - | fun test() {} - |} - |""".trimMargin()), - symbolsCacheData = - SymbolCacheData( - listOf( - "kotlin/contracts/ExperimentalContracts#".symbol(), - "kotlin/test/Test#".symbol()))), - // https://kotlinlang.slack.com/archives/C7L3JB43G/p1624995376114900 - /*ExpectedSymbols( - "Method call with type parameters", - SourceFile.testKt(""" - import org.junit.jupiter.api.io.TempDir - val burger = LinkedHashMap() - """), - symbolsCacheData = SymbolCacheData( - listOf("kotlin/collection/TypeAliasesKt#LinkedHashMap#``().".symbol()) - ) - )*/ - ) - .mapCheckExpectedSymbols() - - - @TestFactory - fun `check package symbols`() = - listOf( - ExpectedSymbols( - "single component package name", - SourceFile.testKt( - """ - |package main - | - |class Test - |""".trimMargin()), - symbolsCacheData = SymbolCacheData(listOf("main/Test#".symbol()), 0)), - ExpectedSymbols( - "multi component package name", - SourceFile.testKt( - """ - |package test.sample.main - | - |class Test - |""".trimMargin()), - symbolsCacheData = - SymbolCacheData(listOf("test/sample/main/Test#".symbol()), 0)), - ExpectedSymbols( - "no package name", - SourceFile.testKt( - """ - |class Test - |""".trimMargin()), - symbolsCacheData = SymbolCacheData(listOf("Test#".symbol()), 0))) - .mapCheckExpectedSymbols() - - @TestFactory - fun `check locals counts`() = - listOf( - ExpectedSymbols( - "simple variables", - SourceFile.testKt( - """ - |fun test() { - | val x = "hello" - | println(x) - |} - |""".trimMargin()), - symbolsCacheData = SymbolCacheData(localsCount = 1))) - .mapCheckExpectedSymbols() - - @TestFactory - fun `builtin symbols`() = - listOf( - ExpectedSymbols( - "types", - SourceFile.testKt( - """ - |var x: Int = 1 - |lateinit var y: Unit - |lateinit var z: Any - |lateinit var w: Nothing - |""".trimMargin()), - symbolsCacheData = - SymbolCacheData( - listOf( - "kotlin/Int#".symbol(), - "kotlin/Unit#".symbol(), - "kotlin/Any#".symbol(), - "kotlin/Nothing#".symbol()))), - ExpectedSymbols( - "functions", - SourceFile.testKt( - """ - |val x = mapOf() - |fun main() { - | println() - |} - |""".trimMargin()), - symbolsCacheData = - SymbolCacheData( - listOf( - "kotlin/collections/mapOf(+2).".symbol(), - "kotlin/io/println(+10).".symbol())))) - .mapCheckExpectedSymbols() - - @TestFactory - fun `reference expressions`() = - listOf( - ExpectedSymbols( - "dot qualified expression", - SourceFile.testKt( - """ - |import java.lang.System - | - |fun main() { - | System.err - |} - |""".trimMargin()), - symbolsCacheData = SymbolCacheData(listOf("java/lang/System#err.".symbol())))) - .mapCheckExpectedSymbols() - - @TestFactory - fun `properties with getters-setters`() = - listOf( - ExpectedSymbols( - "top level properties - implicit", - SourceFile.testKt( - """ - |var x: Int = 5 - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "x." - range { - startLine = 0 - startCharacter = 4 - endLine = 0 - endCharacter = 5 - } - enclosingRange { - endCharacter = 14 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "getX()." - range { - startLine = 0 - startCharacter = 4 - endLine = 0 - endCharacter = 5 - } - enclosingRange { - endCharacter = 14 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "setX()." - range { - startLine = 0 - startCharacter = 4 - endLine = 0 - endCharacter = 5 - } - enclosingRange { - endCharacter = 14 - } - })), - ), - ExpectedSymbols( - "top level properties - explicit getter", - SourceFile.testKt( - """ - |var x: Int = 5 - | get() = field + 10 - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "x." - range { - startLine = 0 - startCharacter = 4 - endLine = 0 - endCharacter = 5 - } - enclosingRange { - endLine = 1 - endCharacter = 22 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "setX()." - range { - startLine = 0 - startCharacter = 4 - endLine = 0 - endCharacter = 5 - } - enclosingRange { - endLine = 1 - endCharacter = 22 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "getX()." - range { - startLine = 1 - startCharacter = 4 - endLine = 1 - endCharacter = 7 - } - enclosingRange { - startLine = 1 - startCharacter = 4 - endLine = 1 - endCharacter = 22 - } - })), - ), - ExpectedSymbols( - "top level properties - explicit setter", - SourceFile.testKt( - """ - |var x: Int = 5 - | set(value) { field = value + 5 } - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "x." - range { - startLine = 0 - startCharacter = 4 - endLine = 0 - endCharacter = 5 - } - enclosingRange { - endLine = 1 - endCharacter = 36 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "getX()." - range { - startLine = 0 - startCharacter = 4 - endLine = 0 - endCharacter = 5 - } - enclosingRange { - endLine = 1 - endCharacter = 36 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "setX()." - range { - startLine = 1 - startCharacter = 4 - endLine = 1 - endCharacter = 7 - } - enclosingRange { - startLine = 1 - startCharacter = 4 - endLine = 1 - endCharacter = 36 - } - })), - ), - ExpectedSymbols( - "top level properties - explicit getter & setter", - SourceFile.testKt( - """ - |var x: Int = 5 - | get() = field + 10 - | set(value) { field = value + 10 } - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "x." - range { - startLine = 0 - startCharacter = 4 - endLine = 0 - endCharacter = 5 - } - enclosingRange { - endLine = 2 - endCharacter = 37 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "getX()." - range { - startLine = 1 - startCharacter = 4 - endLine = 1 - endCharacter = 7 - } - enclosingRange { - startLine = 1 - startCharacter = 4 - endLine = 1 - endCharacter = 22 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "setX()." - range { - startLine = 2 - startCharacter = 4 - endLine = 2 - endCharacter = 7 - } - enclosingRange { - startLine = 2 - startCharacter = 4 - endLine = 2 - endCharacter = 37 - } - })), - ), - ExpectedSymbols( - "class constructor properties", - SourceFile.testKt( - """ - |class Test(var sample: Int, text: String): Throwable(sample.toString()) { - | fun test() { - | println(sample) - | } - |} - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Test#``().(sample)" - range { - startLine = 0 - startCharacter = 15 - endLine = 0 - endCharacter = 21 - } - enclosingRange { - startCharacter = 11 - endCharacter = 26 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Test#sample." - range { - startLine = 0 - startCharacter = 15 - endLine = 0 - endCharacter = 21 - } - enclosingRange { - startCharacter = 11 - endCharacter = 26 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Test#getSample()." - range { - startLine = 0 - startCharacter = 15 - endLine = 0 - endCharacter = 21 - } - enclosingRange { - startCharacter = 11 - endCharacter = 26 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Test#setSample()." - range { - startLine = 0 - startCharacter = 15 - endLine = 0 - endCharacter = 21 - } - enclosingRange { - startCharacter = 11 - endCharacter = 26 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "Test#``().(sample)" - range { - startLine = 0 - startCharacter = 53 - endLine = 0 - endCharacter = 59 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "Test#sample." - range { - startLine = 2 - startCharacter = 16 - endLine = 2 - endCharacter = 22 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "Test#getSample()." - range { - startLine = 2 - startCharacter = 16 - endLine = 2 - endCharacter = 22 - } - }, - )))) - .mapCheckExpectedSymbols() - - @TestFactory - fun `class constructors`() = - listOf( - ExpectedSymbols( - "implicit primary constructor", - SourceFile.testKt( - """ - |class Banana - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Banana#" - range { - startLine = 0 - startCharacter = 6 - endLine = 0 - endCharacter = 12 - } - enclosingRange { - endCharacter = 12 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Banana#``()." - range { - startLine = 0 - startCharacter = 6 - endLine = 0 - endCharacter = 12 - } - enclosingRange { - endCharacter = 12 - } - }, - ))), - ExpectedSymbols( - "explicit primary constructor without keyword", - SourceFile.testKt( - """ - |class Banana(size: Int) - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Banana#" - range { - startLine = 0 - startCharacter = 6 - endLine = 0 - endCharacter = 12 - } - enclosingRange { - endCharacter = 23 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Banana#``()." - range { - startLine = 0 - startCharacter = 6 - endLine = 0 - endCharacter = 12 - } - enclosingRange { - startCharacter = 12 - endCharacter = 23 - } - }, - ))), - ExpectedSymbols( - "explicit primary constructor with keyword", - SourceFile.testKt( - """ - |class Banana constructor(size: Int) - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Banana#" - range { - startLine = 0 - startCharacter = 6 - endLine = 0 - endCharacter = 12 - } - enclosingRange { - endCharacter = 35 - } - }, - SymbolOccurrence { - role = Role.DEFINITION - symbol = "Banana#``()." - range { - startLine = 0 - startCharacter = 13 - endLine = 0 - endCharacter = 24 - } - enclosingRange { - startCharacter = 13 - endCharacter = 35 - } - }, - )))) - .mapCheckExpectedSymbols() - - @TestFactory - fun `Single Abstract Method interface`() = - listOf( - ExpectedSymbols( - "basic java.lang.Runnable", - SourceFile.testKt( - """ - |val x = Runnable { }.run() - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedOccurrences = - listOf( - SymbolOccurrence { - role = Role.REFERENCE - symbol = "java/lang/Runnable#" - range { - startLine = 0 - startCharacter = 8 - endLine = 0 - endCharacter = 16 - } - }, - SymbolOccurrence { - role = Role.REFERENCE - symbol = "java/lang/Runnable#run()." - range { - startLine = 0 - startCharacter = 21 - endLine = 0 - endCharacter = 24 - } - })))) - .mapCheckExpectedSymbols() - - @TestFactory - fun kdoc() = - listOf( - ExpectedSymbols( - "empty kdoc line", - SourceFile.testKt( - """ - |/** - | - |hello world - |* test content - |*/ - |val x = "" - |""".trimMargin()), - semanticdb = - SemanticdbData( - expectedSymbols = - listOf( - SymbolInformation { - symbol = "x." - displayName = "x" - language = Language.KOTLIN - documentation { - message = - "```kotlin\npublic final val x: String\n```\n\n----\n\n\nhello world\n test content\n" - format = Format.MARKDOWN - } - }, - SymbolInformation { - symbol = "getX()." - displayName = "x" - language = Language.KOTLIN - documentation { - message = - "```kotlin\npublic get(): String\n```\n\n----\n\n\nhello world\n test content\n" - format = Format.MARKDOWN - } - })))) - .mapCheckExpectedSymbols() -} diff --git a/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/Utils.kt b/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/Utils.kt deleted file mode 100644 index 77ffc63d2..000000000 --- a/semanticdb-kotlinc/src/test/kotlin/com/sourcegraph/semanticdb_kotlinc/test/Utils.kt +++ /dev/null @@ -1,203 +0,0 @@ -package com.sourcegraph.semanticdb_kotlinc.test - -import com.sourcegraph.semanticdb_kotlinc.* -import com.sourcegraph.semanticdb_kotlinc.AnalyzerCheckers.Companion.visitors -import com.tschuchort.compiletesting.KotlinCompilation -import com.tschuchort.compiletesting.SourceFile -import io.kotest.assertions.assertSoftly -import io.kotest.assertions.throwables.shouldNotThrowAny -import io.kotest.matchers.collections.shouldContainInOrder -import io.kotest.matchers.shouldBe -import java.nio.file.Path -import java.nio.file.Paths -import kotlin.contracts.ExperimentalContracts -import org.intellij.lang.annotations.Language -import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension -import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar -import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.FirSession -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.DeclarationCheckers -import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirFileChecker -import org.jetbrains.kotlin.fir.declarations.FirFile -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar -import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter -import org.junit.jupiter.api.Assumptions.assumeFalse -import org.junit.jupiter.api.DynamicTest -import org.junit.jupiter.api.DynamicTest.dynamicTest - -data class ExpectedSymbols( - val testName: String, - val source: SourceFile, - val symbolsCacheData: SymbolCacheData? = null, - val semanticdb: SemanticdbData? = null -) { - data class SemanticdbData( - val expectedOccurrences: List? = null, - val expectedSymbols: List? = null - ) - - data class SymbolCacheData( - val expectedGlobals: List? = null, - val localsCount: Int? = null - ) -} - -fun SourceFile.Companion.testKt(@Language("kotlin") contents: String): SourceFile = - kotlin("Test.kt", contents) - -@ExperimentalCompilerApi -@ExperimentalContracts -fun List.mapCheckExpectedSymbols(): List = - this.flatMap { (testName, source, symbolsData, semanticdbData) -> - val globals = GlobalSymbolsCache(testing = true) - val locals = LocalSymbolsCache() - lateinit var document: Semanticdb.TextDocument - val compilation = configureTestCompiler(source, globals, locals) { document = it } - listOf( - dynamicTest("$testName - compilation") { - val result = shouldNotThrowAny { compilation.compile() } - result.exitCode shouldBe KotlinCompilation.ExitCode.OK - }, - dynamicTest("$testName - symbols") { - symbolsData?.apply { - println( - "checking symbols: ${expectedGlobals?.size ?: 0} globals and presence of $localsCount locals") - checkContainsExpectedSymbols(globals, locals, expectedGlobals, localsCount) - } - ?: assumeFalse(true) - }, - dynamicTest("$testName - semanticdb") { - semanticdbData?.apply { - println( - "checking semanticdb: ${expectedOccurrences?.size ?: 0} occurrences and ${expectedSymbols?.size ?: 0} symbols") - checkContainsExpectedSemanticdb(document, expectedOccurrences, expectedSymbols) - } - ?: assumeFalse(true) - }) - } - -@ExperimentalContracts -fun checkContainsExpectedSymbols( - globals: GlobalSymbolsCache, - locals: LocalSymbolsCache, - expectedGlobals: List?, - localsCount: Int? = null -) { - assertSoftly(globals) { expectedGlobals?.let { this.shouldContainInOrder(it) } } - localsCount?.also { locals.size shouldBe it } -} - -@ExperimentalContracts -fun checkContainsExpectedSemanticdb( - document: Semanticdb.TextDocument, - expectedOccurrences: List?, - expectedSymbols: List? -) { - assertSoftly(document.occurrencesList) { - expectedOccurrences?.let { this.shouldContainInOrder(it) } - } - assertSoftly(document.symbolsList) { expectedSymbols?.let { this.shouldContainInOrder(it) } } -} - -@OptIn(ExperimentalCompilerApi::class) -@ExperimentalContracts -private fun configureTestCompiler( - source: SourceFile, - globals: GlobalSymbolsCache, - locals: LocalSymbolsCache, - hook: (Semanticdb.TextDocument) -> Unit = {} -): KotlinCompilation { - val compilation = - KotlinCompilation().apply { - sources = listOf(source) - inheritClassPath = true - verbose = false - } - - val analyzer = semanticdbVisitorAnalyzer(globals, locals, compilation.workingDir.toPath(), hook) - compilation.apply { compilerPluginRegistrars = listOf(analyzer) } - return compilation -} - -@OptIn(ExperimentalContracts::class) -private class TestAnalyzerDeclarationCheckers( - globals: GlobalSymbolsCache, - locals: LocalSymbolsCache, - sourceRoot: Path -) : AnalyzerCheckers.AnalyzerDeclarationCheckers(sourceRoot) { - override val fileCheckers: Set = - setOf( - object : FirFileChecker(MppCheckerKind.Common) { - context(context: CheckerContext, reporter: DiagnosticReporter) - override fun check(declaration: FirFile) { - val ktFile = declaration.sourceFile ?: return - val lineMap = LineMap(declaration) - val visitor = SemanticdbVisitor(sourceRoot, ktFile, lineMap, globals, locals) - visitors[ktFile] = visitor - } - }, - AnalyzerCheckers.SemanticImportsChecker()) -} - -private class TestAnalyzerCheckers(session: FirSession) : AnalyzerCheckers(session) { - @OptIn(ExperimentalContracts::class) - override val declarationCheckers: DeclarationCheckers - get() = - TestAnalyzerDeclarationCheckers( - session.testAnalyzerParamsProvider.globals, - session.testAnalyzerParamsProvider.locals, - session.testAnalyzerParamsProvider.sourceroot - ) -} - -@OptIn(ExperimentalContracts::class) -class TestAnalyzerParamsProvider( - session: FirSession, - var globals: GlobalSymbolsCache, - var locals: LocalSymbolsCache, - sourceroot: Path, -) : AnalyzerParamsProvider(session, sourceroot) { - companion object { - fun getFactory( - globals: GlobalSymbolsCache, - locals: LocalSymbolsCache, - sourceroot: Path, - ): Factory { - return Factory { TestAnalyzerParamsProvider(it, globals, locals, sourceroot) } - } - } -} - -val FirSession.testAnalyzerParamsProvider: TestAnalyzerParamsProvider by FirSession - .sessionComponentAccessor() - -@OptIn(ExperimentalCompilerApi::class) -@ExperimentalContracts -fun semanticdbVisitorAnalyzer( - globals: GlobalSymbolsCache, - locals: LocalSymbolsCache, - sourceroot: Path, - hook: (Semanticdb.TextDocument) -> Unit = {} -): CompilerPluginRegistrar { - return object : CompilerPluginRegistrar() { - override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) { - FirExtensionRegistrarAdapter.registerExtension( - object : FirExtensionRegistrar() { - override fun ExtensionRegistrarContext.configurePlugin() { - +TestAnalyzerParamsProvider.getFactory(globals, locals, sourceroot) - +::TestAnalyzerCheckers - } - }) - IrGenerationExtension.registerExtension( - PostAnalysisExtension( - sourceRoot = sourceroot, targetRoot = Paths.get(""), callback = hook)) - } - - override val supportsK2: Boolean - get() = true - } -} From 0e152d3dfa462592c46a48eaa0b9c345e6d9cb7a Mon Sep 17 00:00:00 2001 From: jupblb Date: Thu, 28 May 2026 12:56:22 +0200 Subject: [PATCH 17/21] PR3 (D4): aggregator drops the legacy SemanticDB fallback The aggregator now consumes SCIP shards only. The legacy SemanticDB-based reader/aggregator is removed. Wiring: * IndexSemanticdbCommand: remove the --use-scip-shards flag and the ScipSemanticdb.run() else branch; always call ScipShardAggregator. * BazelBuildTool: switch the Bazel main entry to ScipShardAggregator. * MinimizedSnapshotScipGenerator: drop the --use-scip-shards argument (the default switched in PR2 K4 and the flag is being removed now). * build.sbt (kotlincSnapshots): drop --use-scip-shards from the index-semanticdb invocation. Delete the legacy SemanticDB-consuming aggregator sources, none of which have any remaining callers: * ScipSemanticdb.java * SemanticdbWalker.java * SemanticdbTreeVisitor.java * ScipTextDocument.java * SignatureFormatter.java * SignatureFormatterException.java * SymbolOccurrences.java * Symtab.java * RangeComparator.java Validation: sbt unit/test (28 passing), sbt snapshots/test (102 passing). --- build.sbt | 2 +- .../commands/IndexSemanticdbCommand.scala | 15 +- .../scip_semanticdb/BazelBuildTool.java | 2 +- .../scip_semanticdb/RangeComparator.java | 29 - .../scip_semanticdb/ScipSemanticdb.java | 427 --------- .../scip_semanticdb/ScipTextDocument.java | 62 -- .../SemanticdbTreeVisitor.java | 80 -- .../scip_semanticdb/SemanticdbWalker.java | 52 -- .../scip_semanticdb/SignatureFormatter.java | 822 ------------------ .../SignatureFormatterException.java | 20 - .../scip_semanticdb/SymbolOccurrences.java | 26 - .../sourcegraph/scip_semanticdb/Symtab.java | 25 - .../MinimizedSnapshotScipGenerator.scala | 1 - 13 files changed, 3 insertions(+), 1560 deletions(-) delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/RangeComparator.java delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipSemanticdb.java delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipTextDocument.java delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SemanticdbTreeVisitor.java delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SemanticdbWalker.java delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SignatureFormatter.java delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SignatureFormatterException.java delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/SymbolOccurrences.java delete mode 100644 scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/Symtab.java diff --git a/build.sbt b/build.sbt index e5ccc5aeb..d7930220a 100644 --- a/build.sbt +++ b/build.sbt @@ -533,7 +533,7 @@ lazy val semanticdbKotlincMinimized = project Def.sequential( Compile / compile, (cli / Compile / runMain).toTask( - s" $mainCls index-semanticdb --no-emit-inverse-relationships --use-scip-shards --cwd $srcRoot --output $scipOut $tgtRoot" + s" $mainCls index-semanticdb --no-emit-inverse-relationships --cwd $srcRoot --output $scipOut $tgtRoot" ), (cli / Compile / runMain).toTask( s" $mainCls snapshot --cwd $srcRoot --output $snapDir ${file(scipOut).getParentFile.getAbsolutePath}" diff --git a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala index 998f86e7b..9d94c6eaa 100644 --- a/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala +++ b/scip-java/src/main/scala/com/sourcegraph/scip_java/commands/IndexSemanticdbCommand.scala @@ -12,7 +12,6 @@ import com.sourcegraph.scip_java.BuildInfo import com.sourcegraph.scip_java.buildtools.ClasspathEntry import com.sourcegraph.scip_semanticdb.ConsoleScipSemanticdbReporter import com.sourcegraph.scip_semanticdb.ScipOutputFormat -import com.sourcegraph.scip_semanticdb.ScipSemanticdb import com.sourcegraph.scip_semanticdb.ScipSemanticdbOptions import com.sourcegraph.scip_semanticdb.ScipShardAggregator import moped.annotations._ @@ -61,15 +60,6 @@ final case class IndexSemanticdbCommand( "Maven->Maven or Gradle->Gradle projects because those build tools compile sources to classfiles inside directories." ) allowExportingGlobalSymbolsFromDirectoryEntries: Boolean = true, - @Description( - "If true, walk targetroots for *.scip shards (META-INF/scip/...) emitted by the " + - "compiler plug-ins instead of *.semanticdb files. The aggregator rewrites placeholder " + - "symbols into the final 'scip-java' scheme and merges per-source shards into the " + - "output index. Defaults to true now that both the javac and kotlinc plug-ins emit " + - "shards. Pass --use-scip-shards=false to fall back to the legacy SemanticDB-based " + - "aggregator." - ) - useScipShards: Boolean = true, @Inline() app: Application = Application.default ) extends Command { @@ -118,10 +108,7 @@ final case class IndexSemanticdbCommand( allowEmptyIndex, allowExportingGlobalSymbolsFromDirectoryEntries ) - if (useScipShards) - ScipShardAggregator.run(options) - else - ScipSemanticdb.run(options) + ScipShardAggregator.run(options) postPackages(packages) if (!app.reporter.hasErrors()) { app.info(options.output.toString) diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/BazelBuildTool.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/BazelBuildTool.java index e5fb161f3..10428b931 100644 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/BazelBuildTool.java +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/BazelBuildTool.java @@ -66,7 +66,7 @@ public boolean hasErrors() { /* allowEmptyIndex */ true, /* indexDirectoryEntries */ false // because Bazel only compiles to jar files. ); - ScipSemanticdb.run(scipOptions); + ScipShardAggregator.run(scipOptions); if (!scipOptions.reporter.hasErrors()) { System.out.println("done: " + scipOptions.output); diff --git a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/RangeComparator.java b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/RangeComparator.java deleted file mode 100644 index aa16a5af2..000000000 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/RangeComparator.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.sourcegraph.scip_semanticdb; - -import com.sourcegraph.semanticdb_javac.Semanticdb.Range; - -/** - * Comparator that sorts SemanticDB ranges by appearance in the document. - * - *