Skip to content

Commit f70a179

Browse files
committed
Better java symbols
1 parent 4cd5f8c commit f70a179

File tree

14 files changed

+229
-13
lines changed

14 files changed

+229
-13
lines changed

compiler/src/dotty/tools/dotc/semanticdb/ExtractSemanticDB.scala

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,19 @@ class ExtractSemanticDB extends Phase {
8787
if !owner.isRoot then addSymName(b, owner, inOwner = true)
8888

8989
def addOverloadIdx(sym: Symbol): Unit =
90-
val alts = sym.owner.info.decls.lookupAll(sym.name).filter(_.is(Method)).toList.reverse
91-
if alts.nonEmpty && alts.tail.nonEmpty then
92-
val idx = alts.indexOf(sym)
93-
assert(idx >= 0)
94-
if idx > 0 then
95-
b.append('+').append(idx)
90+
val decls = {
91+
val decls0 = sym.owner.info.decls.lookupAll(sym.name)
92+
if sym.owner.isAllOf(JavaModule)
93+
decls0 ++ sym.owner.companionClass.info.decls.lookupAll(sym.name)
94+
else
95+
decls0
96+
}
97+
val alts = decls.filter(_.is(Method)).toList.reverse
98+
alts match
99+
case notSym :: rest if sym != notSym =>
100+
val idx = rest.indexOf(sym).ensuring(_ >= 0)
101+
b.append('+').append(idx + 1)
102+
case _ =>
96103

97104
def addDescriptor(sym: Symbol): Unit =
98105
if sym.is(ModuleClass) then
@@ -107,7 +114,7 @@ class ExtractSemanticDB extends Phase {
107114
else
108115
addName(sym.name)
109116
if sym.is(Package) then b.append('/')
110-
else if sym.isType then b.append('#')
117+
else if sym.isType || sym.isAllOf(JavaModule) then b.append('#')
111118
else if sym.isOneOf(Method | Mutable)
112119
&& (!sym.is(StableRealizable) || sym.name == nme.CONSTRUCTOR) then
113120
b.append('('); addOverloadIdx(sym); b.append(").")
@@ -259,7 +266,7 @@ class ExtractSemanticDB extends Phase {
259266
for sel <- tree.selectors do
260267
val imported = sel.imported.name
261268
if imported != nme.WILDCARD then
262-
for alt <- tree.expr.tpe.member(imported).alternatives do
269+
for alt <- tree.expr.tpe.member(imported).alternatives if !alt.symbol.is(Package) do
263270
registerUse(alt.symbol, sel.imported.span)
264271
if (alt.symbol.companionClass.exists)
265272
registerUse(alt.symbol.companionClass, sel.imported.span)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.javacp;
2+
3+
public class ClassSuffix {
4+
class Inner<A> {
5+
class Bar {
6+
class Fuz<B> {}
7+
}
8+
}
9+
public ClassSuffix.Inner<String>.Bar.Fuz<Integer> suffix;
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.javacp;
2+
3+
public enum Coin {
4+
PENNY(1), NICKEL(5), DIME(10), QUARTER(25);
5+
Coin(int value) { this.value = value; }
6+
7+
private final int value;
8+
public int value() { return value; }
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.javacp;
2+
3+
public interface Interface {
4+
void a();
5+
default void d() {}
6+
static void s() {}
7+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.javacp;
2+
3+
public class Logger {
4+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.javacp;
2+
3+
public class MetacJava {
4+
public static class StaticInner {
5+
public void isNotStatic() {}
6+
public static void isStatic() {}
7+
public class NonStatic {
8+
public void method(NonStatic e) {}
9+
}
10+
}
11+
public class Overload1 { public class A {} }
12+
public static class Overload3 {
13+
public static class A {}
14+
}
15+
public class Overload2 { public class A {} }
16+
public void overload(Overload1.A a) {}
17+
// NOTE: Overload3 is intentionally placed before Overload2 in order to test
18+
// that methods are sorted by whether they're static or not.
19+
public static void overload(Overload3.A a) {}
20+
public void overload(Overload2.A a) {}
21+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.javacp;
2+
3+
import java.io.IOException;
4+
import java.io.Serializable;
5+
6+
public class NonGeneric extends java.lang.Exception implements Serializable, java.io.Flushable {
7+
@Override
8+
public void flush() throws IOException { }
9+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.javacp;
2+
3+
import java.io.Serializable;
4+
import java.util.ArrayList;
5+
6+
public abstract class Recursive<
7+
A extends Recursive<A, B> & Serializable,
8+
B extends Recursive.Inner<A, B>> {
9+
10+
public abstract static class Inner<
11+
A extends Recursive<A, B> & Serializable,
12+
B extends Inner<A, B>> {
13+
}
14+
15+
public abstract class Inner2<C extends Comparable<C>> {}
16+
17+
public <Anon> ArrayList<Anon> foo() {
18+
return new ArrayList<Anon>() {
19+
@Override
20+
public boolean remove(Object o) {
21+
return true;
22+
}
23+
};
24+
}
25+
26+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.javacp;
2+
3+
import javax.naming.Context;
4+
import java.io.Serializable;
5+
import java.util.ArrayList;
6+
import java.util.Collection;
7+
import java.util.HashMap;
8+
import java.util.Hashtable;
9+
10+
public final class Test<A extends CharSequence & Serializable, B> extends ArrayList<A> implements Comparable<B>, Serializable {
11+
12+
@Override
13+
public final int compareTo(B b) {
14+
return 0;
15+
}
16+
17+
public void wildcard(ArrayList<?> wildcard) {}
18+
public void wildcard(Collection<? extends Number> a, Collection<? super Number> b) {}
19+
20+
class InnerShadowTypeParam<A> {
21+
public void move(A a, B b) { }
22+
}
23+
24+
ArrayList<A> genericField;
25+
final int[] arrayField = null;
26+
27+
ArrayList<A> genericMethod() {
28+
return null;
29+
}
30+
int[] arrayMethod() {
31+
return new int[0];
32+
}
33+
void genericParams(A a, B b) { }
34+
void primitiveParams(int a, long b, float c, double d, short e, byte f, boolean g, char h) { }
35+
void typeParams(ArrayList<HashMap<A, String[]>> a, Hashtable<String, B> b) { }
36+
<C extends Integer> void methodTypeParams(C c) { }
37+
38+
public void overload(java.util.logging.Logger a) { }
39+
public void overload(Logger a) { }
40+
41+
// primitive fields
42+
public int Int;
43+
public long Long;
44+
public float Float;
45+
public short Short;
46+
public byte Byte;
47+
public boolean Boolean;
48+
public char Char;
49+
50+
51+
private int privateField;
52+
protected int protectedField;
53+
public int publicField;
54+
int packagePrivateField;
55+
56+
private void privateMethod() { }
57+
protected void protectedMethod() { }
58+
public void publicMethod() { }
59+
void packagePrivateMethod() { }
60+
61+
public Serializable anonymous = new Serializable() { };
62+
63+
static int staticField;
64+
static void staticMethod() {}
65+
static class StaticClass {}
66+
67+
void vararg(int a, String... args) {}
68+
69+
strictfp void strictfpMethod() {}
70+
71+
<T extends X> void m1() {}
72+
<T extends X & Y> void m2() {}
73+
<T extends X & Y & Z> void m3() {}
74+
}
75+
76+
interface X {
77+
}
78+
79+
interface Y {
80+
}
81+
82+
interface Z {
83+
}

tests/semanticdb/Advanced.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ object Test/*<<=advanced.Test.*/ {
2626
val s2/*<<=advanced.Test.s2.*/ = s/*=>>advanced.Test.s.*/.s2/*=>>advanced.Structural#s2().*/
2727
val s2x/*<<=advanced.Test.s2x.*/ = /*=>>scala.reflect.Selectable.reflectiveSelectable().*/s/*=>>advanced.Test.s.*/.s2/*=>>advanced.Structural#s2().*//*=>>scala.Selectable#selectDynamic().*/.x
2828
val s3/*<<=advanced.Test.s3.*/ = s/*=>>advanced.Test.s.*/.s3/*=>>advanced.Structural#s3().*/
29-
val s3x/*<<=advanced.Test.s3x.*/ = /*=>>scala.reflect.Selectable.reflectiveSelectable().*/s/*=>>advanced.Test.s.*/.s3/*=>>advanced.Structural#s3().*//*=>>scala.Selectable#applyDynamic().*/.m/*=>>scala.reflect.ClassTag.apply().*//*=>>java.lang.Integer.TYPE.*/(???/*=>>scala.Predef.`???`().*/)
29+
val s3x/*<<=advanced.Test.s3x.*/ = /*=>>scala.reflect.Selectable.reflectiveSelectable().*/s/*=>>advanced.Test.s.*/.s3/*=>>advanced.Structural#s3().*//*=>>scala.Selectable#applyDynamic().*/.m/*=>>scala.reflect.ClassTag.apply().*//*=>>java.lang.Integer#TYPE.*/(???/*=>>scala.Predef.`???`().*/)
3030

3131
val e/*<<=advanced.Test.e.*/ = new Wildcards/*=>>advanced.Wildcards#*//*=>>advanced.Wildcards#`<init>`().*/
3232
val e1/*<<=advanced.Test.e1.*/ = e/*=>>advanced.Test.e.*/.e1/*=>>advanced.Wildcards#e1().*/

tests/semanticdb/Example.expect.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ object Example/*<<=example.Example.*/ { /*=>>example.Example.*/self/*<<=local0*/
77
def main/*<<=example.Example.main().*/(args/*<<=example.Example.main().(args)*/: Array/*=>>scala.Array#*/[String/*=>>scala.Predef.String#*/]): Unit/*=>>scala.Unit#*/ = {
88
println/*=>>scala.Predef.println(+1).*/(1)
99
}
10-
val x/*<<=example.Example.x.*/ = scala.reflect.classTag/*=>>scala.reflect.package.classTag().*/[Int/*=>>scala.Int#*/]/*=>>scala.reflect.ClassTag.apply().*//*=>>java.lang.Integer.TYPE.*/
10+
val x/*<<=example.Example.x.*/ = scala.reflect.classTag/*=>>scala.reflect.package.classTag().*/[Int/*=>>scala.Int#*/]/*=>>scala.reflect.ClassTag.apply().*//*=>>java.lang.Integer#TYPE.*/
1111
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package example
2+
3+
import com.javacp
4+
5+
class MetacJava/*<<=example.MetacJava#*/ {
6+
javacp.MetacJava/*=>>com.javacp.MetacJava#*/.StaticInner/*=>>com.javacp.MetacJava#StaticInner#*/.isStatic/*=>>com.javacp.MetacJava#StaticInner#isStatic().*/()
7+
new javacp.MetacJava/*=>>com.javacp.MetacJava#*/.StaticInner/*=>>com.javacp.MetacJava#StaticInner#*//*=>>com.javacp.MetacJava#StaticInner#`<init>`().*/().isNotStatic/*=>>com.javacp.MetacJava#StaticInner#isNotStatic().*/()
8+
val inner/*<<=example.MetacJava#inner.*/ = new javacp.MetacJava/*=>>com.javacp.MetacJava#*//*=>>com.javacp.MetacJava#`<init>`().*/()
9+
val overload1/*<<=example.MetacJava#overload1.*/ = new inner/*=>>example.MetacJava#inner.*/.Overload1/*=>>com.javacp.MetacJava#Overload1#*//*=>>com.javacp.MetacJava#Overload1#`<init>`().*/()
10+
val overload2/*<<=example.MetacJava#overload2.*/ = new inner/*=>>example.MetacJava#inner.*/.Overload2/*=>>com.javacp.MetacJava#Overload2#*//*=>>com.javacp.MetacJava#Overload2#`<init>`().*/()
11+
inner/*=>>example.MetacJava#inner.*/.overload/*=>>com.javacp.MetacJava#overload().*/(new overload1/*=>>example.MetacJava#overload1.*/.A/*=>>com.javacp.MetacJava#Overload1#A#*//*=>>com.javacp.MetacJava#Overload1#A#`<init>`().*/())
12+
inner/*=>>example.MetacJava#inner.*/.overload/*=>>com.javacp.MetacJava#overload(+1).*/(new overload2/*=>>example.MetacJava#overload2.*/.A/*=>>com.javacp.MetacJava#Overload2#A#*//*=>>com.javacp.MetacJava#Overload2#A#`<init>`().*/())
13+
val staticInner/*<<=example.MetacJava#staticInner.*/ = new javacp.MetacJava/*=>>com.javacp.MetacJava#*/.StaticInner/*=>>com.javacp.MetacJava#StaticInner#*//*=>>com.javacp.MetacJava#StaticInner#`<init>`().*/()
14+
val nonStatic/*<<=example.MetacJava#nonStatic.*/ = new staticInner/*=>>example.MetacJava#staticInner.*/.NonStatic/*=>>com.javacp.MetacJava#StaticInner#NonStatic#*//*=>>com.javacp.MetacJava#StaticInner#NonStatic#`<init>`().*/()
15+
nonStatic/*=>>example.MetacJava#nonStatic.*/.method/*=>>com.javacp.MetacJava#StaticInner#NonStatic#method().*/(nonStatic/*=>>example.MetacJava#nonStatic.*/)
16+
javacp.MetacJava/*=>>com.javacp.MetacJava#*/.overload/*=>>com.javacp.MetacJava#overload(+2).*/(new javacp.MetacJava/*=>>com.javacp.MetacJava#*/.Overload3/*=>>com.javacp.MetacJava#Overload3#*/.A/*=>>com.javacp.MetacJava#Overload3#A#*//*=>>com.javacp.MetacJava#Overload3#A#`<init>`().*/())
17+
val interface/*<<=example.MetacJava#interface.*/: javacp.Interface/*=>>com.javacp.Interface#*/ = null
18+
val coin/*<<=example.MetacJava#coin.*/: javacp.Coin/*=>>com.javacp.Coin#*/ = javacp.Coin/*=>>com.javacp.Coin#*/.PENNY/*=>>com.javacp.Coin#PENNY.*/
19+
val entry/*<<=example.MetacJava#entry.*/: java.util.Map/*=>>java.util.Map#*/.Entry/*=>>java.util.Map#Entry#*/[Int/*=>>scala.Int#*/, Int/*=>>scala.Int#*/] = null
20+
}

tests/semanticdb/MetacJava.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package example
2+
3+
import com.javacp
4+
5+
class MetacJava {
6+
javacp.MetacJava.StaticInner.isStatic()
7+
new javacp.MetacJava.StaticInner().isNotStatic()
8+
val inner = new javacp.MetacJava()
9+
val overload1 = new inner.Overload1()
10+
val overload2 = new inner.Overload2()
11+
inner.overload(new overload1.A())
12+
inner.overload(new overload2.A())
13+
val staticInner = new javacp.MetacJava.StaticInner()
14+
val nonStatic = new staticInner.NonStatic()
15+
nonStatic.method(nonStatic)
16+
javacp.MetacJava.overload(new javacp.MetacJava.Overload3.A())
17+
val interface: javacp.Interface = null
18+
val coin: javacp.Coin = javacp.Coin.PENNY
19+
val entry: java.util.Map.Entry[Int, Int] = null
20+
}

tests/semanticdb/Types.expect.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ object Test/*<<=types.Test.*/ {
6363
val annType2/*<<=types.Test.C#annType2.*/: T/*=>>types.T#*/ @ann1 @ann2 = ???/*=>>scala.Predef.`???`().*/
6464

6565
val existentialType2/*<<=types.Test.C#existentialType2.*/: List/*=>>scala.package.List#*/[_] = ???/*=>>scala.Predef.`???`().*/
66-
val existentialType3/*<<=types.Test.C#existentialType3.*/ = Class/*=>>java.lang.Class.*/.forName/*=>>java.lang.Class.forName().*/("foo.Bar")
67-
val existentialType4/*<<=types.Test.C#existentialType4.*/ = Class/*=>>java.lang.Class.*/.forName/*=>>java.lang.Class.forName().*/("foo.Bar")
66+
val existentialType3/*<<=types.Test.C#existentialType3.*/ = Class/*=>>java.lang.Class#*/.forName/*=>>java.lang.Class#forName().*/("foo.Bar")
67+
val existentialType4/*<<=types.Test.C#existentialType4.*/ = Class/*=>>java.lang.Class#*/.forName/*=>>java.lang.Class#forName().*/("foo.Bar")
6868

6969
def typeLambda1/*<<=types.Test.C#typeLambda1().*/[M/*<<=types.Test.C#typeLambda1().[M]*/[_]] = ???/*=>>scala.Predef.`???`().*/
7070
typeLambda1/*=>>types.Test.C#typeLambda1().*/[({ type L/*<<=local4*/[T/*<<=local5*/] = List/*=>>scala.package.List#*/[T/*=>>local5*/] })#L]
@@ -109,7 +109,7 @@ object Test/*<<=types.Test.*/ {
109109
final val string/*<<=types.Test.Literal.string.*/ = "a"
110110
final val bool/*<<=types.Test.Literal.bool.*/ = true
111111
final val unit/*<<=types.Test.Literal.unit.*/ = ()
112-
final val javaEnum/*<<=types.Test.Literal.javaEnum.*/ = java.nio.file.LinkOption/*=>>java.nio.file.LinkOption.*/.NOFOLLOW_LINKS/*=>>java.nio.file.LinkOption.NOFOLLOW_LINKS.*/
112+
final val javaEnum/*<<=types.Test.Literal.javaEnum.*/ = java.nio.file.LinkOption/*=>>java.nio.file.LinkOption#*/.NOFOLLOW_LINKS/*=>>java.nio.file.LinkOption#NOFOLLOW_LINKS.*/
113113
final val clazzOf/*<<=types.Test.Literal.clazzOf.*/ = classOf/*=>>scala.Predef.classOf().*/[Option/*=>>scala.Option#*/[Int/*=>>scala.Int#*/]]
114114
}
115115
}

0 commit comments

Comments
 (0)