From 201b26aebc8390467da0fb32b4340ca7cf782f2a Mon Sep 17 00:00:00 2001 From: Noah Santschi-Cooney Date: Thu, 8 Jun 2023 11:47:31 +0100 Subject: [PATCH] enclosing symbol --- javac.20230208_134110.args | 1 + javac.20230208_134158.args | 1 + scip-java-proto/src/main/protobuf/scip.proto | 2 ++ .../scip_semanticdb/ScipSemanticdb.java | 1 + .../semanticdb_javac/SemanticdbBuilders.java | 6 +++- .../src/main/protobuf/semanticdb.proto | 1 + .../semanticdb_javac/SemanticdbVisitor.java | 34 ++++++++++++++++--- 7 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 javac.20230208_134110.args create mode 100644 javac.20230208_134158.args diff --git a/javac.20230208_134110.args b/javac.20230208_134110.args new file mode 100644 index 000000000..66cac9a8a --- /dev/null +++ b/javac.20230208_134110.args @@ -0,0 +1 @@ +@/var/folders/ly/1bcb5bdx5gg_hrftww5gjg5w0000gn/T/sbt_922d7e7d/argfile diff --git a/javac.20230208_134158.args b/javac.20230208_134158.args new file mode 100644 index 000000000..08a60cbdf --- /dev/null +++ b/javac.20230208_134158.args @@ -0,0 +1 @@ +@/var/folders/ly/1bcb5bdx5gg_hrftww5gjg5w0000gn/T/sbt_7eb9ebb/argfile diff --git a/scip-java-proto/src/main/protobuf/scip.proto b/scip-java-proto/src/main/protobuf/scip.proto index 09f510ba7..194f14cc3 100644 --- a/scip-java-proto/src/main/protobuf/scip.proto +++ b/scip-java-proto/src/main/protobuf/scip.proto @@ -335,6 +335,8 @@ message Occurrence { SyntaxKind syntax_kind = 5; // Diagnostics that have been reported for this specific range. repeated Diagnostic diagnostics = 6; + + string owner = 7; } // Represents a diagnostic, such as a compiler error or warning, which should be 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 index 3545a42d0..0804a6098 100644 --- a/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipSemanticdb.java +++ b/scip-semanticdb/src/main/java/com/sourcegraph/scip_semanticdb/ScipSemanticdb.java @@ -111,6 +111,7 @@ private void processTypedDocument(Path path, PackageTable packages) { tdoc.addOccurrences( Scip.Occurrence.newBuilder() .addAllRange(range) + .setOwner(occ.getContainer()) .setSymbol(typedSymbol(occ.getSymbol(), pkg)) .setSymbolRoles(role)); } 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 index 492572a1a..9523b0b9c 100644 --- a/semanticdb-java/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbBuilders.java +++ b/semanticdb-java/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbBuilders.java @@ -52,11 +52,15 @@ public static Semanticdb.Signature signature(Semanticdb.TypeSignature.Builder si // SemanticDB Symbols public static Semanticdb.SymbolOccurrence symbolOccurrence( - String symbol, Semanticdb.Range range, Semanticdb.SymbolOccurrence.Role role) { + String symbol, + Semanticdb.Range range, + Semanticdb.SymbolOccurrence.Role role, + String container) { return Semanticdb.SymbolOccurrence.newBuilder() .setSymbol(symbol) .setRange(range) .setRole(role) + .setContainer(container) .build(); } diff --git a/semanticdb-java/src/main/protobuf/semanticdb.proto b/semanticdb-java/src/main/protobuf/semanticdb.proto index e8fea62d1..2057e8024 100644 --- a/semanticdb-java/src/main/protobuf/semanticdb.proto +++ b/semanticdb-java/src/main/protobuf/semanticdb.proto @@ -177,6 +177,7 @@ message SymbolOccurrence { Range range = 1; string symbol = 2; Role role = 3; + string container = 4; } message Scope { diff --git a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java index 120b449e9..b8ab07c61 100644 --- a/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java +++ b/semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java @@ -40,6 +40,7 @@ public class SemanticdbVisitor extends TreePathScanner { private final ArrayList occurrences; private final ArrayList symbolInfos; private String source; + private Deque methodStack; public SemanticdbVisitor( JavacTask task, @@ -47,6 +48,7 @@ public SemanticdbVisitor( TaskEvent event, SemanticdbJavacOptions options, JavacTypes javacTypes) { + this.methodStack = new ArrayDeque<>(); this.task = task; this.globals = globals; // Reused cache between compilation units. this.locals = new LocalSymbolsCache(); // Fresh cache per compilation unit. @@ -177,10 +179,21 @@ public Void visitClass(ClassTree node, Void unused) { public Void visitMethod(MethodTree node, Void unused) { if (node instanceof JCTree.JCMethodDecl) { JCTree.JCMethodDecl meth = (JCTree.JCMethodDecl) node; - if (meth.sym == null) return super.visitMethod(node, unused); + + methodStack.add(meth.sym); + + if (meth.sym == null) { + super.visitMethod(node, unused); + methodStack.pop(); + return null; + } CompilerRange range = CompilerRange.FROM_POINT_TO_SYMBOL_NAME; if (meth.sym.isConstructor()) { - if (meth.sym.owner.isAnonymous()) return null; + if (meth.sym.owner.isAnonymous()) { + super.visitMethod(node, unused); + methodStack.pop(); + return null; + } range = CompilerRange.FROM_POINT_WITH_TEXT_SEARCH; } emitSymbolOccurrence(meth.sym, meth, Role.DEFINITION, range); @@ -196,7 +209,10 @@ public Void visitMethod(MethodTree node, Void unused) { i++; } } - return super.visitMethod(node, unused); + + super.visitMethod(node, unused); + methodStack.pop(); + return null; } @Override @@ -341,8 +357,16 @@ private Optional semanticdbOccurrence( Optional range = semanticdbRange(pos, kind, sym); if (range.isPresent()) { String ssym = semanticdbSymbol(sym); + + String container = ""; + if (role == Role.REFERENCE && sym.type instanceof Type.MethodType) { + if (!methodStack.isEmpty()) { + container = semanticdbSymbol(methodStack.getLast()); + } + } + if (!ssym.equals(SemanticdbSymbols.NONE)) { - Semanticdb.SymbolOccurrence occ = symbolOccurrence(ssym, range.get(), role); + Semanticdb.SymbolOccurrence occ = symbolOccurrence(ssym, range.get(), role, container); return Optional.of(occ); } else { return Optional.empty(); @@ -352,6 +376,8 @@ private Optional semanticdbOccurrence( } } + // private String semanticdbContainer(Symbol sym) + private String semanticdbText() { if (source != null) return source; try {