diff options
Diffstat (limited to 'bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/corext/codemanipulation/AddImportsOperation.java')
-rw-r--r-- | bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/corext/codemanipulation/AddImportsOperation.java | 406 |
1 files changed, 0 insertions, 406 deletions
diff --git a/bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/corext/codemanipulation/AddImportsOperation.java b/bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/corext/codemanipulation/AddImportsOperation.java deleted file mode 100644 index 93b6f6b7..00000000 --- a/bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/corext/codemanipulation/AddImportsOperation.java +++ /dev/null @@ -1,406 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 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.eclipse.wst.jsdt.internal.corext.codemanipulation; - -import java.util.ArrayList; - -import org.eclipse.core.resources.IWorkspaceRunnable; -import org.eclipse.core.runtime.Assert; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.core.runtime.jobs.ISchedulingRule; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.text.edits.MultiTextEdit; -import org.eclipse.text.edits.ReplaceEdit; -import org.eclipse.text.edits.TextEdit; -import org.eclipse.wst.jsdt.core.Flags; -import org.eclipse.wst.jsdt.core.IBuffer; -import org.eclipse.wst.jsdt.core.IJavaScriptElement; -import org.eclipse.wst.jsdt.core.IJavaScriptUnit; -import org.eclipse.wst.jsdt.core.JavaScriptModelException; -import org.eclipse.wst.jsdt.core.Signature; -import org.eclipse.wst.jsdt.core.dom.ASTNode; -import org.eclipse.wst.jsdt.core.dom.FunctionInvocation; -import org.eclipse.wst.jsdt.core.dom.IBinding; -import org.eclipse.wst.jsdt.core.dom.IFunctionBinding; -import org.eclipse.wst.jsdt.core.dom.ITypeBinding; -import org.eclipse.wst.jsdt.core.dom.IVariableBinding; -import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit; -import org.eclipse.wst.jsdt.core.dom.Modifier; -import org.eclipse.wst.jsdt.core.dom.Name; -import org.eclipse.wst.jsdt.core.dom.QualifiedName; -import org.eclipse.wst.jsdt.core.dom.QualifiedType; -import org.eclipse.wst.jsdt.core.dom.SimpleName; -import org.eclipse.wst.jsdt.core.dom.Type; -import org.eclipse.wst.jsdt.core.dom.rewrite.ImportRewrite; -import org.eclipse.wst.jsdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; -import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchConstants; -import org.eclipse.wst.jsdt.core.search.IJavaScriptSearchScope; -import org.eclipse.wst.jsdt.core.search.SearchEngine; -import org.eclipse.wst.jsdt.core.search.SearchPattern; -import org.eclipse.wst.jsdt.core.search.TypeNameMatch; -import org.eclipse.wst.jsdt.internal.corext.dom.ASTNodes; -import org.eclipse.wst.jsdt.internal.corext.dom.NodeFinder; -import org.eclipse.wst.jsdt.internal.corext.util.JavaModelUtil; -import org.eclipse.wst.jsdt.internal.corext.util.Messages; -import org.eclipse.wst.jsdt.internal.corext.util.TypeNameMatchCollector; -import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin; -import org.eclipse.wst.jsdt.internal.ui.JavaUIStatus; -import org.eclipse.wst.jsdt.internal.ui.javaeditor.ASTProvider; -import org.eclipse.wst.jsdt.internal.ui.text.correction.ASTResolving; -import org.eclipse.wst.jsdt.internal.ui.text.correction.SimilarElementsRequestor; - -/** -* -* Provisional API: This class/interface is part of an interim API that is still under development and expected to -* change significantly before reaching stability. It is being made available at this early stage to solicit feedback -* from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken -* (repeatedly) as the API evolves. -*/ -public class AddImportsOperation implements IWorkspaceRunnable { - - public static interface IChooseImportQuery { - /** - * Selects an import from a list of choices. - * @param openChoices Array of found types - * @param containerName Name type to be imported - * @return Returns <code>null</code> to cancel the operation, or the - * selected imports. - */ - TypeNameMatch chooseImport(TypeNameMatch[] openChoices, String containerName); - } - - private IJavaScriptUnit fCompilationUnit; - private final int fSelectionOffset; - private final int fSelectionLength; - private final IChooseImportQuery fQuery; - private IStatus fStatus; - private boolean fDoSave; - - - /** - * Generate import statements for the passed java elements - * Elements must be of type IType (-> single import) or IPackageFragment - * (on-demand-import). Other JavaElements are ignored - * @param cu The compilation unit - * @param selectionOffset Start of the current text selection - * @param selectionLength End of the current text selection - * @param query Query element to be used for UI interaction or <code>null</code> to not select anything - * when multiple possibilities are available - * @param save If set, the result will be saved - */ - public AddImportsOperation(IJavaScriptUnit cu, int selectionOffset, int selectionLength, IChooseImportQuery query, boolean save) { - super(); - Assert.isNotNull(cu); - - fCompilationUnit= cu; - fSelectionOffset= selectionOffset; - fSelectionLength= selectionLength; - fQuery= query; - fStatus= Status.OK_STATUS; - fDoSave= save; - } - - /** - * @return Returns the status. - */ - public IStatus getStatus() { - return fStatus; - } - - /** - * Runs the operation. - * @param monitor The progress monitor - * @throws CoreException - * @throws OperationCanceledException Runtime error thrown when operation is canceled. - */ - public void run(IProgressMonitor monitor) throws CoreException, OperationCanceledException { - if (monitor == null) { - monitor= new NullProgressMonitor(); - } - try { - monitor.beginTask(CodeGenerationMessages.AddImportsOperation_description, 4); - - JavaScriptUnit astRoot= JavaScriptPlugin.getDefault().getASTProvider().getAST(fCompilationUnit, ASTProvider.WAIT_YES, new SubProgressMonitor(monitor, 1)); - - ImportRewrite importRewrite= StubUtility.createImportRewrite(astRoot, true); - - MultiTextEdit res= new MultiTextEdit(); - - TextEdit edit= evaluateEdits(astRoot, importRewrite, fSelectionOffset, fSelectionLength, new SubProgressMonitor(monitor, 1)); - if (edit == null) { - return; - } - res.addChild(edit); - - TextEdit importsEdit= importRewrite.rewriteImports(new SubProgressMonitor(monitor, 1)); - res.addChild(importsEdit); - - JavaModelUtil.applyEdit(fCompilationUnit, res, fDoSave, new SubProgressMonitor(monitor, 1)); - } catch (BadLocationException e) { - throw new CoreException(JavaUIStatus.createError(IStatus.ERROR, e)); - } finally { - monitor.done(); - } - } - - private TextEdit evaluateEdits(JavaScriptUnit root, ImportRewrite importRewrite, int offset, int length, IProgressMonitor monitor) throws BadLocationException, JavaScriptModelException { - SimpleName nameNode= null; - if (root != null) { // got an AST - ASTNode node= NodeFinder.perform(root, offset, length); - - if (node instanceof QualifiedName) { - nameNode= ((QualifiedName) node).getName(); - } else if (node instanceof SimpleName) { - nameNode= (SimpleName) node; - } - } - - String name, simpleName, containerName; - int qualifierStart; - int simpleNameStart; - if (nameNode != null) { - simpleName= nameNode.getIdentifier(); - simpleNameStart= nameNode.getStartPosition(); - if (nameNode.getLocationInParent() == QualifiedName.NAME_PROPERTY) { - Name qualifier= ((QualifiedName) nameNode.getParent()).getQualifier(); - containerName= qualifier.getFullyQualifiedName(); - name= JavaModelUtil.concatenateName(containerName, simpleName); - qualifierStart= qualifier.getStartPosition(); - } else if (nameNode.getParent().getLocationInParent() == QualifiedType.NAME_PROPERTY) { - Type qualifier= ((QualifiedType) nameNode.getParent().getParent()).getQualifier(); - containerName= ASTNodes.asString(qualifier); - name= JavaModelUtil.concatenateName(containerName, simpleName); - qualifierStart= qualifier.getStartPosition(); - } else if (nameNode.getLocationInParent() == FunctionInvocation.NAME_PROPERTY) { - ASTNode qualifier= ((FunctionInvocation) nameNode.getParent()).getExpression(); - if (qualifier instanceof Name) { - containerName= ASTNodes.asString(qualifier); - name= JavaModelUtil.concatenateName(containerName, simpleName); - qualifierStart= qualifier.getStartPosition(); - } else { - return null; - } - } else { - containerName= ""; //$NON-NLS-1$ - name= simpleName; - qualifierStart= simpleNameStart; - } - - IBinding binding= nameNode.resolveBinding(); - if (binding != null && !binding.isRecovered()) { - if (binding instanceof ITypeBinding) { - ITypeBinding typeBinding= (ITypeBinding) binding; - String qualifiedBindingName= typeBinding.getQualifiedName(); - if (containerName.length() > 0 && !qualifiedBindingName.equals(name)) { - return null; - } - - String res= importRewrite.addImport(typeBinding); - if (containerName.length() > 0 && !res.equals(simpleName)) { - // adding import failed - return null; - } - return new ReplaceEdit(qualifierStart, simpleNameStart - qualifierStart, new String()); - } else if (binding instanceof IVariableBinding || binding instanceof IFunctionBinding) { - boolean isField= binding instanceof IVariableBinding; - ITypeBinding declaringClass= isField ? ((IVariableBinding) binding).getDeclaringClass() : ((IFunctionBinding) binding).getDeclaringClass(); - if (declaringClass == null) { - return null; // variableBinding.getDeclaringClass() is null for array.length - } - if (Modifier.isStatic(binding.getModifiers())) { - if (Modifier.isPrivate(declaringClass.getModifiers())) { - fStatus= JavaUIStatus.createError(IStatus.ERROR, Messages.format(CodeGenerationMessages.AddImportsOperation_error_not_visible_class, declaringClass.getName()), null); - return null; - } - - if (containerName.length() > 0) { - if (containerName.equals(declaringClass.getName()) || containerName.equals(declaringClass.getQualifiedName()) ) { - String res= importRewrite.addStaticImport(declaringClass.getQualifiedName(), binding.getName(), isField); - if (!res.equals(simpleName)) { - // adding import failed - return null; - } - return new ReplaceEdit(qualifierStart, simpleNameStart - qualifierStart, ""); //$NON-NLS-1$ - } - } - } - return null; // no static imports for packages - } else { - return null; - } - } - if (binding != null && binding.getKind() != IBinding.TYPE) { - // recovered binding - return null; - } - - } else { - IBuffer buffer= fCompilationUnit.getBuffer(); - - qualifierStart= getNameStart(buffer, offset); - int nameEnd= getNameEnd(buffer, offset + length); - int len= nameEnd - qualifierStart; - name= buffer.getText(qualifierStart, len).trim(); - if (name.length() == 0) { - return null; - } - - simpleName= Signature.getSimpleName(name); - containerName= Signature.getQualifier(name); - - simpleNameStart= getSimpleNameStart(buffer, qualifierStart, containerName); - - int res= importRewrite.getDefaultImportRewriteContext().findInContext(containerName, simpleName, ImportRewriteContext.KIND_TYPE); - if (res == ImportRewriteContext.RES_NAME_CONFLICT) { - fStatus= JavaUIStatus.createError(IStatus.ERROR, CodeGenerationMessages.AddImportsOperation_error_importclash, null); - return null; - } else if (res == ImportRewriteContext.RES_NAME_FOUND) { - return new ReplaceEdit(qualifierStart, simpleNameStart - qualifierStart, ""); //$NON-NLS-1$ - } - } - IJavaScriptSearchScope searchScope= SearchEngine.createJavaSearchScope(new IJavaScriptElement[] { fCompilationUnit.getJavaScriptProject() }); - - TypeNameMatch[] types= findAllTypes(simpleName, searchScope, nameNode, new SubProgressMonitor(monitor, 1)); - if (types.length == 0) { - fStatus= JavaUIStatus.createError(IStatus.ERROR, Messages.format(CodeGenerationMessages.AddImportsOperation_error_notresolved_message, simpleName), null); - return null; - } - - if (monitor.isCanceled()) { - throw new OperationCanceledException(); - } - TypeNameMatch chosen; - if (types.length > 1 && fQuery != null) { - chosen= fQuery.chooseImport(types, containerName); - if (chosen == null) { - throw new OperationCanceledException(); - } - } else { - chosen= types[0]; - } - importRewrite.addImport(chosen.getFullyQualifiedName()); - return new ReplaceEdit(qualifierStart, simpleNameStart - qualifierStart, ""); //$NON-NLS-1$ - } - - - private int getNameStart(IBuffer buffer, int pos) throws BadLocationException { - while (pos > 0) { - char ch= buffer.getChar(pos - 1); - if (!Character.isJavaIdentifierPart(ch) && ch != '.') { - return pos; - } - pos--; - } - return pos; - } - - private int getNameEnd(IBuffer doc, int pos) throws BadLocationException { - if (pos > 0) { - if (Character.isWhitespace(doc.getChar(pos - 1))) { - return pos; - } - } - int len= doc.getLength(); - while (pos < len) { - char ch= doc.getChar(pos); - if (!Character.isJavaIdentifierPart(ch)) { - return pos; - } - pos++; - } - return pos; - } - - private int getSimpleNameStart(IBuffer buffer, int nameStart, String containerName) throws BadLocationException { - int containerLen= containerName.length(); - int docLen= buffer.getLength(); - if ((containerLen > 0) && (nameStart + containerLen + 1 < docLen)) { - for (int k= 0; k < containerLen; k++) { - if (buffer.getChar(nameStart + k) != containerName.charAt(k)) { - return nameStart; - } - } - if (buffer.getChar(nameStart + containerLen) == '.') { - return nameStart + containerLen + 1; - } - } - return nameStart; - } - - private int getSearchForConstant(int typeKinds) { - final int CLASSES= SimilarElementsRequestor.CLASSES; - - switch (typeKinds & (CLASSES)) { - case CLASSES: return IJavaScriptSearchConstants.CLASS; - default: return IJavaScriptSearchConstants.TYPE; - } - } - - - /* - * Finds a type by the simple name. - */ - private TypeNameMatch[] findAllTypes(String simpleTypeName, IJavaScriptSearchScope searchScope, SimpleName nameNode, IProgressMonitor monitor) throws JavaScriptModelException { - boolean is50OrHigher= JavaModelUtil.is50OrHigher(fCompilationUnit.getJavaScriptProject()); - - int typeKinds= SimilarElementsRequestor.ALL_TYPES; - if (nameNode != null) { - typeKinds= ASTResolving.getPossibleTypeKinds(nameNode, is50OrHigher); - } - - ArrayList typeInfos= new ArrayList(); - TypeNameMatchCollector requestor= new TypeNameMatchCollector(typeInfos); - int matchMode= SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE; - new SearchEngine().searchAllTypeNames(null, matchMode, simpleTypeName.toCharArray(), matchMode, getSearchForConstant(typeKinds), searchScope, requestor, IJavaScriptSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor); - - ArrayList typeRefsFound= new ArrayList(typeInfos.size()); - for (int i= 0, len= typeInfos.size(); i < len; i++) { - TypeNameMatch curr= (TypeNameMatch) typeInfos.get(i); - if (curr.getPackageName().length() > 0) { // do not suggest imports from the default package - if (isOfKind(curr, typeKinds, is50OrHigher) && isVisible(curr)) { - typeRefsFound.add(curr); - } - } - } - return (TypeNameMatch[]) typeRefsFound.toArray(new TypeNameMatch[typeRefsFound.size()]); - } - - private boolean isOfKind(TypeNameMatch curr, int typeKinds, boolean is50OrHigher) { - return (typeKinds & SimilarElementsRequestor.CLASSES) != 0; - } - - - private boolean isVisible(TypeNameMatch curr) { - int flags= curr.getModifiers(); - if (Flags.isPrivate(flags)) { - return false; - } - if (Flags.isPublic(flags)) { - return true; - } - return curr.getPackageName().equals(fCompilationUnit.getParent().getElementName()); - } - - - /** - * @return Returns the scheduling rule for this operation - */ - public ISchedulingRule getScheduleRule() { - return fCompilationUnit.getJavaScriptProject().getResource(); - } - -} |