/******************************************************************************* * 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.refactoring.rename; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.RefactoringStatusContext; import org.eclipse.wst.jsdt.core.IFunction; import org.eclipse.wst.jsdt.core.IType; import org.eclipse.wst.jsdt.core.ITypeHierarchy; import org.eclipse.wst.jsdt.core.JavaScriptModelException; import org.eclipse.wst.jsdt.core.dom.IFunctionBinding; import org.eclipse.wst.jsdt.core.dom.Modifier; import org.eclipse.wst.jsdt.internal.corext.Corext; import org.eclipse.wst.jsdt.internal.corext.refactoring.RefactoringCoreMessages; import org.eclipse.wst.jsdt.internal.corext.refactoring.base.JavaStatusContext; import org.eclipse.wst.jsdt.internal.corext.refactoring.base.RefactoringStatusCodes; import org.eclipse.wst.jsdt.internal.corext.refactoring.util.JavaElementUtil; import org.eclipse.wst.jsdt.internal.corext.util.JavaModelUtil; import org.eclipse.wst.jsdt.internal.corext.util.JdtFlags; import org.eclipse.wst.jsdt.internal.corext.util.Messages; import org.eclipse.wst.jsdt.internal.corext.util.MethodOverrideTester; public class MethodChecks { //no instances private MethodChecks(){ } public static boolean isVirtual(IFunction method) throws JavaScriptModelException { if (method.isConstructor()) return false; if (JdtFlags.isPrivate(method)) return false; if (JdtFlags.isStatic(method)) return false; if (method.getDeclaringType()==null) return false; return true; } public static boolean isVirtual(IFunctionBinding methodBinding){ if (methodBinding.isConstructor()) return false; if (Modifier.isPrivate(methodBinding.getModifiers())) //TODO is this enough? return false; if (Modifier.isStatic(methodBinding.getModifiers())) //TODO is this enough? return false; return true; } public static RefactoringStatus checkIfOverridesAnother(IFunction method, ITypeHierarchy hierarchy) throws JavaScriptModelException { IFunction overrides= MethodChecks.overridesAnotherMethod(method, hierarchy); if (overrides == null) return null; RefactoringStatusContext context= JavaStatusContext.create(overrides); String message= Messages.format(RefactoringCoreMessages.MethodChecks_overrides, new String[]{JavaElementUtil.createMethodSignature(overrides), JavaModelUtil.getFullyQualifiedName(overrides.getDeclaringType())}); return RefactoringStatus.createStatus(RefactoringStatus.FATAL, message, context, Corext.getPluginId(), RefactoringStatusCodes.OVERRIDES_ANOTHER_METHOD, overrides); } public static IFunction overridesAnotherMethod(IFunction method, ITypeHierarchy hierarchy) throws JavaScriptModelException { MethodOverrideTester tester= new MethodOverrideTester(method.getDeclaringType(), hierarchy); IFunction found= tester.findDeclaringMethod(method, true); boolean overrides= (found != null && !found.equals(method) && (!JdtFlags.isStatic(found)) && (!JdtFlags.isPrivate(found))); if (overrides) return found; else return null; } /** * Locates the topmost method of an override ripple and returns it. If none * is found, null is returned. * * @param method the IFunction which may be part of a ripple * @param typeHierarchy a ITypeHierarchy of the declaring type of the method. May be null * @param monitor an IProgressMonitor * @return the topmost method of the ripple, or null if none * @throws JavaScriptModelException */ public static IFunction getTopmostMethod(IFunction method, ITypeHierarchy typeHierarchy, IProgressMonitor monitor) throws JavaScriptModelException { Assert.isNotNull(method); ITypeHierarchy hierarchy= typeHierarchy; IFunction topmostMethod= null; final IType declaringType= method.getDeclaringType(); if (declaringType==null) return method; if ((hierarchy == null) || !declaringType.equals(hierarchy.getType())) hierarchy= declaringType.newTypeHierarchy(monitor); if (hierarchy == null) hierarchy= declaringType.newSupertypeHierarchy(monitor); IFunction overrides= overridesAnotherMethod(method, hierarchy); if (overrides != null && !overrides.equals(method)) topmostMethod= overrides; return topmostMethod; } /** * Finds all overridden methods of a certain method. * */ public static IFunction[] getOverriddenMethods(IFunction method, IProgressMonitor monitor) throws CoreException { Assert.isNotNull(method); return RippleMethodFinder2.getRelatedMethods(method, monitor, null); } }