diff options
| author | Sarika Sinha | 2018-04-20 11:44:53 +0000 |
|---|---|---|
| committer | Sarika Sinha | 2018-04-27 05:13:40 +0000 |
| commit | 17f843244d722f7543dc33e0f4ea19424b12c6b0 (patch) | |
| tree | c0a487b0be0716265c666d65527b9cb0286f3c1d | |
| parent | e5ce8d62839d03b3a8affb5e4bcaa2f5e2ab6db9 (diff) | |
| download | eclipse.jdt.core-17f843244d722f7543dc33e0f4ea19424b12c6b0.tar.gz eclipse.jdt.core-17f843244d722f7543dc33e0f4ea19424b12c6b0.tar.xz eclipse.jdt.core-17f843244d722f7543dc33e0f4ea19424b12c6b0.zip | |
Bug 533210 - [10][syntax highlighting] type 'var' colored as keyword ifI20180430-2000I20180430-0715I20180429-2000I20180428-2020I20180428-1500I20180427-2000
compliance < 10
Change-Id: Ied90866b81ec5d3a8818286ac04486d499245a0b
5 files changed, 91 insertions, 3 deletions
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 92a4e2e5c7..e92a37be44 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.List; 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.IVariableBinding; 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 @@ public class StandAloneASTParserTest extends AbstractRegressionTest { 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 @@ public class StandAloneASTParserTest extends AbstractRegressionTest { 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 4b5b232998..c3585e14ba 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.ICompilationUnit; 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 @@ public final class AST { 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 2fa9187e51..068c969bde 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.core.runtime.SubMonitor; 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.IProblemFactory; 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 @@ class CompilationUnitResolver extends Compiler { 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 d43a94f203..c3d9af7762 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 @@ public class SimpleName extends Name { 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 @@ public class SimpleName extends Name { 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 e905240ef1..519e5dccb4 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 @@ package org.eclipse.jdt.core.dom; 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 @@ public class SimpleType extends AnnotatableType { @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$ |
