Skip to content

Commit af16d81

Browse files
authored
Merge pull request sourcegraph#404 from olafurpg/semi-synthetic-definitions
Promote synthetic definitions into normal definitions if they share names
2 parents eb12a0d + 0c51ae3 commit af16d81

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)