Copyright (c) 2000, 2008 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
/*******************************************************************************
* Copyright (c) 2000, 2008 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.internal.core;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IImportDeclaration;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaModelStatus;
import org.eclipse.jdt.core.IJavaModelStatusConstants;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaConventions;
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.CompilationUnit;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.PackageDeclaration;
import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jdt.internal.core.util.Messages;
This operation adds/replaces a package declaration in an existing compilation unit.
If the compilation unit already includes the specified package declaration,
it is not generated (it does not generate duplicates).
Required Attributes:
- Compilation unit element
- Package name
/**
* <p>This operation adds/replaces a package declaration in an existing compilation unit.
* If the compilation unit already includes the specified package declaration,
* it is not generated (it does not generate duplicates).
*
* <p>Required Attributes:<ul>
* <li>Compilation unit element
* <li>Package name
* </ul>
*/
public class CreatePackageDeclarationOperation extends CreateElementInCUOperation {
The name of the package declaration being created
/**
* The name of the package declaration being created
*/
protected String name = null;
When executed, this operation will add a package declaration to the given compilation unit.
/**
* When executed, this operation will add a package declaration to the given compilation unit.
*/
public CreatePackageDeclarationOperation(String name, ICompilationUnit parentElement) {
super(parentElement);
this.name= name;
}
@Override
protected StructuralPropertyDescriptor getChildPropertyDescriptor(ASTNode parent) {
return CompilationUnit.PACKAGE_PROPERTY;
}
@Override
protected ASTNode generateElementAST(ASTRewrite rewriter, ICompilationUnit cu) throws JavaModelException {
//look for an existing package declaration
IJavaElement[] children = getCompilationUnit().getChildren();
for (int i = 0; i < children.length; i++) {
if (children[i].getElementType() == IJavaElement.PACKAGE_DECLARATION && this.name.equals(children[i].getElementName())) {
//equivalent package declaration already exists
this.creationOccurred = false;
return null;
}
}
AST ast = this.cuAST.getAST();
PackageDeclaration pkgDeclaration = ast.newPackageDeclaration();
Name astName = ast.newName(this.name);
pkgDeclaration.setName(astName);
return pkgDeclaration;
}
Creates and returns the handle for the element this operation created.
/**
* Creates and returns the handle for the element this operation created.
*/
@Override
protected IJavaElement generateResultHandle() {
return getCompilationUnit().getPackageDeclaration(this.name);
}
See Also: - getMainTaskName.getMainTaskName()
/**
* @see CreateElementInCUOperation#getMainTaskName()
*/
@Override
public String getMainTaskName(){
return Messages.operation_createPackageProgress;
}
Sets the correct position for new package declaration:
- before the first import
- if no imports, before the first type
- if no type - first thing in the CU
-
/**
* Sets the correct position for new package declaration:<ul>
* <li> before the first import
* <li> if no imports, before the first type
* <li> if no type - first thing in the CU
* <li>
*/
@Override
protected void initializeDefaultPosition() {
try {
ICompilationUnit cu = getCompilationUnit();
IImportDeclaration[] imports = cu.getImports();
if (imports.length > 0) {
createBefore(imports[0]);
return;
}
IType[] types = cu.getTypes();
if (types.length > 0) {
createBefore(types[0]);
return;
}
} catch (JavaModelException e) {
// cu doesn't exist: ignore
}
}
Possible failures:
- NO_ELEMENTS_TO_PROCESS - no compilation unit was supplied to the operation
- INVALID_NAME - a name supplied to the operation was not a valid
package declaration name.
See Also: - IJavaModelStatus
- JavaConventions
/**
* Possible failures: <ul>
* <li>NO_ELEMENTS_TO_PROCESS - no compilation unit was supplied to the operation
* <li>INVALID_NAME - a name supplied to the operation was not a valid
* package declaration name.
* </ul>
* @see IJavaModelStatus
* @see JavaConventions
*/
@Override
public IJavaModelStatus verify() {
IJavaModelStatus status = super.verify();
if (!status.isOK()) {
return status;
}
IJavaProject project = getParentElement().getJavaProject();
if (JavaConventions.validatePackageName(this.name, project.getOption(JavaCore.COMPILER_SOURCE, true), project.getOption(JavaCore.COMPILER_COMPLIANCE, true)).getSeverity() == IStatus.ERROR) {
return new JavaModelStatus(IJavaModelStatusConstants.INVALID_NAME, this.name);
}
return JavaModelStatus.VERIFIED_OK;
}
}