View | Details | Raw Unified | Return to bug 165069
Collapse All | Expand All

(-)compiler/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java (-18 / +26 lines)
Lines 156-183 Link Here
156
			ClassScope classScope = initializationScope.enclosingClassScope();
156
			ClassScope classScope = initializationScope.enclosingClassScope();
157
			
157
			
158
			if (classScope != null) {
158
			if (classScope != null) {
159
				SourceTypeBinding declaringType = classScope.enclosingSourceType();
159
				checkHiding: {
160
				boolean checkLocal = true;
160
					SourceTypeBinding declaringType = classScope.enclosingSourceType();
161
				if (declaringType.superclass != null) {
161
					checkHidingSuperField: {
162
					Binding existingVariable = classScope.findField(declaringType.superclass, this.name, this,  false /*do not resolve hidden field*/);
162
						if (declaringType.superclass == null) break checkHidingSuperField;
163
					if (existingVariable != null && this.binding != existingVariable && existingVariable.isValidBinding()){
163
						Binding existingVariable = classScope.findField(declaringType.superclass, this.name, this,  false /*do not resolve hidden field*/);
164
						if (existingVariable == null) break checkHidingSuperField; // keep checking outer scenario
165
						if (!existingVariable.isValidBinding())  break checkHidingSuperField; // keep checking outer scenario
166
						if (existingVariable instanceof FieldBinding) {
167
							FieldBinding existingField = (FieldBinding) existingVariable;
168
							if (existingField.original() == this.binding) break checkHidingSuperField; // keep checking outer scenario
169
						}
170
						// collision with supertype field
164
						initializationScope.problemReporter().fieldHiding(this, existingVariable);
171
						initializationScope.problemReporter().fieldHiding(this, existingVariable);
165
						checkLocal = false; // already found a matching field
172
						break checkHiding; // already found a matching field
166
					}
173
					}					
167
				}
168
				if (checkLocal) {
169
					Scope outerScope = classScope.parent;
170
					// only corner case is: lookup of outer field through static declaringType, which isn't detected by #getBinding as lookup starts
174
					// only corner case is: lookup of outer field through static declaringType, which isn't detected by #getBinding as lookup starts
171
					// from outer scope. Subsequent static contexts are detected for free.
175
					// from outer scope. Subsequent static contexts are detected for free.
172
					if (outerScope.kind != Scope.COMPILATION_UNIT_SCOPE) {
176
					Scope outerScope = classScope.parent;
173
						Binding existingVariable = outerScope.getBinding(this.name, Binding.VARIABLE, this, false /*do not resolve hidden field*/);
177
					if (outerScope.kind == Scope.COMPILATION_UNIT_SCOPE) break checkHiding;
174
						if (existingVariable != null && this.binding != existingVariable && existingVariable.isValidBinding()
178
					Binding existingVariable = outerScope.getBinding(this.name, Binding.VARIABLE, this, false /*do not resolve hidden field*/);
175
								&& (!(existingVariable instanceof FieldBinding)
179
					if (existingVariable == null) break checkHiding;
176
										|| ((FieldBinding) existingVariable).isStatic() 
180
					if (!existingVariable.isValidBinding()) break checkHiding;
177
										|| !declaringType.isStatic())) {
181
					if (existingVariable == this.binding) break checkHiding;
178
							initializationScope.problemReporter().fieldHiding(this, existingVariable);
182
					if (existingVariable instanceof FieldBinding) {
179
						}
183
						FieldBinding existingField = (FieldBinding) existingVariable;
184
						if (existingField.original() == this.binding) break checkHiding;
185
						if (!existingField.isStatic() && declaringType.isStatic()) break checkHiding;
180
					}
186
					}
187
					// collision with outer field or local variable
188
					initializationScope.problemReporter().fieldHiding(this, existingVariable);
181
				}
189
				}
182
			}
190
			}
183
			
191
			
(-)src/org/eclipse/jdt/core/tests/compiler/regression/StaticImportTest.java (+37 lines)
Lines 1755-1758 Link Here
1755
			"----------\n"
1755
			"----------\n"
1756
		);		
1756
		);		
1757
	}
1757
	}
1758
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=165069
1759
	public void testONLY_047() {
1760
		this.runNegativeTest(
1761
			new String[] {
1762
				"sample/X.java",
1763
				"package sample;\n" + 
1764
				"import static sample.X.TestEnum.V1;\n" + 
1765
				"import static sample.X.TestEnum.V2;\n" + 
1766
				"\n" + 
1767
				"public class X<T> {\n" + 
1768
				"        public static enum TestEnum {\n" + 
1769
				"                V1,\n" + 
1770
				"                V2\n" + 
1771
				"        }\n" + 
1772
				"\n" + 
1773
				"        public void test(final TestEnum value) {\n" + 
1774
				"                switch (value) {\n" + 
1775
				"                        case V1:\n" + 
1776
				"                        case V2:\n" + 
1777
				"                }\n" + 
1778
				"        }\n" + 
1779
				"\n" + 
1780
				"        public void ref() {\n" + 
1781
				"               final TestEnum v1 = TestEnum.V1;\n" + 
1782
				"               final TestEnum v2 = TestEnum.V2;\n" + 
1783
				"				Zork z;\n" +
1784
				"        }\n" + 
1785
				"}", // =================
1786
			},
1787
			"----------\n" + 
1788
			"1. ERROR in sample\\X.java (at line 21)\n" + 
1789
			"	Zork z;\n" + 
1790
			"	^^^^\n" + 
1791
			"Zork cannot be resolved to a type\n" + 
1792
			"----------\n"
1793
		);		
1794
	}
1758
}
1795
}

Return to bug 165069