Skip to content

Commit 0c51ae3

Browse files
committed
Promote synthetic definitions into normal definitions if they share names
Previously, we generated synthetic definitions for all synthetic definitions. However, this meant that "find references" never showed results for synthetic symbols share the same name as the non-synthetic definition. This commit changes that so synthetic definitions that share the same name as the non-synthetic symbol are included with "find references" results. While testing this change I noticed that we don't handle synthetic constructor parameters so I added support for those along the way.
1 parent eb12a0d commit 0c51ae3

18 files changed

+192
-108
lines changed

lsif-semanticdb/src/main/java/com/sourcegraph/lsif_semanticdb/LsifTextDocument.java

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,14 @@ public static Semanticdb.TextDocument manifestOccurrencesForSyntheticSymbols(
9898
if (definition != null) {
9999
continue;
100100
}
101-
for (String alternativeSymbol : alternativeSymbols(info)) {
101+
for (Semanticdb.SymbolOccurrence alternativeSymbol : alternativeSymbols(info)) {
102102
Semanticdb.SymbolOccurrence alternativeDefinition =
103-
definitionOccurrences.get(alternativeSymbol);
103+
definitionOccurrences.get(alternativeSymbol.getSymbol());
104104
if (alternativeDefinition != null) {
105105
builder.addOccurrences(
106-
Semanticdb.SymbolOccurrence.newBuilder(alternativeDefinition)
107-
.setRole(Semanticdb.SymbolOccurrence.Role.SYNTHETIC_DEFINITION)
106+
Semanticdb.SymbolOccurrence.newBuilder()
107+
.setRange(alternativeDefinition.getRange())
108+
.setRole(alternativeSymbol.getRole())
108109
.setSymbol(info.getSymbol()));
109110
break;
110111
}
@@ -118,29 +119,31 @@ public static Semanticdb.TextDocument manifestOccurrencesForSyntheticSymbols(
118119
public static final Set<String> syntheticCompanionObjectNames =
119120
new HashSet<>(Arrays.asList("apply", "copy"));
120121

121-
public static List<String> alternativeSymbols(Semanticdb.SymbolInformation info) {
122-
ArrayList<String> alternatives = new ArrayList<>();
122+
public static List<Semanticdb.SymbolOccurrence> alternativeSymbols(
123+
Semanticdb.SymbolInformation info) {
124+
SymbolOccurrences alternatives = new SymbolOccurrences();
123125
SymbolDescriptor sym = SymbolDescriptor.parseFromSymbol(info.getSymbol());
124126
switch (sym.descriptor.kind) {
125127
case Method:
126128
if (sym.descriptor.name.endsWith("_=")) {
127129
String newName = sym.descriptor.name.substring(0, sym.descriptor.name.length() - 2);
128-
alternatives.add(SemanticdbSymbols.global(sym.owner, sym.descriptor.withName(newName)));
130+
alternatives.addDefinition(
131+
SemanticdbSymbols.global(sym.owner, sym.descriptor.withName(newName)));
129132
} else if (syntheticCaseClassMethodNames.contains(sym.descriptor.name)) {
130-
alternatives.add(sym.owner);
133+
alternatives.addSyntheticDefinition(sym.owner);
131134
} else if (syntheticCompanionObjectNames.contains(sym.descriptor.name)) {
132-
alternatives.add(sym.owner);
135+
alternatives.addSyntheticDefinition(sym.owner);
133136
SymbolDescriptor owner = SymbolDescriptor.parseFromSymbol(sym.owner);
134-
alternatives.add(
137+
alternatives.addSyntheticDefinition(
135138
SemanticdbSymbols.global(
136139
owner.owner, owner.descriptor.withKind(SemanticdbSymbols.Descriptor.Kind.Type)));
137140
}
138141
break;
139142
case Parameter:
140143
SymbolDescriptor owner = SymbolDescriptor.parseFromSymbol(sym.owner);
141-
if (owner.descriptor.name.equals("copy")) {
144+
if (owner.descriptor.name.equals("copy") || owner.descriptor.name.equals("<init>")) {
142145
// case classes copy method parameter.
143-
alternatives.add(
146+
alternatives.addDefinition(
144147
SemanticdbSymbols.global(
145148
owner.owner, sym.descriptor.withKind(SemanticdbSymbols.Descriptor.Kind.Term)));
146149
} else if (owner.descriptor.name.equals("apply")) {
@@ -150,17 +153,18 @@ public static List<String> alternativeSymbols(Semanticdb.SymbolInformation info)
150153
SemanticdbSymbols.global(
151154
grandparent.owner,
152155
grandparent.descriptor.withKind(SemanticdbSymbols.Descriptor.Kind.Type));
153-
alternatives.add(
156+
alternatives.addDefinition(
154157
SemanticdbSymbols.global(
155158
companion, sym.descriptor.withKind(SemanticdbSymbols.Descriptor.Kind.Term)));
156159
}
157160
case Term:
158-
alternatives.add(
161+
alternatives.addDefinition(
159162
SemanticdbSymbols.global(
160163
sym.owner, sym.descriptor.withKind(SemanticdbSymbols.Descriptor.Kind.Type)));
161164
break;
162165
default:
163166
}
164-
return alternatives;
167+
168+
return alternatives.occurrences;
165169
}
166170
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.sourcegraph.lsif_semanticdb;
2+
3+
import com.sourcegraph.semanticdb_javac.Semanticdb;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class SymbolOccurrences {
9+
public List<Semanticdb.SymbolOccurrence> occurrences = new ArrayList<>();
10+
11+
public void addSyntheticDefinition(String sym) {
12+
occurrences.add(
13+
Semanticdb.SymbolOccurrence.newBuilder()
14+
.setSymbol(sym)
15+
.setRole(Semanticdb.SymbolOccurrence.Role.SYNTHETIC_DEFINITION)
16+
.build());
17+
}
18+
19+
public void addDefinition(String sym) {
20+
occurrences.add(
21+
Semanticdb.SymbolOccurrence.newBuilder()
22+
.setSymbol(sym)
23+
.setRole(Semanticdb.SymbolOccurrence.Role.DEFINITION)
24+
.build());
25+
}
26+
}

tests/snapshots/src/main/generated/BaseByteRenderer.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,23 @@ import upickle.core.{ArrVisitor, ObjVisitor}
2323
*/
2424
class BaseByteRenderer[T <: upickle.core.ByteOps.Output]
2525
// ^^^^^^^^^^^^^^^^ definition ujson/BaseByteRenderer# class BaseByteRenderer[T <: Output]
26-
// ^^^^^^^^^^^^^^^^ synthetic_definition ujson/BaseByteRenderer. object BaseByteRenderer
26+
// ^^^^^^^^^^^^^^^^ definition ujson/BaseByteRenderer. object BaseByteRenderer
2727
// ^ definition ujson/BaseByteRenderer#[T] T <: Output
2828
// ^^^^^^^ reference upickle/
2929
// ^^^^ reference upickle/core/
3030
// ^^^^^^^ reference upickle/core/ByteOps.
3131
// ^^^^^^ reference upickle/core/ByteOps.Output#
3232
(out: T,
3333
// ^^^ definition ujson/BaseByteRenderer#out. private[this] val out: T
34+
// ^^^ definition ujson/BaseByteRenderer#`<init>`().(out) out: T
3435
// ^ reference ujson/BaseByteRenderer#[T]
3536
indent: Int = -1,
3637
// ^^^^^^ definition ujson/BaseByteRenderer#indent. private[this] val indent: Int
38+
// ^^^^^^ definition ujson/BaseByteRenderer#`<init>`().(indent) default indent: Int
3739
// ^^^ reference scala/Int#
3840
escapeUnicode: Boolean = false) extends JsVisitor[T, T]{
3941
// ^^^^^^^^^^^^^ definition ujson/BaseByteRenderer#escapeUnicode. private[this] val escapeUnicode: Boolean
42+
// ^^^^^^^^^^^^^ definition ujson/BaseByteRenderer#`<init>`().(escapeUnicode) default escapeUnicode: Boolean
4043
// ^^^^^^^ reference scala/Boolean#
4144
// ^^^^^^^^^ reference ujson/JsVisitor#
4245
// ^ reference ujson/BaseByteRenderer#[T]
@@ -66,13 +69,13 @@ class BaseByteRenderer[T <: upickle.core.ByteOps.Output]
6669

6770
private[this] var depth: Int = 0
6871
// ^^^^^ definition ujson/BaseByteRenderer#depth(). private[this] var depth: Int
69-
// ^^^^^ synthetic_definition ujson/BaseByteRenderer#`depth_=`(). private[this] var depth_=(x$1: Int): Unit
72+
// ^^^^^ definition ujson/BaseByteRenderer#`depth_=`(). private[this] var depth_=(x$1: Int): Unit
7073
// ^^^ reference scala/Int#
7174

7275

7376
private[this] var commaBuffered = false
7477
// ^^^^^^^^^^^^^ definition ujson/BaseByteRenderer#commaBuffered(). private[this] var commaBuffered: Boolean
75-
// ^^^^^^^^^^^^^ synthetic_definition ujson/BaseByteRenderer#`commaBuffered_=`(). private[this] var commaBuffered_=(x$1: Boolean): Unit
78+
// ^^^^^^^^^^^^^ definition ujson/BaseByteRenderer#`commaBuffered_=`(). private[this] var commaBuffered_=(x$1: Boolean): Unit
7679

7780
def flushBuffer() = {
7881
// ^^^^^^^^^^^ definition ujson/BaseByteRenderer#flushBuffer(). def flushBuffer(): Unit

tests/snapshots/src/main/generated/BaseCharRenderer.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,23 @@ import upickle.core.{ArrVisitor, ObjVisitor}
2323
*/
2424
class BaseCharRenderer[T <: upickle.core.CharOps.Output]
2525
// ^^^^^^^^^^^^^^^^ definition ujson/BaseCharRenderer# class BaseCharRenderer[T <: Output]
26-
// ^^^^^^^^^^^^^^^^ synthetic_definition ujson/BaseCharRenderer. object BaseCharRenderer
26+
// ^^^^^^^^^^^^^^^^ definition ujson/BaseCharRenderer. object BaseCharRenderer
2727
// ^ definition ujson/BaseCharRenderer#[T] T <: Output
2828
// ^^^^^^^ reference upickle/
2929
// ^^^^ reference upickle/core/
3030
// ^^^^^^^ reference upickle/core/CharOps.
3131
// ^^^^^^ reference upickle/core/CharOps.Output#
3232
(out: T,
3333
// ^^^ definition ujson/BaseCharRenderer#out. private[this] val out: T
34+
// ^^^ definition ujson/BaseCharRenderer#`<init>`().(out) out: T
3435
// ^ reference ujson/BaseCharRenderer#[T]
3536
indent: Int = -1,
3637
// ^^^^^^ definition ujson/BaseCharRenderer#indent. private[this] val indent: Int
38+
// ^^^^^^ definition ujson/BaseCharRenderer#`<init>`().(indent) default indent: Int
3739
// ^^^ reference scala/Int#
3840
escapeUnicode: Boolean = false) extends JsVisitor[T, T]{
3941
// ^^^^^^^^^^^^^ definition ujson/BaseCharRenderer#escapeUnicode. private[this] val escapeUnicode: Boolean
42+
// ^^^^^^^^^^^^^ definition ujson/BaseCharRenderer#`<init>`().(escapeUnicode) default escapeUnicode: Boolean
4043
// ^^^^^^^ reference scala/Boolean#
4144
// ^^^^^^^^^ reference ujson/JsVisitor#
4245
// ^ reference ujson/BaseCharRenderer#[T]
@@ -66,13 +69,13 @@ class BaseCharRenderer[T <: upickle.core.CharOps.Output]
6669

6770
private[this] var depth: Int = 0
6871
// ^^^^^ definition ujson/BaseCharRenderer#depth(). private[this] var depth: Int
69-
// ^^^^^ synthetic_definition ujson/BaseCharRenderer#`depth_=`(). private[this] var depth_=(x$1: Int): Unit
72+
// ^^^^^ definition ujson/BaseCharRenderer#`depth_=`(). private[this] var depth_=(x$1: Int): Unit
7073
// ^^^ reference scala/Int#
7174

7275

7376
private[this] var commaBuffered = false
7477
// ^^^^^^^^^^^^^ definition ujson/BaseCharRenderer#commaBuffered(). private[this] var commaBuffered: Boolean
75-
// ^^^^^^^^^^^^^ synthetic_definition ujson/BaseCharRenderer#`commaBuffered_=`(). private[this] var commaBuffered_=(x$1: Boolean): Unit
78+
// ^^^^^^^^^^^^^ definition ujson/BaseCharRenderer#`commaBuffered_=`(). private[this] var commaBuffered_=(x$1: Boolean): Unit
7679

7780
def flushBuffer() = {
7881
// ^^^^^^^^^^^ definition ujson/BaseCharRenderer#flushBuffer(). def flushBuffer(): Unit

tests/snapshots/src/main/generated/minimized/Issue396.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ case class Issue396(a: Int)
55
// ^^^^^^^^ definition minimized/Issue396# case class Issue396(a: Int)
66
// ^^^^^^^^ synthetic_definition minimized/Issue396#copy(). def copy(a: Int): Issue396
77
// ^^^^^^^^ synthetic_definition minimized/Issue396#productElement(). def productElement(x$1: Int): Any
8-
// ^^^^^^^^ synthetic_definition minimized/Issue396. object Issue396
8+
// ^^^^^^^^ definition minimized/Issue396. object Issue396
99
// ^^^^^^^^ synthetic_definition minimized/Issue396.apply(). def apply(a: Int): Issue396
1010
// ^^^^^^^^ synthetic_definition minimized/Issue396#productElementName(). def productElementName(x$1: Int): String
1111
// definition minimized/Issue396#`<init>`(). def this(a: Int)
1212
// ^ definition minimized/Issue396#a. val a: Int
13-
// ^ synthetic_definition minimized/Issue396.apply().(a) a: Int
14-
// ^ synthetic_definition minimized/Issue396#copy().(a) default a: Int
13+
// ^ definition minimized/Issue396.apply().(a) a: Int
14+
// ^ definition minimized/Issue396#`<init>`().(a) a: Int
15+
// ^ definition minimized/Issue396#copy().(a) default a: Int
1516
// ^^^ reference scala/Int#
1617
object Issue396App {
1718
// ^^^^^^^^^^^ definition minimized/Issue396App. object Issue396App

tests/snapshots/src/main/generated/minimized/Issue397.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class Issue397 {
66
// definition minimized/Issue397#`<init>`(). def this()
77
var blah = Set("abc")
88
// ^^^^ definition minimized/Issue397#blah(). var blah: Set[String]
9-
// ^^^^ synthetic_definition minimized/Issue397#`blah_=`(). var blah_=(x$1: Set[String]): Unit
9+
// ^^^^ definition minimized/Issue397#`blah_=`(). var blah_=(x$1: Set[String]): Unit
1010
// ^^^ reference scala/Predef.Set.
1111
// reference scala/collection/IterableFactory#apply().
1212
blah = Set.empty[String]

tests/snapshots/src/main/generated/minimized/MinimizedScalaSignatures.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ case class MinimizedCaseClass(value: String) {
88
// ^^^^^^^^^^^^^^^^^^ definition minimized/MinimizedCaseClass# case class MinimizedCaseClass(value: String)
99
// ^^^^^^^^^^^^^^^^^^ synthetic_definition minimized/MinimizedCaseClass.apply(). def apply(value: String): MinimizedCaseClass
1010
// ^^^^^^^^^^^^^^^^^^ synthetic_definition minimized/MinimizedCaseClass#productElement(). def productElement(x$1: Int): Any
11-
// ^^^^^^^^^^^^^^^^^^ synthetic_definition minimized/MinimizedCaseClass. object MinimizedCaseClass
11+
// ^^^^^^^^^^^^^^^^^^ definition minimized/MinimizedCaseClass. object MinimizedCaseClass
1212
// ^^^^^^^^^^^^^^^^^^ synthetic_definition minimized/MinimizedCaseClass#productElementName(). def productElementName(x$1: Int): String
1313
// ^^^^^^^^^^^^^^^^^^ synthetic_definition minimized/MinimizedCaseClass#copy(). def copy(value: String): MinimizedCaseClass
1414
// definition minimized/MinimizedCaseClass#`<init>`(). def this(value: String)
1515
// ^^^^^ definition minimized/MinimizedCaseClass#value. val value: String
16-
// ^^^^^ synthetic_definition minimized/MinimizedCaseClass#copy().(value) default value: String
17-
// ^^^^^ synthetic_definition minimized/MinimizedCaseClass.apply().(value) value: String
16+
// ^^^^^ definition minimized/MinimizedCaseClass#copy().(value) default value: String
17+
// ^^^^^ definition minimized/MinimizedCaseClass#`<init>`().(value) value: String
18+
// ^^^^^ definition minimized/MinimizedCaseClass.apply().(value) value: String
1819
// ^^^^^^ reference scala/Predef.String#
1920
def this() = this("value")
2021
// ^^^^ definition minimized/MinimizedCaseClass#`<init>`(+1). def this()

tests/snapshots/src/main/generated/ujson/AstTransformer.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,12 @@ trait AstTransformer[I] extends Transformer[I] with JsVisitor[I, I]{
104104
// ^ definition ujson/AstTransformer#AstObjVisitor#[T] T
105105
// definition ujson/AstTransformer#AstObjVisitor#`<init>`(). def this(build: (T) => I)(factory: Factory[(String, I), T])
106106
// ^^^^^ definition ujson/AstTransformer#AstObjVisitor#build. private[this] val build: (T) => I
107+
// ^^^^^ definition ujson/AstTransformer#AstObjVisitor#`<init>`().(build) build: (T) => I
107108
// ^ reference ujson/AstTransformer#AstObjVisitor#[T]
108109
// ^ reference ujson/AstTransformer#[I]
109110
(implicit factory: Factory[(String, I), T])extends ObjVisitor[I, I] {
110111
// ^^^^^^^ definition ujson/AstTransformer#AstObjVisitor#factory. private[this] implicit val factory: Factory[(String, I), T]
112+
// ^^^^^^^ definition ujson/AstTransformer#AstObjVisitor#`<init>`().(factory) implicit factory: Factory[(String, I), T]
111113
// ^^^^^^^ reference upickle/core/compat/package.Factory#
112114
// ^^^^^^ reference scala/Predef.String#
113115
// ^ reference ujson/AstTransformer#[I]
@@ -119,7 +121,7 @@ trait AstTransformer[I] extends Transformer[I] with JsVisitor[I, I]{
119121

120122
private[this] var key: String = null
121123
// ^^^ definition ujson/AstTransformer#AstObjVisitor#key(). private[this] var key: String
122-
// ^^^ synthetic_definition ujson/AstTransformer#AstObjVisitor#`key_=`(). private[this] var key_=(x$1: String): Unit
124+
// ^^^ definition ujson/AstTransformer#AstObjVisitor#`key_=`(). private[this] var key_=(x$1: String): Unit
123125
// ^^^^^^ reference scala/Predef.String#
124126
private[this] val vs = factory.newBuilder
125127
// ^^ definition ujson/AstTransformer#AstObjVisitor#vs. private[this] val vs: Builder[(String, I), T]
@@ -170,11 +172,13 @@ trait AstTransformer[I] extends Transformer[I] with JsVisitor[I, I]{
170172
// ^ definition ujson/AstTransformer#AstArrVisitor#[T] T
171173
// definition ujson/AstTransformer#AstArrVisitor#`<init>`(). def this(build: (T[I]) => I)(factory: Factory[I, T[I]])
172174
// ^^^^^ definition ujson/AstTransformer#AstArrVisitor#build. private[this] val build: (T[I]) => I
175+
// ^^^^^ definition ujson/AstTransformer#AstArrVisitor#`<init>`().(build) build: (T[I]) => I
173176
// ^ reference ujson/AstTransformer#AstArrVisitor#[T]
174177
// ^ reference ujson/AstTransformer#[I]
175178
// ^ reference ujson/AstTransformer#[I]
176179
(implicit factory: Factory[I, T[I]]) extends ArrVisitor[I, I]{
177180
// ^^^^^^^ definition ujson/AstTransformer#AstArrVisitor#factory. private[this] implicit val factory: Factory[I, T[I]]
181+
// ^^^^^^^ definition ujson/AstTransformer#AstArrVisitor#`<init>`().(factory) implicit factory: Factory[I, T[I]]
178182
// ^^^^^^^ reference upickle/core/compat/package.Factory#
179183
// ^ reference ujson/AstTransformer#[I]
180184
// ^ reference ujson/AstTransformer#AstArrVisitor#[T]

tests/snapshots/src/main/generated/ujson/ByteArrayParser.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ final class ByteArrayParser[J](src: Array[Byte]) extends ByteParser[J]{
3737
// ^ definition ujson/ByteArrayParser#[J] J
3838
// definition ujson/ByteArrayParser#`<init>`(). def this(src: Array[Byte])
3939
// ^^^ definition ujson/ByteArrayParser#src. private[this] val src: Array[Byte]
40+
// ^^^ definition ujson/ByteArrayParser#`<init>`().(src) src: Array[Byte]
4041
// ^^^^^ reference scala/Array#
4142
// ^^^^ reference scala/Byte#
4243
// ^^^^^^^^^^ reference ujson/ByteParser#

tests/snapshots/src/main/generated/ujson/ByteBufferParser.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ final class ByteBufferParser[J](src: ByteBuffer) extends ByteParser[J]{
3737
// ^ definition ujson/ByteBufferParser#[J] J
3838
// definition ujson/ByteBufferParser#`<init>`(). def this(src: ByteBuffer)
3939
// ^^^ definition ujson/ByteBufferParser#src. private[this] val src: ByteBuffer
40+
// ^^^ definition ujson/ByteBufferParser#`<init>`().(src) src: ByteBuffer
4041
// ^^^^^^^^^^ reference java/nio/ByteBuffer#
4142
// ^^^^^^^^^^ reference ujson/ByteParser#
4243
// ^ reference ujson/ByteBufferParser#[J]

0 commit comments

Comments
 (0)