Bug 533210 - [10][syntax highlighting] type 'var' colored as keyword if
compliance < 10
Change-Id: Ied90866b81ec5d3a8818286ac04486d499245a0b
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/dom/StandAloneASTParserTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/dom/StandAloneASTParserTest.java
index 92a4e2e..e92a37b 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/dom/StandAloneASTParserTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/dom/StandAloneASTParserTest.java
@@ -23,6 +23,7 @@
import java.util.Map;
import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
@@ -41,8 +42,10 @@
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.ModuleDeclaration;
+import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.NodeFinder;
import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.jdt.core.dom.SimpleType;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
@@ -1619,7 +1622,12 @@
parser.setBindingsRecovery(true);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setEnvironment(null, new String[] {null}, null, true);
- parser.setResolveBindings(true);
+ parser.setResolveBindings(true);
+ Map<String, String> options = getCompilerOptions();
+ options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_10);
+ options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_10);
+ options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_10);
+ parser.setCompilerOptions(options);
ASTNode node = parser.createAST(null);
assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType());
CompilationUnit cu = (CompilationUnit) node;
@@ -1704,4 +1712,45 @@
fileY.delete();
}
}
+
+ /*
+ * To test isVar returning false for ast level 10 and compliance 9
+ */
+ public void testBug533210_0001() throws JavaModelException {
+ String contents =
+ "public class X {\n" +
+ " public static void main(String[] args) {\n" +
+ " var s = new Y();\n" +
+ " }\n" +
+ "}\n" +
+ "class Y {}";
+
+ ASTParser parser = ASTParser.newParser(AST_JLS_LATEST);
+ parser.setSource(contents.toCharArray());
+ parser.setEnvironment(null, null, null, true);
+ parser.setResolveBindings(true);
+ parser.setStatementsRecovery(true);
+ parser.setBindingsRecovery(true);
+ parser.setUnitName("module-info.java");
+ Map<String, String> options = getCompilerOptions();
+ options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_9);
+ options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_9);
+ options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_9);
+ parser.setCompilerOptions(options);
+
+ ASTNode node = parser.createAST(null);
+ assertTrue("Should be a compilation unit", node instanceof CompilationUnit);
+ CompilationUnit cu = (CompilationUnit) node;
+ TypeDeclaration typeDeclaration = (TypeDeclaration) cu.types().get(0);
+ MethodDeclaration[] methods = typeDeclaration.getMethods();
+ MethodDeclaration methodDeclaration = methods[0];
+ VariableDeclarationStatement vStmt = (VariableDeclarationStatement) methodDeclaration.getBody().statements().get(0);
+ Type type = vStmt.getType();
+ SimpleType simpleType = (SimpleType) type;
+ assertFalse("A var", simpleType.isVar());
+ Name name = simpleType.getName();
+ SimpleName simpleName = (SimpleName) name;
+ assertFalse("A var", simpleName.isVar());
+ }
+
}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
index 4b5b232..c3585e1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
@@ -24,6 +24,7 @@
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.parser.Scanner;
import org.eclipse.jface.text.IDocument;
import org.eclipse.text.edits.TextEdit;
@@ -308,6 +309,20 @@
ASTConverter converter = new ASTConverter(options, isResolved, monitor);
AST ast = AST.newAST(level);
+ String sourceModeSetting = (String) options.get(JavaCore.COMPILER_SOURCE);
+ long sourceLevel = CompilerOptions.versionToJdkLevel(sourceModeSetting);
+ if (sourceLevel == 0) {
+ // unknown sourceModeSetting
+ sourceLevel = ClassFileConstants.JDK1_3;
+ }
+ ast.scanner.sourceLevel = sourceLevel;
+ String compliance = (String) options.get(JavaCore.COMPILER_COMPLIANCE);
+ long complianceLevel = CompilerOptions.versionToJdkLevel(compliance);
+ if (complianceLevel == 0) {
+ // unknown sourceModeSetting
+ complianceLevel = sourceLevel;
+ }
+ ast.scanner.complianceLevel = complianceLevel;
int savedDefaultNodeFlag = ast.getDefaultNodeFlag();
ast.setDefaultNodeFlag(ASTNode.ORIGINAL);
BindingResolver resolver = null;
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnitResolver.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnitResolver.java
index 2fa9187..068c969 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnitResolver.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnitResolver.java
@@ -27,6 +27,7 @@
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.WorkingCopyOwner;
import org.eclipse.jdt.core.compiler.CategorizedProblem;
@@ -40,6 +41,7 @@
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
import org.eclipse.jdt.internal.compiler.batch.FileSystem.Classpath;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
import org.eclipse.jdt.internal.compiler.env.ISourceType;
@@ -289,6 +291,20 @@
boolean fromJavaProject) {
BindingResolver resolver = null;
AST ast = AST.newAST(apiLevel);
+ String sourceModeSetting = (String) options.get(JavaCore.COMPILER_SOURCE);
+ long sourceLevel = CompilerOptions.versionToJdkLevel(sourceModeSetting);
+ if (sourceLevel == 0) {
+ // unknown sourceModeSetting
+ sourceLevel = ClassFileConstants.JDK1_3;
+ }
+ ast.scanner.sourceLevel = sourceLevel;
+ String compliance = (String) options.get(JavaCore.COMPILER_COMPLIANCE);
+ long complianceLevel = CompilerOptions.versionToJdkLevel(compliance);
+ if (complianceLevel == 0) {
+ // unknown sourceModeSetting
+ complianceLevel = sourceLevel;
+ }
+ ast.scanner.complianceLevel = complianceLevel;
ast.setDefaultNodeFlag(ASTNode.ORIGINAL);
CompilationUnit compilationUnit = null;
ASTConverter converter = new ASTConverter(options, needToResolveBindings, monitor);
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java
index d43a94f..c3d9af7 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java
@@ -156,7 +156,11 @@
if (get) {
return isVar();
} else {
- setVar(value);
+ if (Long.compare(this.ast.scanner.complianceLevel, ClassFileConstants.JDK10) < 0) {
+ setVar(false);
+ } else {
+ setVar(value);
+ }
return false;
}
}
@@ -174,7 +178,7 @@
SimpleName result = new SimpleName(target);
result.setSourceRange(getStartPosition(), getLength());
result.setIdentifier(getIdentifier());
- if (this.ast.apiLevel >= AST.JLS10_INTERNAL) {
+ if (this.ast.apiLevel >= AST.JLS10_INTERNAL && Long.compare(this.ast.scanner.complianceLevel, 10) >= 0) {
result.setVar(isVar());
}
return result;
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java
index e905240..519e5dc 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java
@@ -14,6 +14,8 @@
import java.util.ArrayList;
import java.util.List;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+
/**
* Type node for a named class type, a named interface type, or a type variable.
* <pre>
@@ -238,6 +240,8 @@
@Override
public boolean isVar() {
unsupportedBelow10();
+ if (Long.compare(this.ast.scanner.complianceLevel, ClassFileConstants.JDK10) < 0)
+ return false;
if (this.typeName == null) getName();
String qName = this.typeName.getFullyQualifiedName();
return qName != null && qName.equals("var"); //$NON-NLS-1$