blob: 309bbb2eeaa182b109231196badc1bea0c8cb818 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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 org.eclipse.jdt.core.dom.FieldAccess;
import org.eclipse.jdt.core.dom.IBinding;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.IVariableBinding;
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.Modifier;
import org.eclipse.jdt.core.dom.QualifiedName;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.internal.corext.dom.Bindings;
/**
* Updates references in moved static members.
* Accepts <code>BodyDeclaration</code>s.
*/
/* package */ class MovedMemberAnalyzer extends MoveStaticMemberAnalyzer {
/*
* cases:
* - access to moved member (or to member of moved member) -> do nothing.
* - (static) access to source -> change to source, import source.
* - (static) access to target -> change to target.
* - access to other type -> do nothing (import is done in MoveStaticMembersRefactoring#getUpdatedMemberSource())
*/
// TW: Adapted references to type
// - Reference to type inside moved type:
// - if originally resolved by qualification -> no problem
// - if originally resolved by import -> must add import in target too (qualify if import ambiguous)
public MovedMemberAnalyzer(CompilationUnitRewrite cuRewrite,
IBinding[] members, ITypeBinding source, ITypeBinding target) {
super(cuRewrite, members, source, target);
}
public boolean targetNeedsSourceImport() {
return fNeedsImport;
}
//---- types and fields --------------------------
public boolean visit(SimpleName node) {
if (node.isDeclaration() || isProcessed(node))
return super.visit(node);
IBinding binding= node.resolveBinding();
if (isMovedMember(binding))
return super.visit(node);
if (isSourceAccess(binding))
rewrite(node, fSource);
return super.visit(node);
}
public boolean visit(QualifiedName node) {
IBinding binding= node.resolveBinding();
if (isSourceAccess(binding)) {
if (isMovedMember(binding)) {
rewrite(node, fTarget);
return false;
} else {
rewrite(node, fSource);
return false;
}
} else if (isTargetAccess(binding)) {
// remove qualifier:
SimpleName replace= (SimpleName)fCuRewrite.getASTRewrite().createCopyTarget(node.getName());
fCuRewrite.getASTRewrite().replace(node, replace, null);
fCuRewrite.getImportRemover().registerRemovedNode(node);
return false;
}
return super.visit(node);
}
public boolean visit(FieldAccess node) {
IBinding binding= node.resolveFieldBinding();
if (isSourceAccess(binding)) {
if (isMovedMember(binding)) {
if (node.getExpression() != null)
rewrite(node, fTarget);
} else
rewrite(node, fSource);
} else if (isTargetAccess(binding)) {
fCuRewrite.getASTRewrite().remove(node.getExpression(), null);
fCuRewrite.getImportRemover().registerRemovedNode(node.getExpression());
}
return super.visit(node);
}
//---- method invocations ----------------------------------
public boolean visit(MethodInvocation node) {
IBinding binding= node.resolveMethodBinding();
if (isSourceAccess(binding)) {
if (isMovedMember(binding)) {
if (node.getExpression() != null)
rewrite(node, fTarget);
} else
rewrite(node, fSource);
} else if (isTargetAccess(binding)) {
if (node.getExpression() != null) {
fCuRewrite.getASTRewrite().remove(node.getExpression(), null);
fCuRewrite.getImportRemover().registerRemovedNode(node.getExpression());
}
}
return super.visit(node);
}
//---- javadoc references ----------------------------------
public boolean visit(MemberRef node) {
IBinding binding= node.resolveBinding();
if (isSourceAccess(binding)) {
if (isMovedMember(binding)) {
if (node.getQualifier() != null)
rewrite(node, fTarget);
} else
rewrite(node, fSource);
} else if (isTargetAccess(binding)) {
// remove qualifier:
SimpleName replace= (SimpleName)fCuRewrite.getASTRewrite().createCopyTarget(node.getName());
fCuRewrite.getASTRewrite().replace(node, replace, null);
fCuRewrite.getImportRemover().registerRemovedNode(node);
}
return super.visit(node);
}
public boolean visit(MethodRef node) {
IBinding binding= node.resolveBinding();
if (isSourceAccess(binding)) {
if (isMovedMember(binding)) {
if (node.getQualifier() != null)
rewrite(node, fTarget);
} else
rewrite(node, fSource);
} else if (isTargetAccess(binding)) {
// remove qualifier:
SimpleName replace= (SimpleName)fCuRewrite.getASTRewrite().createCopyTarget(node.getName());
fCuRewrite.getASTRewrite().replace(node, replace, null);
fCuRewrite.getImportRemover().registerRemovedNode(node);
}
return super.visit(node);
}
//---- helper methods --------------------------------------
private boolean isSourceAccess(IBinding binding) {
if (binding instanceof IMethodBinding) {
IMethodBinding method= (IMethodBinding)binding;
return Modifier.isStatic(method.getModifiers()) && Bindings.equals(fSource, method.getDeclaringClass());
} else if (binding instanceof ITypeBinding) {
ITypeBinding type= (ITypeBinding)binding;
return Modifier.isStatic(type.getModifiers()) && Bindings.equals(fSource, type.getDeclaringClass());
} else if (binding instanceof IVariableBinding) {
IVariableBinding field= (IVariableBinding)binding;
return field.isField() && Modifier.isStatic(field.getModifiers()) && Bindings.equals(fSource, field.getDeclaringClass());
}
return false;
}
private boolean isTargetAccess(IBinding binding) {
if (binding instanceof IMethodBinding) {
IMethodBinding method= (IMethodBinding)binding;
return Modifier.isStatic(method.getModifiers()) && Bindings.equals(fTarget, method.getDeclaringClass());
} else if (binding instanceof ITypeBinding) {
ITypeBinding type= (ITypeBinding)binding;
return Modifier.isStatic(type.getModifiers()) && Bindings.equals(fTarget, type.getDeclaringClass());
} else if (binding instanceof IVariableBinding) {
IVariableBinding field= (IVariableBinding)binding;
return field.isField() && Modifier.isStatic(field.getModifiers()) && Bindings.equals(fTarget, field.getDeclaringClass());
}
return false;
}
}