Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Thomann2019-02-14 06:57:14 +0000
committerManoj Palat2019-02-14 06:57:14 +0000
commit0dafaea9437765af6a924b8fc8f523beb778e26f (patch)
tree85de098f20e418071859edacf3ac80658c4c420c
parent5bba0c553b2a86aa924d4b7a837792fbfec0583c (diff)
downloadeclipse.jdt.core-0dafaea9437765af6a924b8fc8f523beb778e26f.tar.gz
eclipse.jdt.core-0dafaea9437765af6a924b8fc8f523beb778e26f.tar.xz
eclipse.jdt.core-0dafaea9437765af6a924b8fc8f523beb778e26f.zip
Bug 544255 - [12] SwitchCase AST node has wrong range
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter12Test.java62
-rw-r--r--org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java23
2 files changed, 75 insertions, 10 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter12Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter12Test.java
index bbfd9fda6b..f7637c7ed0 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter12Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter12Test.java
@@ -25,6 +25,8 @@ import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.Statement;
+import org.eclipse.jdt.core.dom.SwitchStatement;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
@@ -89,8 +91,8 @@ public class ASTConverter12Test extends ConverterTestSetup {
IJavaProject javaProject = this.workingCopy.getJavaProject();
String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
try {
- javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
- javaProject.setOption(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
+ javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+ javaProject.setOption(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
ASTNode node = buildAST(
contents,
this.workingCopy);
@@ -104,10 +106,60 @@ public class ASTConverter12Test extends ConverterTestSetup {
IBinding binding = type.resolveBinding();
assertTrue("null binding", binding != null);
assertTrue("binding incorrect", binding.getName().equals("int"));
-
} finally {
javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
- }
-
+ }
+ }
+ public void test0002() throws JavaModelException {
+ String contents =
+ "public class X {\n" +
+ " static enum Day {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY, SATURDAY,SUNDAY}\n" +
+ " String aa(Day day) throws Exception {\n" +
+ " var today = \"\";\n" +
+ " switch (day) {\n" +
+ " case SATURDAY,SUNDAY ->\n" +
+ " today=\"Weekend\";\n" +
+ " case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY ->\n" +
+ " today=\"Working\";\n" +
+ " default ->\n" +
+ " throw new Exception(\"Invalid day: \" + day.name());\n" +
+ " }\n" +
+ " return today;\n" +
+ " }\n" +
+ " \n" +
+ " String bb(Day day) throws Exception {\n" +
+ " var today = \"\";\n" +
+ " switch (day) {\n" +
+ " case SATURDAY,SUNDAY:\n" +
+ " today = \"Weekend day\";\n" +
+ " break;\n" +
+ " case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY:\n" +
+ " today = \"Working day\";\n" +
+ " break;\n" +
+ " default:\n" +
+ " throw new Exception(\"Invalid day: \" + day.name());\n" +
+ " }\n" +
+ " return today;\n" +
+ " }\n" +
+ "}" ;
+ this.workingCopy = getWorkingCopy("/Converter12/src/X.java", true/*resolve*/);
+ IJavaProject javaProject = this.workingCopy.getJavaProject();
+ String old = javaProject.getOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, true);
+ try {
+ javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+ javaProject.setOption(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
+ ASTNode node = buildAST(
+ contents,
+ this.workingCopy);
+ assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType());
+ CompilationUnit compilationUnit = (CompilationUnit) node;
+ assertProblemsSize(compilationUnit, 0);
+ node = getASTNode(compilationUnit, 0, 1, 1);
+ assertEquals("Switch statement", node.getNodeType(), ASTNode.SWITCH_STATEMENT);
+ SwitchStatement switchStatement = (SwitchStatement) node;
+ checkSourceRange((Statement) switchStatement.statements().get(0), "case SATURDAY,SUNDAY ->", contents);
+ } finally {
+ javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
+ }
}
}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
index 596833dec2..cd1ea2b897 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
@@ -1308,8 +1308,7 @@ class ASTConverter {
switchCase.getExpressions().add(convert(expression));
}
}
- }
- else {
+ } else {
org.eclipse.jdt.internal.compiler.ast.Expression constantExpression = statement.constantExpression;
if (constantExpression == null) {
switchCase.setExpression(null);
@@ -1321,7 +1320,11 @@ class ASTConverter {
switchCase.setSwitchLabeledRule(statement.isExpr);
}
switchCase.setSourceRange(statement.sourceStart, statement.sourceEnd - statement.sourceStart + 1);
- retrieveColonPosition(switchCase);
+ if (statement.isExpr) {
+ retrieveArrowPosition(switchCase);
+ } else {
+ retrieveColonPosition(switchCase);
+ }
return switchCase;
}
@@ -4849,6 +4852,17 @@ class ASTConverter {
* This method fixes the length of the corresponding node.
*/
protected void retrieveColonPosition(ASTNode node) {
+ setNodeSourceEndPosition(node, TerminalTokens.TokenNameCOLON);
+ }
+ /**
+ * This method is used to set the right end position for switch labeled rules ie with '->'
+ * The actual AST nodes don't include the trailing semicolon.
+ * This method fixes the length of the corresponding node.
+ */
+ private void retrieveArrowPosition(ASTNode node) {
+ setNodeSourceEndPosition(node, TerminalTokens.TokenNameARROW);
+ }
+ private void setNodeSourceEndPosition(ASTNode node, int expectedToken) {
int start = node.getStartPosition();
int length = node.getLength();
int end = start + length;
@@ -4856,8 +4870,7 @@ class ASTConverter {
try {
int token;
while ((token = this.scanner.getNextToken()) != TerminalTokens.TokenNameEOF) {
- switch(token) {
- case TerminalTokens.TokenNameCOLON:
+ if (token == expectedToken) {
node.setSourceRange(start, this.scanner.currentPosition - start);
return;
}

Back to the top