Search in sources :

Example 21 with ImportDeclaration

use of org.eclipse.jdt.core.dom.ImportDeclaration in project AutoRefactor by JnRouvignac.

the class JUnitAssertCleanUp method visit.

@Override
public boolean visit(final CompilationUnit visited) {
    canUseAssertNotEquals = false;
    for (Object object : visited.imports()) {
        ImportDeclaration importDeclaration = (ImportDeclaration) object;
        ITypeBinding typeBinding = resolveTypeBinding(importDeclaration);
        if (ASTNodes.hasType(typeBinding, "org.junit.Assert")) {
            // $NON-NLS-1$
            for (IMethodBinding mb : typeBinding.getDeclaredMethods()) {
                if (mb.toString().contains("assertNotEquals")) {
                    // $NON-NLS-1$
                    canUseAssertNotEquals = true;
                    return super.visit(visited);
                }
            }
        }
    }
    // New file: reset the value
    return super.visit(visited);
}
Also used : IMethodBinding(org.eclipse.jdt.core.dom.IMethodBinding) ITypeBinding(org.eclipse.jdt.core.dom.ITypeBinding) ImportDeclaration(org.eclipse.jdt.core.dom.ImportDeclaration)

Example 22 with ImportDeclaration

use of org.eclipse.jdt.core.dom.ImportDeclaration in project AutoRefactor by JnRouvignac.

the class NewClassImportCleanUp method getAlreadyImportedClasses.

/**
 * True if an import already exists for a class.
 *
 * @param node One node in the class file
 * @return True if an import already exists for a class.
 */
public Set<String> getAlreadyImportedClasses(final ASTNode node) {
    Set<String> alreadyImportedClasses = new HashSet<>();
    CompilationUnit cu = (CompilationUnit) node.getRoot();
    Set<String> classesToUse = getClassesToImport();
    Map<String, String> importsByPackage = new HashMap<>();
    for (String klass : classesToUse) {
        importsByPackage.put(getPackageName(klass), klass);
    }
    for (Object anObject : cu.imports()) {
        ImportDeclaration anImport = (ImportDeclaration) anObject;
        if (anImport.isOnDemand()) {
            String fullName = importsByPackage.get(anImport.getName().getFullyQualifiedName());
            if (fullName != null) {
                alreadyImportedClasses.add(fullName);
            }
        } else if (classesToUse.contains(anImport.getName().getFullyQualifiedName())) {
            alreadyImportedClasses.add(anImport.getName().getFullyQualifiedName());
        }
    }
    return alreadyImportedClasses;
}
Also used : CompilationUnit(org.eclipse.jdt.core.dom.CompilationUnit) HashMap(java.util.HashMap) ImportDeclaration(org.eclipse.jdt.core.dom.ImportDeclaration) HashSet(java.util.HashSet)

Example 23 with ImportDeclaration

use of org.eclipse.jdt.core.dom.ImportDeclaration in project AutoRefactor by JnRouvignac.

the class NewClassImportCleanUp method visit.

