blob: 6dc9327edf73fbc2c0af8a2c9b335fe74537aeca [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/
*
* This is an implementation of an early-draft specification developed under the Java
* Community Process (JCP) and is made available for testing and evaluation purposes
* only. The code is not compatible with any specification of the JCP.
*
* 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.core.runtime.CoreException;
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.compiler.IProblem;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
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.TextBlock;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
import org.eclipse.jdt.core.dom.YieldStatement;
import junit.framework.Test;
@SuppressWarnings("rawtypes")
public class ASTConverter13Test extends ConverterTestSetup {
ICompilationUnit workingCopy;
private static final String jclLib = "CONVERTER_JCL9_LIB";
public void setUpSuite() throws Exception {
super.setUpSuite();
this.ast = AST.newAST(getAST13(), false);
}
public ASTConverter13Test(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(ASTConverter13Test.class);
}
static int getAST13() {
return AST.JLS13;
}
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 -> {yield 10;}\n" +
" default -> {\n" +
" int g = day.toString().length();\n" +
" yield g;\n" +
" }};\n" +
" System.out.println(k);\n" +
" }\n" +
"}" ;
this.workingCopy = getWorkingCopy("/Converter13/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("/Converter13/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" +
" yield \"Weekend day\";\n" +
" case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY:\n" +
" yield \"Week day\";\n" +
" default:\n" +
" yield \"Any day\";\n" +
" };\n" +
" return today;\n" +
" }\n" +
"}" ;
this.workingCopy = getWorkingCopy("/Converter13/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" +
" yield \"Weekend day\";\n" +
" case MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY:\n" +
" yield \"Week day\";\n" +
" default:\n" +
" yield \"Any day\";\n" +
" };\n" +
" return today;\n" +
" }\n" +
"}" ;
this.workingCopy = getWorkingCopy("/Converter13/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());
YieldStatement brStmt = (YieldStatement) 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 = (YieldStatement) 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);
}
}
@Deprecated
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("/Converter13/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("/Converter13/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);
}
}
// Moved over from ASTConverter9Test
public void testBug531714_015() throws CoreException {
// saw NPE in SwitchExpression.resolveType(SwitchExpression.java:423)
if (!isJRE13) {
System.err.println("Test "+getName()+" requires a JRE 13");
return;
}
IJavaProject p = createJavaProject("Foo", new String[] {"src"}, new String[] {jclLib}, "bin", "13"); // FIXME jcl12?
p.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
p.setOption(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
try {
String source =
"import java.util.*;\n" +
"public class X {\n" +
" void testForeach1(int i, List<String> list) {\n" +
" for (String s : switch(i) { case 1 -> list; default -> ; }) {\n" +
" \n" +
" }\n" +
" Throwable t = switch (i) {\n" +
" case 1 -> new Exception();\n" +
" case 2 -> new RuntimeException();\n" + // trigger !typeUniformAcrossAllArms
" default -> missing;\n" +
" };\n" +
" }\n" +
" void testForeach0(int i, List<String> list) {\n" + // errors in first arm
" for (String s : switch(i) { case 1 -> ; default -> list; }) {\n" +
" \n" +
" }\n" +
" Throwable t = switch (i) {\n" +
" case 0 -> missing;\n" +
" case 1 -> new Exception();\n" +
" default -> new RuntimeException();\n" + // trigger !typeUniformAcrossAllArms
" };\n" +
" }\n" +
" void testForeachAll(int i) {\n" + // only erroneous arms
" Throwable t = switch (i) {\n" +
" case 0 -> missing;\n" +
" default -> absent;\n" +
" };\n" +
" }\n" +
"}\n";
createFile("Foo/src/X.java", source);
ICompilationUnit cuD = getCompilationUnit("/Foo/src/X.java");
ASTParser parser = ASTParser.newParser(AST_INTERNAL_JLS13);
parser.setProject(p);
parser.setSource(cuD);
parser.setResolveBindings(true);
parser.setStatementsRecovery(true);
parser.setBindingsRecovery(true);
org.eclipse.jdt.core.dom.CompilationUnit cuAST = (org.eclipse.jdt.core.dom.CompilationUnit) parser.createAST(null);
IProblem[] problems = cuAST.getProblems();
assertProblems("Unexpected problems",
"1. ERROR in /Foo/src/X.java (at line 4)\n" +
" for (String s : switch(i) { case 1 -> list; default -> ; }) {\n" +
" ^^\n" +
"Syntax error on token \"->\", Expression expected after this token\n" +
"----------\n" +
"2. ERROR in /Foo/src/X.java (at line 10)\n" +
" default -> missing;\n" +
" ^^^^^^^\n" +
"missing cannot be resolved to a variable\n" +
"----------\n" +
"3. ERROR in /Foo/src/X.java (at line 14)\n" +
" for (String s : switch(i) { case 1 -> ; default -> list; }) {\n" +
" ^^\n" +
"Syntax error on token \"->\", Expression expected after this token\n" +
"----------\n" +
"4. ERROR in /Foo/src/X.java (at line 18)\n" +
" case 0 -> missing;\n" +
" ^^^^^^^\n" +
"missing cannot be resolved to a variable\n" +
"----------\n" +
"5. ERROR in /Foo/src/X.java (at line 25)\n" +
" case 0 -> missing;\n" +
" ^^^^^^^\n" +
"missing cannot be resolved to a variable\n" +
"----------\n" +
"6. ERROR in /Foo/src/X.java (at line 26)\n" +
" default -> absent;\n" +
" ^^^^^^\n" +
"absent cannot be resolved to a variable\n" +
"----------\n",
problems, source.toCharArray());
} finally {
deleteProject(p);
}
}
public void test0007() throws JavaModelException {
String contents =
"public class X {\n" +
" public String test001() {\n" +
" String s = \"\"\"\n" +
" <html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
" </html>\n" +
" \"\"\";\n" +
" System.out.println(s);" +
" return s;\n" +
" }" +
"}" ;
this.workingCopy = getWorkingCopy("/Converter13/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, 0);
assertEquals("Text block 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();
assertTrue("Initializer is not a TextBlock", initializer instanceof TextBlock);
String escapedValue = ((TextBlock) initializer).getEscapedValue();
System.out.println(escapedValue);
assertTrue("String should not be empty", escapedValue.length() != 0);
assertTrue("String should start with \"\"\"", escapedValue.startsWith("\"\"\""));
} finally {
javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
}
}
}