Bug 540631 - [1.8] wrong classification of name in name::new
Change-Id: Iac8813b561829af474ae44a6180452ad02e1154f
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
index e20a313..120b628 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java
@@ -5536,7 +5536,7 @@
"1. ERROR in X.java (at line 5)\n" +
" process(missing::new);\n" +
" ^^^^^^^\n" +
- "missing cannot be resolved\n" +
+ "missing cannot be resolved to a type\n" +
"----------\n");
}
public void testBug471280_comment0() {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java
index 2ab5c9e..da0ddf9 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/LambdaExpressionsTest.java
@@ -1277,8 +1277,8 @@
"----------\n" +
"5. ERROR in X.java (at line 15)\n" +
" i = X.Y::new;\n" +
- " ^\n" +
- "Y cannot be resolved or is not a field\n" +
+ " ^^^\n" +
+ "X.Y cannot be resolved to a type\n" +
"----------\n" +
"6. ERROR in X.java (at line 27)\n" +
" new X().new Y().f();\n" +
@@ -7065,7 +7065,35 @@
"}\n"
};
runner.runConformTest();
-
+}
+public void testBug540631() {
+ Runner runner = new Runner();
+ runner.testFiles = new String[] {
+ "EclipseCompileBug.java",
+ "public enum EclipseCompileBug {\n" +
+ " /*\n" +
+ " * Next line fails with these errors in Eclipse, works with javac:\n" +
+ " * <li>Test cannot be resolved to a type\n" +
+ " * <li>Cannot reference a field before it is defined\n" +
+ " */\n" +
+ " Test(Test::new);\n" +
+ "\n" +
+ " @FunctionalInterface\n" +
+ " public interface IConstructor<T extends Object> {\n" +
+ " T apply();\n" +
+ " }\n" +
+ "\n" +
+ " private final IConstructor<?> constructor;\n" +
+ " private EclipseCompileBug (IConstructor<?> newObj) {\n" +
+ " constructor = newObj;\n" +
+ " }\n" +
+ " \n" +
+ " public static class Test {\n" +
+ " \n" +
+ " }\n" +
+ "}\n"
+ };
+ runner.runConformTest();
}
public static Class testClass() {
return LambdaExpressionsTest.class;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
index e7849ee..885fc4c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java
@@ -58,6 +58,7 @@
import org.eclipse.jdt.internal.compiler.lookup.ClassScope;
import org.eclipse.jdt.internal.compiler.lookup.ExtraCompilerModifiers;
import org.eclipse.jdt.internal.compiler.lookup.MethodScope;
+import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
import org.eclipse.jdt.internal.compiler.lookup.TypeIds;
import org.eclipse.jdt.internal.compiler.parser.diagnose.DiagnoseParser;
import org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
@@ -8724,6 +8725,9 @@
} else {
referenceExpression.initialize(this.compilationUnit.compilationResult, getUnspecifiedReference(), typeArguments, selector, sourceEnd);
}
+ if (CharOperation.equals(selector, TypeConstants.INIT) && referenceExpression.lhs instanceof NameReference) {
+ referenceExpression.lhs.bits &= ~Binding.VARIABLE;
+ }
consumeReferenceExpression(referenceExpression);
}
protected void consumeReferenceExpressionPrimaryForm() {