@Override
public boolean visit(final CompilationUnit node) {
    if (!super.visit(node)) {
        return false;
    }
    Set<String> classesToUse = getClassesToImport();
    if (classesToUse.isEmpty()) {
        return true;
    }
    Map<String, String> importsByClassname = new HashMap<>();
    Map<String, String> importsByPackage = new HashMap<>();
    for (String klass : classesToUse) {
        importsByClassname.put(getSimpleName(klass), klass);
        importsByPackage.put(getPackageName(klass), klass);
    }
    Set<String> alreadyImportedClasses = new HashSet<>();
    Set<String> classesToImport = new HashSet<>(classesToUse);
    for (Object anObject : node.imports()) {
        ImportDeclaration anImport = (ImportDeclaration) anObject;
        if (!anImport.isStatic()) {
            if (anImport.isOnDemand()) {
                String fullName = importsByPackage.get(anImport.getName().getFullyQualifiedName());
                if (fullName != null) {
                    alreadyImportedClasses.add(fullName);
                }
            } else if (classesToUse.contains(anImport.getName().getFullyQualifiedName())) {
                alreadyImportedClasses.add(anImport.getName().getFullyQualifiedName());
                classesToImport.remove(anImport.getName().getFullyQualifiedName());
            } else if (importsByClassname.containsKey(getSimpleName(anImport.getName().getFullyQualifiedName()))) {
                classesToImport.remove(importsByClassname.get(getSimpleName(anImport.getName().getFullyQualifiedName())));
            }
        }
    }
    filterLocallyUsedNames(node, importsByClassname, classesToImport);
    if (alreadyImportedClasses.size() < classesToUse.size() && !classesToImport.isEmpty()) {
        CleanUpWithNewClassImport refactoringClass = getRefactoringClassInstance();
        refactoringClass.getClassesToUseWithImport().addAll(alreadyImportedClasses);
        refactoringClass.getClassesToUseWithImport().addAll(classesToImport);
        node.accept(refactoringClass);
        if (!refactoringClass.getImportsToAdd().isEmpty()) {
            ASTRewrite rewrite = cuRewrite.getASTRewrite();
            for (String importToAdd : refactoringClass.getImportsToAdd()) {
                rewrite.getImportRewrite().addImport(importToAdd);
            }
            return false;
        }
    }
    return true;
}
Also used : HashMap(java.util.HashMap) ImportDeclaration(org.eclipse.jdt.core.dom.ImportDeclaration) ASTRewrite(org.autorefactor.jdt.core.dom.ASTRewrite) HashSet(java.util.HashSet)

Example 24 with ImportDeclaration

use of org.eclipse.jdt.core.dom.ImportDeclaration in project eclipse.jdt.ls by eclipse.

the class TypeContextChecker method createStubTypeContext.

public static StubTypeContext createStubTypeContext(ICompilationUnit cu, CompilationUnit root, int focalPosition) throws CoreException {
    StringBuilder bufBefore = new StringBuilder();
    StringBuilder bufAfter = new StringBuilder();
    int introEnd = 0;
    PackageDeclaration pack = root.getPackage();
    if (pack != null) {
        introEnd = pack.getStartPosition() + pack.getLength();
    }
    List<ImportDeclaration> imports = root.imports();
    if (imports.size() > 0) {
        ImportDeclaration lastImport = imports.get(imports.size() - 1);
        introEnd = lastImport.getStartPosition() + lastImport.getLength();
    }
    bufBefore.append(cu.getBuffer().getText(0, introEnd));
    fillWithTypeStubs(bufBefore, bufAfter, focalPosition, root.types());
    bufBefore.append(' ');
    bufAfter.insert(0, ' ');
    return new StubTypeContext(cu, bufBefore.toString(), bufAfter.toString());
}
Also used : ImportDeclaration(org.eclipse.jdt.core.dom.ImportDeclaration) PackageDeclaration(org.eclipse.jdt.core.dom.PackageDeclaration)

Example 25 with ImportDeclaration

use of org.eclipse.jdt.core.dom.ImportDeclaration in project eclipse.jdt.ls by eclipse.

the class RefactorProcessor method getAddStaticImportProposals.

/**
 * Create static import proposal, which converts invocations to static import.
 *
 * @param context
 *            the invocation context
 * @param node
 *            the node to work on
 * @param proposals
 *            the receiver of proposals, may be {@code null}
 * @return {@code true} if the operation could or has been performed,
 *         {@code false otherwise}
 */
private static boolean getAddStaticImportProposals(IInvocationContext context, ASTNode node, Collection<ChangeCorrectionProposal> proposals) {
    if (!(node instanceof SimpleName)) {
        return false;
    }
    final SimpleName name = (SimpleName) node;
    final IBinding binding;
    final ITypeBinding declaringClass;
    if (name.getParent() instanceof MethodInvocation) {
        MethodInvocation mi = (MethodInvocation) name.getParent();
        Expression expression = mi.getExpression();
        if (expression == null || expression.equals(name)) {
            return false;
        }
        binding = mi.resolveMethodBinding();
        if (binding == null) {
            return false;
        }
        declaringClass = ((IMethodBinding) binding).getDeclaringClass();
    } else if (name.getParent() instanceof QualifiedName) {
        QualifiedName qn = (QualifiedName) name.getParent();
        if (name.equals(qn.getQualifier()) || qn.getParent() instanceof ImportDeclaration) {
            return false;
        }
        binding = qn.resolveBinding();
        if (!(binding instanceof IVariableBinding)) {
            return false;
        }
        declaringClass = ((IVariableBinding) binding).getDeclaringClass();
    } else {
        return false;
    }
    if (!Modifier.isStatic(binding.getModifiers())) {
        // only work with static bindings
        return false;
    }
    boolean needImport = false;
    if (!isDirectlyAccessible(name, declaringClass)) {
        if (Modifier.isPrivate(declaringClass.getModifiers())) {
            return false;
        }
        needImport = true;
    }
    if (proposals == null) {
        // return early, just testing if we could do it
        return true;
    }
    try {
        ImportRewrite importRewrite = StubUtility.createImportRewrite(context.getCompilationUnit(), true);
        ASTRewrite astRewrite = ASTRewrite.create(node.getAST());
        ASTRewrite astRewriteReplaceAllOccurrences = ASTRewrite.create(node.getAST());
        ImportRemover remover = new ImportRemover(context.getCompilationUnit().getJavaProject(), context.getASTRoot());
        ImportRemover removerAllOccurences = new ImportRemover(context.getCompilationUnit().getJavaProject(), context.getASTRoot());
        MethodInvocation mi = null;
        QualifiedName qn = null;
        if (name.getParent() instanceof MethodInvocation) {
            mi = (MethodInvocation) name.getParent();
            // convert the method invocation
            astRewrite.remove(mi.getExpression(), null);
            remover.registerRemovedNode(mi.getExpression());
            removerAllOccurences.registerRemovedNode(mi.getExpression());
            mi.typeArguments().forEach(typeObject -> {
                Type type = (Type) typeObject;
                astRewrite.remove(type, null);
                remover.registerRemovedNode(type);
                removerAllOccurences.registerRemovedNode(type);
            });
        } else if (name.getParent() instanceof QualifiedName) {
            qn = (QualifiedName) name.getParent();
            // convert the field access
            astRewrite.replace(qn, ASTNodeFactory.newName(node.getAST(), name.getFullyQualifiedName()), null);
            remover.registerRemovedNode(qn);
            removerAllOccurences.registerRemovedNode(qn);
        } else {
            return false;
        }
        MethodInvocation miFinal = mi;
        name.getRoot().accept(new ASTVisitor() {

            @Override
            public boolean visit(MethodInvocation methodInvocation) {
                Expression methodInvocationExpression = methodInvocation.getExpression();
                if (methodInvocationExpression == null) {
                    return super.visit(methodInvocation);
                }
                if (methodInvocationExpression instanceof Name) {
                    String fullyQualifiedName = ((Name) methodInvocationExpression).getFullyQualifiedName();
                    if (miFinal != null && miFinal.getExpression() instanceof Name && ((Name) miFinal.getExpression()).getFullyQualifiedName().equals(fullyQualifiedName) && miFinal.getName().getIdentifier().equals(methodInvocation.getName().getIdentifier())) {
                        methodInvocation.typeArguments().forEach(type -> {
                            astRewriteReplaceAllOccurrences.remove((Type) type, null);
                            removerAllOccurences.registerRemovedNode((Type) type);
                        });
                        astRewriteReplaceAllOccurrences.remove(methodInvocationExpression, null);
                        removerAllOccurences.registerRemovedNode(methodInvocationExpression);
                    }
                }
                return super.visit(methodInvocation);
            }
        });
        QualifiedName qnFinal = qn;
        name.getRoot().accept(new ASTVisitor() {

            @Override
            public boolean visit(QualifiedName qualifiedName) {
                if (qnFinal != null && qualifiedName.getFullyQualifiedName().equals(qnFinal.getFullyQualifiedName())) {
                    astRewriteReplaceAllOccurrences.replace(qualifiedName, ASTNodeFactory.newName(node.getAST(), name.getFullyQualifiedName()), null);
                    removerAllOccurences.registerRemovedNode(qualifiedName);
                }
                return super.visit(qualifiedName);
            }
        });
        if (needImport) {
            importRewrite.addStaticImport(binding);
        }
        ASTRewriteRemoveImportsCorrectionProposal proposal = new ASTRewriteRemoveImportsCorrectionProposal(CorrectionMessages.QuickAssistProcessor_convert_to_static_import, CodeActionKind.Refactor, context.getCompilationUnit(), astRewrite, IProposalRelevance.ADD_STATIC_IMPORT);
        proposal.setImportRewrite(importRewrite);
        proposal.setImportRemover(remover);
        proposals.add(proposal);
        ASTRewriteRemoveImportsCorrectionProposal proposalReplaceAllOccurrences = new ASTRewriteRemoveImportsCorrectionProposal(CorrectionMessages.QuickAssistProcessor_convert_to_static_import_replace_all, CodeActionKind.Refactor, context.getCompilationUnit(), astRewriteReplaceAllOccurrences, IProposalRelevance.ADD_STATIC_IMPORT);
        proposalReplaceAllOccurrences.setImportRewrite(importRewrite);
        proposalReplaceAllOccurrences.setImportRemover(removerAllOccurences);
        proposals.add(proposalReplaceAllOccurrences);
    } catch (IllegalArgumentException e) {
        // Wrong use of ASTRewrite or ImportRewrite API, see bug 541586
        JavaLanguageServerPlugin.logException("Failed to get static import proposal", e);
        return false;
    } catch (JavaModelException e) {
        return false;
    }
    return true;
}
Also used : ICompilationUnit(org.eclipse.jdt.core.ICompilationUnit) Dimension(org.eclipse.jdt.core.dom.Dimension) RefactoringAvailabilityTesterCore(org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTesterCore) Arrays(java.util.Arrays) CleanUpRequirementsCore(org.eclipse.jdt.core.manipulation.CleanUpRequirementsCore) CompilationUnit(org.eclipse.jdt.core.dom.CompilationUnit) IMethodBinding(org.eclipse.jdt.core.dom.IMethodBinding) AbstractTypeDeclaration(org.eclipse.jdt.core.dom.AbstractTypeDeclaration) StructuralPropertyDescriptor(org.eclipse.jdt.core.dom.StructuralPropertyDescriptor) CreateChangeOperation(org.eclipse.ltk.core.refactoring.CreateChangeOperation) ArrayInitializer(org.eclipse.jdt.core.dom.ArrayInitializer) CoreException(org.eclipse.core.runtime.CoreException) MultiFixMessages(org.eclipse.jdt.internal.ui.fix.MultiFixMessages) InlineConstantRefactoring(org.eclipse.jdt.internal.corext.refactoring.code.InlineConstantRefactoring) StubUtility(org.eclipse.jdt.internal.core.manipulation.StubUtility) ASTVisitor(org.eclipse.jdt.core.dom.ASTVisitor) AnonymousClassDeclaration(org.eclipse.jdt.core.dom.AnonymousClassDeclaration) InlineTempRefactoring(org.eclipse.jdt.internal.corext.refactoring.code.InlineTempRefactoring) Expression(org.eclipse.jdt.core.dom.Expression) TypeChangeCorrectionProposal(org.eclipse.jdt.ls.core.internal.corrections.proposals.TypeChangeCorrectionProposal) Map(java.util.Map) SimpleName(org.eclipse.jdt.core.dom.SimpleName) Bindings(org.eclipse.jdt.internal.corext.dom.Bindings) RefactoringCorrectionProposal(org.eclipse.jdt.ls.core.internal.corrections.proposals.RefactoringCorrectionProposal) ASTNodes(org.eclipse.jdt.internal.corext.dom.ASTNodes) ASTNode(org.eclipse.jdt.core.dom.ASTNode) IProposalRelevance(org.eclipse.jdt.ls.core.internal.corrections.proposals.IProposalRelevance) ConvertLoopFixCore(org.eclipse.jdt.internal.corext.fix.ConvertLoopFixCore) IJavaProject(org.eclipse.jdt.core.IJavaProject) ASTRewriteRemoveImportsCorrectionProposal(org.eclipse.jdt.ls.core.internal.corrections.proposals.ASTRewriteRemoveImportsCorrectionProposal) Messages(org.eclipse.jdt.internal.corext.util.Messages) ImportRewrite(org.eclipse.jdt.core.dom.rewrite.ImportRewrite) Collection(java.util.Collection) QualifiedName(org.eclipse.jdt.core.dom.QualifiedName) FixCorrectionProposal(org.eclipse.jdt.ls.core.internal.corrections.proposals.FixCorrectionProposal) IBinding(org.eclipse.jdt.core.dom.IBinding) VariableDeclaration(org.eclipse.jdt.core.dom.VariableDeclaration) JavaModelUtil(org.eclipse.jdt.internal.corext.util.JavaModelUtil) AbstractCleanUpCore(org.eclipse.jdt.internal.ui.fix.AbstractCleanUpCore) IJavaModelMarker(org.eclipse.jdt.core.IJavaModelMarker) IType(org.eclipse.jdt.core.IType) VariableDeclarationExpression(org.eclipse.jdt.core.dom.VariableDeclarationExpression) CleanUpOptionsCore(org.eclipse.jdt.core.manipulation.CleanUpOptionsCore) IProposableFix(org.eclipse.jdt.internal.corext.fix.IProposableFix) IProblemLocationCore(org.eclipse.jdt.internal.ui.text.correction.IProblemLocationCore) List(java.util.List) ASTRewrite(org.eclipse.jdt.core.dom.rewrite.ASTRewrite) EnhancedForStatement(org.eclipse.jdt.core.dom.EnhancedForStatement) CleanUpConstants(org.eclipse.jdt.internal.corext.fix.CleanUpConstants) ImportRemover(org.eclipse.jdt.internal.corext.refactoring.structure.ImportRemover) MethodDeclaration(org.eclipse.jdt.core.dom.MethodDeclaration) ICleanUpFixCore(org.eclipse.jdt.core.manipulation.ICleanUpFixCore) RefactoringCorrectionCommandProposal(org.eclipse.jdt.ls.core.internal.text.correction.RefactoringCorrectionCommandProposal) IField(org.eclipse.jdt.core.IField) LinkedProposalModelCore(org.eclipse.jdt.internal.corext.fix.LinkedProposalModelCore) JavaModelException(org.eclipse.jdt.core.JavaModelException) ConvertAnonymousToNestedRefactoring(org.eclipse.jdt.internal.corext.refactoring.code.ConvertAnonymousToNestedRefactoring) MethodReference(org.eclipse.jdt.core.dom.MethodReference) HashMap(java.util.HashMap) CheckConditionsOperation(org.eclipse.ltk.core.refactoring.CheckConditionsOperation) InlineMethodRefactoring(org.eclipse.jdt.internal.corext.refactoring.code.InlineMethodRefactoring) ArrayList(java.util.ArrayList) Type(org.eclipse.jdt.core.dom.Type) RefactorProposalUtility(org.eclipse.jdt.ls.core.internal.text.correction.RefactorProposalUtility) CodeActionParams(org.eclipse.lsp4j.CodeActionParams) ImportDeclaration(org.eclipse.jdt.core.dom.ImportDeclaration) RefactoringStatus(org.eclipse.ltk.core.refactoring.RefactoringStatus) IVariableBinding(org.eclipse.jdt.core.dom.IVariableBinding) MethodInvocation(org.eclipse.jdt.core.dom.MethodInvocation) Name(org.eclipse.jdt.core.dom.Name) LambdaExpressionsCleanUpCore(org.eclipse.jdt.internal.ui.fix.LambdaExpressionsCleanUpCore) ChangeCorrectionProposal(org.eclipse.jdt.ls.core.internal.corrections.proposals.ChangeCorrectionProposal) ASTNodeFactory(org.eclipse.jdt.internal.corext.dom.ASTNodeFactory) Modifier(org.eclipse.jdt.core.dom.Modifier) JavaCore(org.eclipse.jdt.core.JavaCore) ILocalVariable(org.eclipse.jdt.core.ILocalVariable) ForStatement(org.eclipse.jdt.core.dom.ForStatement) JavaLanguageServerPlugin(org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin) ITypeBinding(org.eclipse.jdt.core.dom.ITypeBinding) PreferenceManager(org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager) CleanUpContextCore(org.eclipse.jdt.core.manipulation.CleanUpContextCore) ActionMessages(org.eclipse.jdt.ls.core.internal.text.correction.ActionMessages) SingleVariableDeclaration(org.eclipse.jdt.core.dom.SingleVariableDeclaration) CUCorrectionProposal(org.eclipse.jdt.ls.core.internal.corrections.proposals.CUCorrectionProposal) IJavaElement(org.eclipse.jdt.core.IJavaElement) ClassInstanceCreation(org.eclipse.jdt.core.dom.ClassInstanceCreation) NullProgressMonitor(org.eclipse.core.runtime.NullProgressMonitor) ICleanUpCore(org.eclipse.jdt.internal.corext.fix.ICleanUpCore) LambdaExpression(org.eclipse.jdt.core.dom.LambdaExpression) IMethod(org.eclipse.jdt.core.IMethod) LambdaExpressionsFixCore(org.eclipse.jdt.internal.corext.fix.LambdaExpressionsFixCore) CodeActionKind(org.eclipse.lsp4j.CodeActionKind) VariableDeclarationFragment(org.eclipse.jdt.core.dom.VariableDeclarationFragment) Collections(java.util.Collections) VariableDeclarationStatement(org.eclipse.jdt.core.dom.VariableDeclarationStatement) JavaModelException(org.eclipse.jdt.core.JavaModelException) ImportRewrite(org.eclipse.jdt.core.dom.rewrite.ImportRewrite) SimpleName(org.eclipse.jdt.core.dom.SimpleName) IBinding(org.eclipse.jdt.core.dom.IBinding) QualifiedName(org.eclipse.jdt.core.dom.QualifiedName) MethodInvocation(org.eclipse.jdt.core.dom.MethodInvocation) IVariableBinding(org.eclipse.jdt.core.dom.IVariableBinding) ASTVisitor(org.eclipse.jdt.core.dom.ASTVisitor) SimpleName(org.eclipse.jdt.core.dom.SimpleName) QualifiedName(org.eclipse.jdt.core.dom.QualifiedName) Name(org.eclipse.jdt.core.dom.Name) IType(org.eclipse.jdt.core.IType) Type(org.eclipse.jdt.core.dom.Type) Expression(org.eclipse.jdt.core.dom.Expression) VariableDeclarationExpression(org.eclipse.jdt.core.dom.VariableDeclarationExpression) LambdaExpression(org.eclipse.jdt.core.dom.LambdaExpression) ITypeBinding(org.eclipse.jdt.core.dom.ITypeBinding) ImportDeclaration(org.eclipse.jdt.core.dom.ImportDeclaration) ASTRewrite(org.eclipse.jdt.core.dom.rewrite.ASTRewrite) ASTRewriteRemoveImportsCorrectionProposal(org.eclipse.jdt.ls.core.internal.corrections.proposals.ASTRewriteRemoveImportsCorrectionProposal) ImportRemover(org.eclipse.jdt.internal.corext.refactoring.structure.ImportRemover)

Aggregations

ImportDeclaration (org.eclipse.jdt.core.dom.ImportDeclaration)55 MethodDeclaration (org.eclipse.jdt.core.dom.MethodDeclaration)21 List (java.util.List)20 ArrayList (java.util.ArrayList)17 CompilationUnit (org.eclipse.jdt.core.dom.CompilationUnit)16 SingleVariableDeclaration (org.eclipse.jdt.core.dom.SingleVariableDeclaration)14 VariableDeclarationFragment (org.eclipse.jdt.core.dom.VariableDeclarationFragment)14 ASTNode (org.eclipse.jdt.core.dom.ASTNode)13 Block (org.eclipse.jdt.core.dom.Block)11 Name (org.eclipse.jdt.core.dom.Name)11 ASTVisitor (org.eclipse.jdt.core.dom.ASTVisitor)10 MethodInvocation (org.eclipse.jdt.core.dom.MethodInvocation)10 VariableDeclarationStatement (org.eclipse.jdt.core.dom.VariableDeclarationStatement)10 TIntArrayList (gnu.trove.list.array.TIntArrayList)9 HashSet (java.util.HashSet)9 PackageDeclaration (org.eclipse.jdt.core.dom.PackageDeclaration)9 ICompilationUnit (org.eclipse.jdt.core.ICompilationUnit)8 SimpleName (org.eclipse.jdt.core.dom.SimpleName)8 JavaModelException (org.eclipse.jdt.core.JavaModelException)7 QualifiedName (org.eclipse.jdt.core.dom.QualifiedName)7