blob: 58791869f0d7c65bacdba63bc053ed4a1d8ab97b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017, 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.rewrite.describing;
import java.util.List;
import junit.framework.Test;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.dom.*;
import org.eclipse.jdt.core.dom.ModuleModifier.ModuleModifierKeyword;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
import org.eclipse.jdt.internal.compiler.util.Util;
public class ASTRewritingModuleDeclarationTest extends ASTRewritingTest {
public ASTRewritingModuleDeclarationTest(String name) {
super(name);
}
public ASTRewritingModuleDeclarationTest(String name, int apiLevel) {
super(name, apiLevel);
}
public static Test suite() {
return createSuite(ASTRewritingModuleDeclarationTest.class);
}
public void testBug509961_0001_since_9() throws Exception {
IJavaProject javaProject = null ;
try {
javaProject = createProject("P_9", JavaCore.VERSION_9);
IPackageFragmentRoot currentSourceFolder = getPackageFragmentRoot("P_9", "src");
IPackageFragment pack1= currentSourceFolder.getPackageFragment(Util.EMPTY_STRING);
StringBuffer buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires second;\n");
buf.append(" requires removeme;\n");
buf.append(" exports pack11 to third, fourth;\n");
buf.append(" exports pack12 to fifth;\n");
buf.append(" exports pack12 to remove.mod1;\n");
buf.append(" exports pack13 to well.founded.module2;\n");
buf.append(" uses MyType;\n");
buf.append(" uses Type.Remove;\n");
buf.append(" provides pack22.I22 with pack11.packinternal.Z11;\n");
buf.append(" provides pack23.I23 with pack11.Z23, pack12.ZZ23;\n");
buf.append("}");
ICompilationUnit cu= pack1.createCompilationUnit("module-info.java", buf.toString(), false, null);
CompilationUnit astRoot= createAST(cu);
ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST());
AST ast= astRoot.getAST();
ModuleDeclaration moduleDecl = astRoot.getModule();
ListRewrite listRewrite = rewrite.getListRewrite(moduleDecl, ModuleDeclaration.MODULE_DIRECTIVES_PROPERTY);
List<ModuleDirective> moduleStatements = moduleDecl.moduleStatements();
int index = 0;
{
RequiresDirective req = (RequiresDirective) moduleStatements.get(index++); // replace the module in first required
Name newName = ast.newSimpleName("newSecond");
rewrite.replace(req.getName(), newName, null);
listRewrite.remove(moduleStatements.get(index++), null); // remove the second required
RequiresDirective newNode = ast.newRequiresDirective(); // add a new required
newNode.setName(ast.newSimpleName("addedme"));
listRewrite.insertAfter(newNode, req, null);
}
{
// exports pack11 to third, fourth; -> exports newpack11 to third;
ExportsDirective exp = (ExportsDirective) moduleStatements.get(index++);
Name newName = ast.newSimpleName("newpack11");
rewrite.replace(exp.getName(), newName, null);
ListRewrite expListRewrite = rewrite.getListRewrite(exp, ExportsDirective.MODULES_PROPERTY);
expListRewrite.remove((ASTNode) exp.modules().get(1), null);
// exports pack12 to fifth -> exports pack12 to fifth, sixth
exp = (ExportsDirective) moduleStatements.get(index++);
newName = ast.newSimpleName("sixth");
expListRewrite = rewrite.getListRewrite(exp, ExportsDirective.MODULES_PROPERTY);
expListRewrite.insertLast(newName, null);
// exports pack12 to remove.mod1 -> exports pack12
exp = (ExportsDirective) moduleStatements.get(index++);
expListRewrite = rewrite.getListRewrite(exp, ExportsDirective.MODULES_PROPERTY);
expListRewrite.remove((ASTNode) exp.modules().get(0), null);
// exports pack12 to never.to.be.module - remove the export
listRewrite.remove((ASTNode) moduleDecl.moduleStatements().get(index++), null);
// exports pack12 to new.found.module - add the export
exp = ast.newExportsStatement();
exp.setName(ast.newSimpleName("pack12"));
Name name = ast.newName("well.founded.module3");
exp.modules().add(name);
listRewrite.insertLast(exp, null);
}
{
// uses MyType -> uses MyNewType;
UsesDirective usesStatement = (UsesDirective) moduleStatements.get(index++);
Name newName = ast.newSimpleName("MyNewType");
rewrite.replace(usesStatement.getName(), newName, null);
// uses Type.Remove - remove the uses
listRewrite.remove(moduleStatements.get(index++), null);
// uses MyNewFoundType - add the uses
usesStatement = ast.newUsesDirective();
newName = ast.newSimpleName("MyNewFoundType");
usesStatement.setName(newName);
listRewrite.insertLast(usesStatement, null);
}
{
// provides pack22.I22 with pack11.packinternal.Z11 -> provides pack22.INew22 with pack11.packinternal.NewZ11, pack11.Y11
ProvidesDirective providesStatement = (ProvidesDirective) moduleStatements.get(index++);
Name newName = ast.newName("pack22.INew22");
rewrite.replace(providesStatement.getName(), newName, null);
newName = ast.newName("pack11.packinternal.NewZ11");
ListRewrite pListRewrite = rewrite.getListRewrite(providesStatement, ProvidesDirective.IMPLEMENTATIONS_PROPERTY);
pListRewrite.replace((ASTNode) providesStatement.implementations().get(0), newName ,null);
newName = ast.newName("pack11.Y11");
pListRewrite.insertLast(newName, null);
// provides pack23.I23 with pack11.Z23, pack12.ZZ23 -> provides pack23.I23 with pack12.ZZ23
providesStatement = (ProvidesDirective) moduleStatements.get(index++);
pListRewrite = rewrite.getListRewrite(providesStatement, ProvidesDirective.IMPLEMENTATIONS_PROPERTY);
pListRewrite.remove((ASTNode) providesStatement.implementations().get(0), null);
}
String preview= evaluateRewrite(cu, rewrite);
buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires newSecond;\n");
buf.append(" requires addedme;\n");
buf.append(" exports newpack11 to third;\n");
buf.append(" exports pack12 to fifth, sixth;\n");
buf.append(" exports pack12;\n");
buf.append(" uses MyNewType;\n");
buf.append(" provides pack22.INew22 with pack11.packinternal.NewZ11, pack11.Y11;\n");
buf.append(" provides pack23.I23 with pack12.ZZ23;\n");
buf.append(" exports pack12 to well.founded.module3;\n");
buf.append(" uses MyNewFoundType;\n");
buf.append("}");
assertEqualString(preview, buf.toString());
} finally {
if (javaProject != null)
deleteProject(javaProject);
}
}
public void testBug509961_0002_since_9() throws Exception {
IJavaProject javaProject = null;
try {
javaProject = createProject("P_9", JavaCore.VERSION_9);
IPackageFragmentRoot currentSourceFolder = getPackageFragmentRoot("P_9", "src");
IPackageFragment pack1= currentSourceFolder.getPackageFragment(Util.EMPTY_STRING);
StringBuffer buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires existing;\n");
buf.append("}");
ICompilationUnit cu= pack1.createCompilationUnit("module-info.java", buf.toString(), false, null);
CompilationUnit astRoot= createAST(cu);
ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST());
AST ast= astRoot.getAST();
ModuleDeclaration moduleDecl = astRoot.getModule();
ListRewrite listRewrite = rewrite.getListRewrite(moduleDecl, ModuleDeclaration.MODULE_DIRECTIVES_PROPERTY);
{
RequiresDirective newNode = ast.newRequiresDirective(); // add a new required
newNode.setName(ast.newSimpleName("addedme"));
listRewrite.insertLast(newNode, null);
}
String preview= evaluateRewrite(cu, rewrite);
buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires existing;\n");
buf.append(" requires addedme;\n");
buf.append("}");
assertEqualString(preview, buf.toString());
} finally {
if (javaProject != null) deleteProject(javaProject);
}
}
public void testBug509961_0003_since_9() throws Exception {
IJavaProject javaProject = null;
try {
javaProject = createProject("P_9", JavaCore.VERSION_9);
IPackageFragmentRoot currentSourceFolder = getPackageFragmentRoot("P_9", "src");
IPackageFragment pack1= currentSourceFolder.getPackageFragment(Util.EMPTY_STRING);
StringBuffer buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires existing;\n");
buf.append(" requires static module1;\n");
buf.append(" requires static module2;\n");
buf.append(" requires static module3;\n");
buf.append("}");
ICompilationUnit cu= pack1.createCompilationUnit("module-info.java", buf.toString(), false, null);
CompilationUnit astRoot= createAST(cu);
ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST());
AST ast= astRoot.getAST();
ModuleDeclaration moduleDecl = astRoot.getModule();
ListRewrite listRewrite = rewrite.getListRewrite(moduleDecl, ModuleDeclaration.MODULE_DIRECTIVES_PROPERTY);
{
RequiresDirective reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(0);
ASTNode newModifier = ast.newModuleModifier(ModuleModifierKeyword.STATIC_KEYWORD);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).insertFirst(newModifier, null);
reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(1);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).remove((ASTNode) reqNode.modifiers().get(0), null);
reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(2);
newModifier = ast.newModuleModifier(ModuleModifierKeyword.TRANSITIVE_KEYWORD);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).replace((ASTNode) reqNode.modifiers().get(0), newModifier, null);
reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(3);
newModifier = ast.newModuleModifier(ModuleModifierKeyword.TRANSITIVE_KEYWORD);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).insertLast(newModifier, null);
RequiresDirective newNode = ast.newRequiresDirective(); // add a new required
newNode.setName(ast.newSimpleName("addedme"));
newModifier = ast.newModuleModifier(ModuleModifierKeyword.TRANSITIVE_KEYWORD);
rewrite.getListRewrite(newNode, RequiresDirective.MODIFIERS_PROPERTY).insertFirst(newModifier, null);
listRewrite.insertLast(newNode, null);
}
String preview= evaluateRewrite(cu, rewrite);
buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires static existing;\n");
buf.append(" requires module1;\n");
buf.append(" requires transitive module2;\n");
buf.append(" requires static transitive module3;\n");
buf.append(" requires transitive addedme;\n");
buf.append("}");
assertEqualString(preview, buf.toString());
} finally {
if (javaProject != null) deleteProject(javaProject);
}
}
public void testBug516731_0001_since_9() throws Exception {
IJavaProject javaProject = null;
try {
javaProject = createProject("P_9", JavaCore.VERSION_9);
IPackageFragmentRoot currentSourceFolder = getPackageFragmentRoot("P_9", "src");
IPackageFragment pack1= currentSourceFolder.getPackageFragment(Util.EMPTY_STRING);
StringBuffer buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires existing;\n");
buf.append("}");
ICompilationUnit cu= pack1.createCompilationUnit("module-info.java", buf.toString(), false, null);
CompilationUnit astRoot= createAST(cu);
ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST());
ModuleDeclaration moduleDecl = astRoot.getModule();
rewrite.set(moduleDecl, ModuleDeclaration.OPEN_PROPERTY, Boolean.TRUE, null);
String preview= evaluateRewrite(cu, rewrite);
buf= new StringBuffer();
buf.append("open module first {\n");
buf.append(" requires existing;\n");
buf.append("}");
assertEqualString(preview, buf.toString());
} finally {
if (javaProject != null) deleteProject(javaProject);
}
}
public void testBug516731_0002_since_9() throws Exception {
IJavaProject javaProject = null;
try {
javaProject = createProject("P_9", JavaCore.VERSION_9);
IPackageFragmentRoot currentSourceFolder = getPackageFragmentRoot("P_9", "src");
IPackageFragment pack1= currentSourceFolder.getPackageFragment(Util.EMPTY_STRING);
StringBuffer buf= new StringBuffer();
buf.append("open module first {\n");
buf.append(" requires existing;\n");
buf.append("}");
ICompilationUnit cu= pack1.createCompilationUnit("module-info.java", buf.toString(), false, null);
CompilationUnit astRoot= createAST(cu);
ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST());
ModuleDeclaration moduleDecl = astRoot.getModule();
rewrite.set(moduleDecl, ModuleDeclaration.OPEN_PROPERTY, Boolean.FALSE, null);
String preview= evaluateRewrite(cu, rewrite);
buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires existing;\n");
buf.append("}");
assertEqualString(preview, buf.toString());
} finally {
if (javaProject != null) deleteProject(javaProject);
}
}
public void testBug516731_0003_since_9() throws Exception {
IJavaProject javaProject = null;
try {
javaProject = createProject("P_9", JavaCore.VERSION_9);
IPackageFragmentRoot currentSourceFolder = getPackageFragmentRoot("P_9", "src");
IPackageFragment pack1= currentSourceFolder.getPackageFragment(Util.EMPTY_STRING);
StringBuffer buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires existing;\n");
buf.append(" requires static module1;\n");
buf.append(" requires static module2;\n");
buf.append(" requires static module3;\n");
buf.append(" requires static module4;\n");
buf.append("}");
ICompilationUnit cu= pack1.createCompilationUnit("module-info.java", buf.toString(), false, null);
CompilationUnit astRoot= createAST(cu);
ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST());
AST ast= astRoot.getAST();
ModuleDeclaration moduleDecl = astRoot.getModule();
ListRewrite listRewrite = rewrite.getListRewrite(moduleDecl, ModuleDeclaration.MODULE_DIRECTIVES_PROPERTY);
{
int count = 0;
RequiresDirective reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(count++);
ASTNode newModifier = ast.newModuleModifier(ModuleModifierKeyword.STATIC_KEYWORD);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).insertFirst(newModifier, null);
newModifier = ast.newModuleModifier(ModuleModifierKeyword.TRANSITIVE_KEYWORD);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).insertLast(newModifier, null);
reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(count++);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).remove((ASTNode) reqNode.modifiers().get(0), null);
reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(count++);
newModifier = ast.newModuleModifier(ModuleModifierKeyword.TRANSITIVE_KEYWORD);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).replace((ASTNode) reqNode.modifiers().get(0), newModifier, null);
reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(count++);
newModifier = ast.newModuleModifier(ModuleModifierKeyword.TRANSITIVE_KEYWORD);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).insertLast(newModifier, null);
reqNode = (RequiresDirective) moduleDecl.moduleStatements().get(count++);
newModifier = ast.newModuleModifier(ModuleModifierKeyword.TRANSITIVE_KEYWORD);
rewrite.getListRewrite(reqNode, RequiresDirective.MODIFIERS_PROPERTY).insertFirst(newModifier, null);
RequiresDirective newNode = ast.newRequiresDirective(); // add a new required
newNode.setName(ast.newSimpleName("addedme"));
newModifier = ast.newModuleModifier(ModuleModifierKeyword.TRANSITIVE_KEYWORD);
rewrite.getListRewrite(newNode, RequiresDirective.MODIFIERS_PROPERTY).insertFirst(newModifier, null);
listRewrite.insertLast(newNode, null);
}
String preview= evaluateRewrite(cu, rewrite);
buf= new StringBuffer();
buf.append("module first {\n");
buf.append(" requires static transitive existing;\n");
buf.append(" requires module1;\n");
buf.append(" requires transitive module2;\n");
buf.append(" requires static transitive module3;\n");
buf.append(" requires transitive static module4;\n");
buf.append(" requires transitive addedme;\n");
buf.append("}");
assertEqualString(preview, buf.toString());
} finally {
if (javaProject != null) deleteProject(javaProject);
}
}
public void testBug542106_since_9() throws Exception {
IJavaProject javaProject = null;
try {
javaProject = createProject("P_9", JavaCore.VERSION_9);
IPackageFragmentRoot currentSourceFolder = getPackageFragmentRoot("P_9", "src");
IPackageFragment pack1= currentSourceFolder.getPackageFragment(Util.EMPTY_STRING);
String content =
"import java.util.*;\n" +
"import java.util.function.Consumer;\n" +
"module first {\n" +
"}";
ICompilationUnit cu= pack1.createCompilationUnit("module-info.java", content, false, null);
CompilationUnit astRoot= createAST(cu);
ASTRewrite rewrite= ASTRewrite.create(astRoot.getAST());
AST ast= astRoot.getAST();
ListRewrite listRewrite = rewrite.getListRewrite(astRoot, CompilationUnit.IMPORTS_PROPERTY);
{
listRewrite.remove((ImportDeclaration) astRoot.imports().get(0), null);
ImportDeclaration newImport = ast.newImportDeclaration();
newImport.setName(ast.newName("java.io.Serializable"));
listRewrite.insertFirst(newImport, null);
}
String preview= evaluateRewrite(cu, rewrite);
content =
"import java.io.Serializable;\n" +
"import java.util.function.Consumer;\n" +
"module first {\n" +
"}";
assertEqualString(preview, content);
} finally {
if (javaProject != null) deleteProject(javaProject);
}
}
}