package pkg; /* * The names SharedName[123] are shared between variables in local|parent class and class names. * Where approprate, the classes have to be referenced by fully qualified names */ class SharedName1 { static int f = 0; static int getF() { return f; } } class SharedName2 { static int f = 0; } class SharedName3 { static int f = 0; } class NonSharedName { static int f = 0; static int getF() { return f; } } @interface SharedName4 { } class SharedName5<T>{ } class TestClashNameParent { } interface TestClashNameIface { public void f(); } // *** Legend for first sentence in comments below: // (+) or (-) indicate whether 'pkg' prefix is or is not required when referencing *SharedName*. // The sign is optionally followed by decompiler class name that generates the line that is being commented // in a call of getShortName() @SharedName4 // (-)AnnotationExprent. While a variable named SharedName4 does exist in the annotated class, // lookup process for annotation names never includes variable names. public class TestClashName extends ext.TestClashNameParent implements /*pkg.*/TestClashNameIface { // (+)(-)TextUtil int TestClashNameParent = 0; int TestClashNameIface = 0; int SharedName1 = 0; int SharedName4 = 0; int SharedName5 = 0; int i = pkg.SharedName1.f; // (+)FieldExprent. SharedName1 class name is shadowed by a variable in this class int j = NonSharedName.f; // (-)FieldExprent. The NonSharedName is not used for other objects in the current scope int k = SharedName2.f; // (-)FieldExprent. SharedName2 variable is not the current scope int l = pkg.SharedName3.f; // (+)FieldExprent. SharedName3 class name is shadowed by a variable in parent class int m = pkg.SharedName1.getF();// (+)InvocationExprent. SharedName1 class name is shadowed by a variable in this class int n = NonSharedName.getF(); // (-)InvocationExprent. The NonSharedName is not used for other objects in the current scope SharedName1 p = null; // (-)ExprProcessor. While a variable named SharedName1 in current scope does exist, // namespace in type declaration does not include variable names in a scope SharedName5<SharedName1> q = null;//(-)(-)GenericMain (both names). While a variable named SharedName1 does exist in current scope, // lookup for generic parameters never includes variable names @SharedName4 // (-)AnnotationExprent. While a variable named SharedName4 does exist in current scope, // lookup process for annotation names never includes variable names. public int m() { int SharedName2 = i; pkg.SharedName1.f = j; // (+)FieldExprent. SharedName1 class name is shadowed by a variable in this class int x = pkg.SharedName2.f; // (+)FieldExprent. SharedName2 class name is shadowed by a variable in this method NonSharedName.f = k; // (-)ExprProcessor. The NonSharedName is not used for other objects in the current scope int y = NonSharedName.f; // (-)FieldExprent. The NonSharedName is not used for other objects in the current scope return SharedName2 + x + y; } @Override public void f() {} }