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().*/

0 commit comments

Comments
 (0)