/******************************************************************************* * Copyright (c) 2000, 2008 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.refactoring.structure; import org.eclipse.wst.jsdt.core.dom.FieldAccess; import org.eclipse.wst.jsdt.core.dom.FieldDeclaration; import org.eclipse.wst.jsdt.core.dom.FunctionDeclaration; import org.eclipse.wst.jsdt.core.dom.FunctionInvocation; import org.eclipse.wst.jsdt.core.dom.FunctionRef; 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.ImportDeclaration; import org.eclipse.wst.jsdt.core.dom.MemberRef; import org.eclipse.wst.jsdt.core.dom.QualifiedName; import org.eclipse.wst.jsdt.core.dom.SimpleName; import org.eclipse.wst.jsdt.core.dom.TypeDeclaration; import org.eclipse.wst.jsdt.core.dom.VariableDeclarationFragment; /** * Updates references to moved static members. * Accepts <code>JavaScriptUnit</code>s. */ /* package */ class ReferenceAnalyzer extends MoveStaticMemberAnalyzer { public ReferenceAnalyzer(CompilationUnitRewrite cuRewrite, IBinding[] members, ITypeBinding target, ITypeBinding source) { super(cuRewrite, members, source, target); } public boolean needsTargetImport() { return fNeedsImport; } //---- Moved members are handled by the MovedMemberAnalyzer -------------- public boolean visit(TypeDeclaration node) { ITypeBinding binding= node.resolveBinding(); if (binding != null) { binding= binding.getTypeDeclaration(); if (isMovedMember(binding)) return false; } return super.visit(node); } public boolean visit(VariableDeclarationFragment node) { if (isMovedMember(node.resolveBinding())) return false; return super.visit(node); } public boolean visit(FieldDeclaration node) { //see bug 42383: multiple VariableDeclarationFragments not supported: VariableDeclarationFragment singleFragment= (VariableDeclarationFragment) node.fragments().get(0); if (isMovedMember(singleFragment.resolveBinding())) return false; // don't update javadoc of moved field here return super.visit(node); } public boolean visit(FunctionDeclaration node) { if (isMovedMember(node.resolveBinding())) return false; return super.visit(node); } //---- types and fields -------------------------- public boolean visit(SimpleName node) { if (! node.isDeclaration() && isMovedMember(node.resolveBinding()) && ! isProcessed(node)) rewrite(node, fTarget); return false; } public boolean visit(QualifiedName node) { if (isMovedMember(node.resolveBinding())) { if (node.getParent() instanceof ImportDeclaration) { ITypeBinding typeBinding= node.resolveTypeBinding(); if (typeBinding != null) fCuRewrite.getImportRewrite().removeImport(typeBinding.getQualifiedName()); String imp= fCuRewrite.getImportRewrite().addImport(fTarget.getQualifiedName() + '.' + node.getName().getIdentifier()); fCuRewrite.getImportRemover().registerAddedImport(imp); } else { rewrite(node, fTarget); } return false; } else { return super.visit(node); } } public boolean visit(FieldAccess node) { if (isMovedMember(node.resolveFieldBinding())) rewrite(node, fTarget); return super.visit(node); } //---- method invocations ---------------------------------- public boolean visit(FunctionInvocation node) { IFunctionBinding binding= node.resolveMethodBinding(); if (binding != null) { binding= binding.getMethodDeclaration(); if (isMovedMember(binding)) rewrite(node, fTarget); } return super.visit(node); } //---- javadoc references ---------------------------------- public boolean visit(MemberRef node) { if (isMovedMember(node.resolveBinding())) rewrite(node, fTarget); return false; } public boolean visit(FunctionRef node) { if (isMovedMember(node.resolveBinding())) rewrite(node, fTarget); return false; } }