blob: 7efc9f1f3692d9f4ea5d93654ad2acdd53ed146c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.dom;
import java.util.List;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.BreakStatement;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.Statement;
import org.eclipse.jdt.core.dom.SwitchCase;
import org.eclipse.jdt.core.dom.SwitchExpression;
import org.eclipse.jdt.core.dom.SwitchStatement;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
import junit.framework.Test;
@SuppressWarnings("rawtypes")
public class ASTConverter12Test extends ConverterTestSetup {
ICompilationUnit workingCopy;
public void setUpSuite() throws Exception {
super.setUpSuite();
this.ast = AST.newAST(getAST12());
}
public ASTConverter12Test(String name) {
super(name);
}
static {
// TESTS_NUMBERS = new int[] { 19 };
// TESTS_RANGE = new int[] { 1, -1 };
// TESTS_NAMES = new String[] {"test0001"};
}
public static Test suite() {
return buildModelTestSuite(ASTConverter12Test.class);
}
static int getAST12() {
return AST.JLS12;
}
protected void tearDown() throws Exception {
super.tearDown();
if (this.workingCopy != null) {
this.workingCopy.discardWorkingCopy();
this.workingCopy = null;
}
}
/*
* Test that a simple switch expression's return type holds the correct type
*/
public void test0001() throws JavaModelException {
String contents =
" public class X {\n" +
" enum Day\n" +
" {\n" +
" SUNDAY, MONDAY, TUESDAY, WEDNESDAY,\n" +
" THURSDAY, FRIDAY, SATURDAY;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" Day day = Day.SUNDAY;\n" +
" int k = switch (day) {\n" +
" case MONDAY -> throw new NullPointerException();\n" +
" case TUESDAY -> 1;\n" +
"\n" +
" case WEDNESDAY -> {break 10;}\n" +
" default -> {\n" +
" int g = day.toString().length();\n" +
" break g;\n" +
" }};\n" +
" System.out.println(k);\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);
MethodDeclaration methodDeclaration = (MethodDeclaration) node;
VariableDeclarationStatement vStmt1 = (VariableDeclarationStatement) methodDeclaration.getBody().statements().get(1);
Type type = vStmt1.getType();
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);
}
}
/*
* Test that a case statement with multiple cases is resolved correctly
* and has the correct source range
*/
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);
checkSourceRange((Statement) switchStatement.statements().get(2), "case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY ->", contents);
} finally {
javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
}
}
/* test implicit break statement */
public void test0003() 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" +
" String today = \"\";\n" +
" today = switch (day) {\n" +
" case SATURDAY,SUNDAY:\n" +
" break \"Weekend day\";\n" +
" case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY:\n" +
" break \"Week day\";\n" +
" default:\n" +
" break \"Any day\";\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);
}
}
public void test0004() throws JavaModelException {
String contents =
"public class X {\n" +
" static enum Day {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY, SATURDAY,SUNDAY}\n" +
" String bb(Day day) throws Exception {\n" +
" String today = switch (day) {\n" +
" case SATURDAY,SUNDAY:\n" +
" break \"Weekend day\";\n" +
" case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY:\n" +
" break \"Week day\";\n" +
" default:\n" +
" break \"Any day\";\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, 0);
assertEquals("Switch statement", node.getNodeType(), ASTNode.VARIABLE_DECLARATION_STATEMENT);
List fragments = ((VariableDeclarationStatement) node).fragments();
assertEquals("Incorrect no of fragments", 1, fragments.size());
node = (ASTNode) fragments.get(0);
assertEquals("Switch statement", node.getNodeType(), ASTNode.VARIABLE_DECLARATION_FRAGMENT);
VariableDeclarationFragment fragment = (VariableDeclarationFragment) node;
Expression initializer = fragment.getInitializer();
assertEquals("incorrect type", ASTNode.SWITCH_EXPRESSION, initializer.getNodeType());
Expression expression = ((SwitchExpression) initializer).getExpression();
assertEquals("incorrect type", ASTNode.SIMPLE_NAME, expression.getNodeType());
assertEquals("incorrect name", "day", ((SimpleName) expression).getFullyQualifiedName());
List statements = ((SwitchExpression) initializer).statements();
assertEquals("incorrect no of statements", 6, statements.size());
BreakStatement brStmt = (BreakStatement) statements.get(1);
Expression expression2 = brStmt.getExpression();
assertNotNull("should not null", expression2);
assertEquals("incorrect node type", ASTNode.STRING_LITERAL, expression2.getNodeType());
//default case:
SwitchCase caseStmt = (SwitchCase) statements.get(4);
assertTrue("not default", caseStmt.isDefault());
brStmt = (BreakStatement) statements.get(5);
expression2 = brStmt.getExpression();
assertNotNull("should not null", expression2);
assertEquals("incorrect node type", ASTNode.STRING_LITERAL, expression2.getNodeType());
} finally {
javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
}
}
public void test0005() throws JavaModelException {
String contents =
"public class X {\n" +
" public String test001() {\n" +
" int i = 0;\n" +
" String ret = switch(i%2) {\n" +
" case 0 -> \"odd\";\n" +
" case 1 -> \"even\";\n" +
" default -> \"\";\n" +
" };\n" +
" return ret;\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, 0, 1);
assertEquals("Switch statement", node.getNodeType(), ASTNode.VARIABLE_DECLARATION_STATEMENT);
List fragments = ((VariableDeclarationStatement) node).fragments();
assertEquals("Incorrect no of fragments", 1, fragments.size());
node = (ASTNode) fragments.get(0);
assertEquals("Switch statement", node.getNodeType(), ASTNode.VARIABLE_DECLARATION_FRAGMENT);
VariableDeclarationFragment fragment = (VariableDeclarationFragment) node;
Expression initializer = fragment.getInitializer();
assertEquals("incorrect type", ASTNode.SWITCH_EXPRESSION, initializer.getNodeType());
Expression expression = ((SwitchExpression) initializer).getExpression();
assertEquals("incorrect type", ASTNode.INFIX_EXPRESSION, expression.getNodeType());
List statements = ((SwitchExpression) initializer).statements();
assertEquals("incorrect no of statements", 6, statements.size());
BreakStatement brStmt = (BreakStatement) statements.get(1);
Expression expression2 = brStmt.getExpression();
assertNotNull("should not null", expression2);
assertEquals("incorrect node type", ASTNode.STRING_LITERAL, expression2.getNodeType());
//default case:
SwitchCase caseStmt = (SwitchCase) statements.get(4);
assertTrue("not default", caseStmt.isDefault());
brStmt = (BreakStatement) statements.get(5);
expression2 = brStmt.getExpression();
assertNotNull("should not null", expression2);
assertEquals("incorrect node type", ASTNode.STRING_LITERAL, expression2.getNodeType());
} finally {
javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
}
}
public void test0006() throws JavaModelException {
String contents =
"public class X {\n" +
" public String test001() {\n" +
" int i = 0;\n" +
" String ret = switch(i%2) {\n" +
" case 0 -> {return \"odd\"; }\n" +
" case 1 -> \"even\";\n" +
" default -> \"\";\n" +
" };\n" +
" return ret;\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, 0, 1);
assertEquals("Switch statement", node.getNodeType(), ASTNode.VARIABLE_DECLARATION_STATEMENT);
List fragments = ((VariableDeclarationStatement) node).fragments();
assertEquals("Incorrect no of fragments", 1, fragments.size());
node = (ASTNode) fragments.get(0);
assertEquals("Switch statement", node.getNodeType(), ASTNode.VARIABLE_DECLARATION_FRAGMENT);
VariableDeclarationFragment fragment = (VariableDeclarationFragment) node;
Expression initializer = fragment.getInitializer();
List statements = ((SwitchExpression) initializer).statements();
assertEquals("incorrect no of statements", 6, statements.size());
Block block = (Block) statements.get(1);
statements = block.statements();
assertEquals("incorrect no of statements", 1, statements.size());
Statement stmt = (Statement) statements.get(0);
assertEquals("incorrect node type", ASTNode.RETURN_STATEMENT, stmt.getNodeType());
} finally {
javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
}
}
}