All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.aspectj.org.eclipse.jdt.internal.core.CreateImportOperation Maven / Gradle / Ivy

There is a newer version: 1.9.22.1
Show newest version
/*******************************************************************************
 * Copyright (c) 2000, 2013 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.aspectj.org.eclipse.jdt.internal.core;

import java.util.Iterator;

import org.eclipse.core.runtime.IStatus;
import org.aspectj.org.eclipse.jdt.core.Flags;
import org.aspectj.org.eclipse.jdt.core.ICompilationUnit;
import org.aspectj.org.eclipse.jdt.core.IImportDeclaration;
import org.aspectj.org.eclipse.jdt.core.IJavaElement;
import org.aspectj.org.eclipse.jdt.core.IJavaModelStatus;
import org.aspectj.org.eclipse.jdt.core.IJavaModelStatusConstants;
import org.aspectj.org.eclipse.jdt.core.IJavaProject;
import org.aspectj.org.eclipse.jdt.core.IType;
import org.aspectj.org.eclipse.jdt.core.JavaConventions;
import org.aspectj.org.eclipse.jdt.core.JavaCore;
import org.aspectj.org.eclipse.jdt.core.JavaModelException;
import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
import org.aspectj.org.eclipse.jdt.core.dom.AST;
import org.aspectj.org.eclipse.jdt.core.dom.ASTNode;
import org.aspectj.org.eclipse.jdt.core.dom.CompilationUnit;
import org.aspectj.org.eclipse.jdt.core.dom.ImportDeclaration;
import org.aspectj.org.eclipse.jdt.core.dom.Name;
import org.aspectj.org.eclipse.jdt.core.dom.StructuralPropertyDescriptor;
import org.aspectj.org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.aspectj.org.eclipse.jdt.internal.core.util.Messages;

/**
 * 

This operation adds an import declaration to an existing compilation unit. * If the compilation unit already includes the specified import declaration, * the import is not generated (it does not generate duplicates). * Note that it is valid to specify both a single-type import and an on-demand import * for the same package, for example "java.io.File" and * "java.io.*", in which case both are preserved since the semantics * of this are not the same as just importing "java.io.*". * Importing "java.lang.*", or the package in which the compilation unit * is defined, are not treated as special cases. If they are specified, they are * included in the result. * *

Required Attributes:

    *
  • Compilation unit *
  • Import name - the name of the import to add to the * compilation unit. For example: "java.io.File" or "java.awt.*" *
*/ @SuppressWarnings("rawtypes") public class CreateImportOperation extends CreateElementInCUOperation { /* * The name of the import to be created. */ protected String importName; /* * The flags of the import to be created (either Flags#AccDefault or Flags#AccStatic) */ protected int flags; /** * When executed, this operation will add an import to the given compilation unit. */ public CreateImportOperation(String importName, ICompilationUnit parentElement, int flags) { super(parentElement); this.importName = importName; this.flags = flags; } protected StructuralPropertyDescriptor getChildPropertyDescriptor(ASTNode parent) { return CompilationUnit.IMPORTS_PROPERTY; } protected ASTNode generateElementAST(ASTRewrite rewriter, ICompilationUnit cu) throws JavaModelException { // ensure no duplicate Iterator imports = this.cuAST.imports().iterator(); boolean onDemand = this.importName.endsWith(".*"); //$NON-NLS-1$ String importActualName = this.importName; if (onDemand) { importActualName = this.importName.substring(0, this.importName.length() - 2); } while (imports.hasNext()) { ImportDeclaration importDeclaration = (ImportDeclaration) imports.next(); if (importActualName.equals(importDeclaration.getName().getFullyQualifiedName()) && (onDemand == importDeclaration.isOnDemand()) && (Flags.isStatic(this.flags) == importDeclaration.isStatic())) { this.creationOccurred = false; return null; } } AST ast = this.cuAST.getAST(); ImportDeclaration importDeclaration = ast.newImportDeclaration(); importDeclaration.setStatic(Flags.isStatic(this.flags)); // split import name into individual fragments, checking for on demand imports char[][] charFragments = CharOperation.splitOn('.', importActualName.toCharArray(), 0, importActualName.length()); int length = charFragments.length; String[] strFragments = new String[length]; for (int i = 0; i < length; i++) { strFragments[i] = String.valueOf(charFragments[i]); } Name name = ast.newName(strFragments); importDeclaration.setName(name); if (onDemand) importDeclaration.setOnDemand(true); return importDeclaration; } /** * @see CreateElementInCUOperation#generateResultHandle */ protected IJavaElement generateResultHandle() { return getCompilationUnit().getImport(this.importName); } /** * @see CreateElementInCUOperation#getMainTaskName() */ public String getMainTaskName(){ return Messages.operation_createImportsProgress; } /** * Sets the correct position for the new import:
    *
  • after the last import *
  • if no imports, before the first type *
  • if no type, after the package statement *
  • and if no package statement - first thing in the CU */ protected void initializeDefaultPosition() { try { ICompilationUnit cu = getCompilationUnit(); IImportDeclaration[] imports = cu.getImports(); if (imports.length > 0) { createAfter(imports[imports.length - 1]); return; } IType[] types = cu.getTypes(); if (types.length > 0) { createBefore(types[0]); return; } IJavaElement[] children = cu.getChildren(); //look for the package declaration for (int i = 0; i < children.length; i++) { if (children[i].getElementType() == IJavaElement.PACKAGE_DECLARATION) { createAfter(children[i]); return; } } } catch (JavaModelException e) { // cu doesn't exit: ignore } } /** * Possible failures:
      *
    • NO_ELEMENTS_TO_PROCESS - the compilation unit supplied to the operation is * null. *
    • INVALID_NAME - not a valid import declaration name. *
    * @see IJavaModelStatus * @see JavaConventions */ public IJavaModelStatus verify() { IJavaModelStatus status = super.verify(); if (!status.isOK()) { return status; } IJavaProject project = getParentElement().getJavaProject(); if (JavaConventions.validateImportDeclaration(this.importName, project.getOption(JavaCore.COMPILER_SOURCE, true), project.getOption(JavaCore.COMPILER_COMPLIANCE, true)).getSeverity() == IStatus.ERROR) { return new JavaModelStatus(IJavaModelStatusConstants.INVALID_NAME, this.importName); } return JavaModelStatus.VERIFIED_OK; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy