blob: f0e8e69beb4f43099ae8655abd3662cce2002252 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.jdt.internal.corext.refactoring.structure;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.FieldAccess;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.IPackageBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MemberRef;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.MethodRef;
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.QualifiedName;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.internal.corext.dom.ASTFlattener;
import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory;
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
import org.eclipse.jdt.internal.corext.dom.Bindings;
import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages;
import org.eclipse.jdt.internal.corext.refactoring.base.JavaStatusContext;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
/* package */ class MoveStaticMemberAnalyzer extends ASTVisitor {
protected RefactoringStatus fStatus;
protected ITypeBinding fSource;
protected ITypeBinding fTarget;
protected CompilationUnitRewrite fCuRewrite;
protected IBinding[] fMembers;
protected boolean fNeedsImport;
protected Set fProcessed;
protected static final String REFERENCE_UPDATE= RefactoringCoreMessages.MoveMembersRefactoring_referenceUpdate;
public MoveStaticMemberAnalyzer(CompilationUnitRewrite cuRewrite, IBinding[] members, ITypeBinding source, ITypeBinding target) {
super(true);
fStatus= new RefactoringStatus();
fCuRewrite= cuRewrite;
fMembers= members;
fSource= source;
fTarget= target;
fProcessed= new HashSet();
}
public RefactoringStatus getStatus() {
return fStatus;
}
protected boolean isProcessed(ASTNode node) {
return fProcessed.contains(node);
}
protected void rewrite(SimpleName node, ITypeBinding type) {
AST ast= node.getAST();
Type result= fCuRewrite.getImportRewrite().addImport(type, fCuRewrite.getAST());
fCuRewrite.getImportRemover().registerAddedImport(type.getQualifiedName());
Name dummy= ASTNodeFactory.newName(fCuRewrite.getAST(), ASTFlattener.asString(result));
QualifiedName name= ast.newQualifiedName(dummy, ast.newSimpleName(node.getIdentifier()));
fCuRewrite.getASTRewrite().replace(node, name, fCuRewrite.createGroupDescription(REFERENCE_UPDATE));
fCuRewrite.getImportRemover().registerRemovedNode(node);
fProcessed.add(node);
fNeedsImport= true;
}
protected void rewrite(QualifiedName node, ITypeBinding type) {
rewriteName(node.getQualifier(), type);
fProcessed.add(node.getName());
}
protected void rewrite(FieldAccess node, ITypeBinding type) {
Expression exp= node.getExpression();
if (exp == null) {
Type result= fCuRewrite.getImportRewrite().addImport(type, fCuRewrite.getAST());
fCuRewrite.getImportRemover().registerAddedImport(type.getQualifiedName());
exp= ASTNodeFactory.newName(fCuRewrite.getAST(), ASTFlattener.asString(result));
fCuRewrite.getASTRewrite().set(node, FieldAccess.EXPRESSION_PROPERTY, exp, fCuRewrite.createGroupDescription(REFERENCE_UPDATE));
fNeedsImport= true;
} else if (exp instanceof Name) {
rewriteName((Name)exp, type);
} else {
rewriteExpression(node, exp, type);
}
fProcessed.add(node.getName());
}
protected void rewrite(MethodInvocation node, ITypeBinding type) {
Expression exp= node.getExpression();
if (exp == null) {
Type result= fCuRewrite.getImportRewrite().addImport(type, fCuRewrite.getAST());
fCuRewrite.getImportRemover().registerAddedImport(type.getQualifiedName());
exp= ASTNodeFactory.newName(fCuRewrite.getAST(), ASTFlattener.asString(result));
fCuRewrite.getASTRewrite().set(node, MethodInvocation.EXPRESSION_PROPERTY, exp, fCuRewrite.createGroupDescription(REFERENCE_UPDATE));
fNeedsImport= true;
} else if (exp instanceof Name) {
rewriteName((Name)exp, type);
} else {
rewriteExpression(node, exp, type);
}
fProcessed.add(node.getName());
}
protected void rewrite(MemberRef node, ITypeBinding type) {
Name qualifier= node.getQualifier();
if (qualifier == null) {
Type result= fCuRewrite.getImportRewrite().addImport(type, fCuRewrite.getAST());
fCuRewrite.getImportRemover().registerAddedImport(type.getQualifiedName());
qualifier= ASTNodeFactory.newName(fCuRewrite.getAST(), ASTFlattener.asString(result));
fCuRewrite.getASTRewrite().set(node, MemberRef.QUALIFIER_PROPERTY, qualifier, fCuRewrite.createGroupDescription(REFERENCE_UPDATE));
fNeedsImport= true;
} else {
rewriteName(qualifier, type);
}
fProcessed.add(node.getName());
}
protected void rewrite(MethodRef node, ITypeBinding type) {
Name qualifier= node.getQualifier();
if (qualifier == null) {
Type result= fCuRewrite.getImportRewrite().addImport(type, fCuRewrite.getAST());
fCuRewrite.getImportRemover().registerAddedImport(type.getQualifiedName());
qualifier= ASTNodeFactory.newName(fCuRewrite.getAST(), ASTFlattener.asString(result));
fCuRewrite.getASTRewrite().set(node, MethodRef.QUALIFIER_PROPERTY, qualifier, fCuRewrite.createGroupDescription(REFERENCE_UPDATE));
fNeedsImport= true;
} else {
rewriteName(qualifier, type);
}
fProcessed.add(node.getName());
}
private void rewriteName(Name name, ITypeBinding type) {
AST creator= name.getAST();
boolean fullyQualified= false;
if (name instanceof QualifiedName) {
SimpleName left= ASTNodes.getLeftMostSimpleName(name);
if (left.resolveBinding() instanceof IPackageBinding)
fullyQualified= true;
}
if (fullyQualified) {
fCuRewrite.getASTRewrite().replace(
name,
ASTNodeFactory.newName(creator, type.getQualifiedName()),
fCuRewrite.createGroupDescription(REFERENCE_UPDATE));
fCuRewrite.getImportRemover().registerRemovedNode(name);
} else {
Type result= fCuRewrite.getImportRewrite().addImport(type, fCuRewrite.getAST());
fCuRewrite.getImportRemover().registerAddedImport(type.getQualifiedName());
Name n= ASTNodeFactory.newName(fCuRewrite.getAST(), ASTFlattener.asString(result));
fCuRewrite.getASTRewrite().replace(
name,
n,
fCuRewrite.createGroupDescription(REFERENCE_UPDATE));
fCuRewrite.getImportRemover().registerRemovedNode(name);
fNeedsImport= true;
}
}
private void rewriteExpression(ASTNode node, Expression exp, ITypeBinding type) {
fCuRewrite.getASTRewrite().replace(exp, fCuRewrite.getImportRewrite().addImport(type, fCuRewrite.getAST()), fCuRewrite.createGroupDescription(REFERENCE_UPDATE));
fCuRewrite.getImportRemover().registerAddedImport(type.getQualifiedName());
fCuRewrite.getImportRemover().registerRemovedNode(exp);
fNeedsImport= true;
nonStaticAccess(node);
}
protected void nonStaticAccess(ASTNode node) {
fStatus.addWarning(RefactoringCoreMessages.MoveStaticMemberAnalyzer_nonStatic,
JavaStatusContext.create(fCuRewrite.getCu(), node));
}
protected boolean isStaticAccess(Expression exp, ITypeBinding type) {
if (!(exp instanceof Name))
return false;
return Bindings.equals(type, ((Name)exp).resolveBinding());
}
protected boolean isMovedMember(IBinding binding) {
if (binding == null)
return false;
for (int i= 0; i < fMembers.length; i++) {
if (Bindings.equals(fMembers[i], binding))
return true;
}
return false;
}
}