Fix simple name lookup of fields
If the simple name of a constant field matches an imported type, keep
looking. Types should only be considered for qualified type names.
MOE_MIGRATED_REVID=137962449
diff --git a/java/com/google/turbine/binder/ConstEvaluator.java b/java/com/google/turbine/binder/ConstEvaluator.java
index 29a8836..e68e28a 100644
--- a/java/com/google/turbine/binder/ConstEvaluator.java
+++ b/java/com/google/turbine/binder/ConstEvaluator.java
@@ -215,19 +215,9 @@
if (field != null) {
return field;
}
- LookupResult result = scope.lookup(new LookupKey(t.name()));
- if (result != null) {
- ClassSymbol sym = (ClassSymbol) result.sym();
- for (int i = 0; i < result.remaining().size() - 1; i++) {
- sym = Resolve.resolve(env, sym, sym, result.remaining().get(i));
- if (sym == null) {
- return null;
- }
- }
- field = Resolve.resolveField(env, owner, sym, Iterables.getLast(result.remaining()));
- if (field != null) {
- return field;
- }
+ field = resolveQualifiedField(t);
+ if (field != null) {
+ return field;
}
ClassSymbol classSymbol = base.memberImports().singleMemberImport(simpleName);
if (classSymbol != null) {
@@ -246,6 +236,24 @@
return null;
}
+ private FieldInfo resolveQualifiedField(ConstVarName t) {
+ if (t.name().size() <= 1) {
+ return null;
+ }
+ LookupResult result = scope.lookup(new LookupKey(t.name()));
+ if (result == null) {
+ return null;
+ }
+ ClassSymbol sym = (ClassSymbol) result.sym();
+ for (int i = 0; i < result.remaining().size() - 1; i++) {
+ sym = Resolve.resolve(env, sym, sym, result.remaining().get(i));
+ if (sym == null) {
+ return null;
+ }
+ }
+ return Resolve.resolveField(env, owner, sym, Iterables.getLast(result.remaining()));
+ }
+
/** Search for constant variables in lexically enclosing scopes. */
private FieldInfo lexicalField(
Env<ClassSymbol, TypeBoundClass> env, ClassSymbol sym, String name) {
diff --git a/javatests/com/google/turbine/lower/LowerIntegrationTest.java b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
index b7cacf0..b48928c 100644
--- a/javatests/com/google/turbine/lower/LowerIntegrationTest.java
+++ b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
@@ -258,6 +258,7 @@
"underscore_literal.test",
"c_array.test",
"type_anno_retention.test",
+ "member_import_clash.test",
};
List<Object[]> tests =
ImmutableList.copyOf(testCases).stream().map(x -> new Object[] {x}).collect(toList());
diff --git a/javatests/com/google/turbine/lower/testdata/member_import_clash.test b/javatests/com/google/turbine/lower/testdata/member_import_clash.test
new file mode 100644
index 0000000..41647d9
--- /dev/null
+++ b/javatests/com/google/turbine/lower/testdata/member_import_clash.test
@@ -0,0 +1,26 @@
+=== e/E.java ===
+package e;
+public enum E {
+ ONE, TWO
+}
+
+=== two/TWO.java ===
+package two;
+public class TWO {}
+
+=== a/A.java ===
+package a;
+import e.E;
+import static e.E.ONE;
+public @interface A {
+ E[] value() default ONE;
+}
+
+=== Test.java ===
+import static e.E.TWO;
+import two.TWO;
+import a.A;
+@A({TWO}) // TWO is a field
+public class Test {
+ TWO two; // TWO is a type
+}