| /******************************************************************************* |
| * Copyright (c) 2005, 2013 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.debug.tests.refactoring; |
| |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.debug.core.model.IBreakpoint; |
| import org.eclipse.jdt.core.ICompilationUnit; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.IMethod; |
| import org.eclipse.jdt.core.IType; |
| import org.eclipse.jdt.core.Signature; |
| import org.eclipse.jdt.core.dom.Modifier; |
| import org.eclipse.jdt.debug.core.IJavaMethodBreakpoint; |
| import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureProcessor; |
| import org.eclipse.ltk.core.refactoring.Refactoring; |
| import org.eclipse.ltk.core.refactoring.RefactoringStatus; |
| import org.eclipse.ltk.core.refactoring.participants.ProcessorBasedRefactoring; |
| |
| public class ChangeMethodSignatureUnitTests extends AbstractRefactoringDebugTest { |
| |
| public ChangeMethodSignatureUnitTests(String name) { |
| super(name); |
| } |
| |
| public void testPublicTypeMethodChange() throws Exception { |
| try { |
| String src = "src", |
| pack = "a.b.c", |
| cunit = "Movee.java", |
| type = "Movee", |
| methodName = "testMethod1", |
| methodSig = "()V"; |
| //create breakpoint to test |
| createMethodBreakpoint(pack+"."+type, methodName, methodSig, true, false); |
| //refactor |
| Refactoring ref = setupRefactor(src, pack, cunit, type, methodName, methodSig); |
| performRefactor(ref); |
| //test breakpoints |
| IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints(); |
| assertEquals("wrong number of breakpoints", 1, breakpoints.length); |
| IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoints[0]; |
| assertTrue("Breakpoint Marker has ceased existing",methodBreakpoint.getMarker().exists()); |
| assertEquals("wrong method Signature", "(QObject;)V", methodBreakpoint.getMethodSignature()); |
| assertEquals("wrong type name", pack+"."+type, methodBreakpoint.getTypeName()); |
| assertEquals("breakpoint attached to wrong method","changedMethod",methodBreakpoint.getMethodName()); |
| } catch (Exception e) { |
| throw e; |
| } finally { |
| removeAllBreakpoints(); |
| } |
| }//end testBreakPoint |
| |
| public void testInnerTypeMethodChange() throws Exception { |
| try { |
| String src = "src", |
| pack = "a.b.c", |
| cunit = "Movee.java", |
| type = "Movee$InnerType", |
| methodName = "innerTypeMethod", |
| methodSig = "()V"; |
| //create breakpoint to test |
| createMethodBreakpoint(pack+"."+type, methodName, methodSig, true, false); |
| //refactor |
| Refactoring ref = setupRefactor(src, pack, cunit, type, methodName, methodSig); |
| performRefactor(ref); |
| //test breakpoints |
| IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints(); |
| assertEquals("wrong number of breakpoints", 1, breakpoints.length); |
| IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoints[0]; |
| assertTrue("Breakpoint Marker has ceased existing",methodBreakpoint.getMarker().exists()); |
| assertEquals("wrong method Signature", "(QObject;)V", methodBreakpoint.getMethodSignature()); |
| assertEquals("wrong type name", pack+"."+type, methodBreakpoint.getTypeName()); |
| assertEquals("breakpoint attached to wrong method","changedMethod",methodBreakpoint.getMethodName()); |
| } catch (Exception e) { |
| throw e; |
| } finally { |
| removeAllBreakpoints(); |
| } |
| }//end testBreakPoint |
| |
| public void testNonPublicTypeMethodChange() throws Exception { |
| try { |
| String src = "src", |
| pack = "a.b.c", |
| cunit = "Movee.java", |
| type = "NonPublicType", |
| methodName = "nonPublicMethod", |
| methodSig = "()V"; |
| //create breakpoint to test |
| createMethodBreakpoint(pack,cunit,type,methodName,methodSig,true, false); |
| |
| //refactor |
| Refactoring ref = setupRefactor(src, pack, cunit, type, methodName, methodSig); |
| performRefactor(ref); |
| //test breakpoints |
| IBreakpoint[] breakpoints = getBreakpointManager().getBreakpoints(); |
| assertEquals("wrong number of breakpoints", 1, breakpoints.length); |
| IJavaMethodBreakpoint methodBreakpoint = (IJavaMethodBreakpoint) breakpoints[0]; |
| assertTrue("Breakpoint Marker has ceased existing",methodBreakpoint.getMarker().exists()); |
| assertEquals("wrong method Signature", "(QObject;)V", methodBreakpoint.getMethodSignature()); |
| assertEquals("wrong type name", pack+"."+type, methodBreakpoint.getTypeName()); |
| assertEquals("breakpoint attached to wrong method","changedMethod",methodBreakpoint.getMethodName()); |
| } catch (Exception e) { |
| throw e; |
| } finally { |
| removeAllBreakpoints(); |
| } |
| }//end testBreakPoint |
| |
| |
| ////////////////////////////////////////////////////////////////////////////////////// |
| private Refactoring setupRefactor(String root, String targetPackageName, String cuName, String typeName, String methodName, String methodSig) throws Exception { |
| |
| IJavaProject javaProject = get14Project(); |
| ICompilationUnit cunit = getCompilationUnit(javaProject, root, targetPackageName, cuName); |
| IType type = getLowestType(cunit, typeName); |
| |
| IMethod method = type.getMethod(methodName, Signature.getParameterTypes(methodSig)); |
| |
| ChangeSignatureProcessor processor = new ChangeSignatureProcessor(method); |
| ProcessorBasedRefactoring ref= new ProcessorBasedRefactoring(processor); |
| |
| //configure the processor a little more here! |
| processor.setNewMethodName("changedMethod"); |
| processor.setNewReturnTypeName("Object"); |
| processor.setVisibility(Modifier.PRIVATE); |
| |
| RefactoringStatus preconditionResult= ref.checkInitialConditions(new NullProgressMonitor()); |
| if(!preconditionResult.isOK()) |
| { |
| System.out.println(preconditionResult.getMessageMatchingSeverity(preconditionResult.getSeverity())); |
| return null; |
| } |
| return ref; |
| } |
| |
| /** |
| * |
| * @param cu the CompilationUnit containing the toplevel Type |
| * @param input - the type, possibly including inner type, |
| * separated by $. |
| * eg: EnclosingType$InnerType |
| * @return the Lowest level inner type specified in input |
| */ |
| protected IType getLowestType(ICompilationUnit cu, String input) |
| { |
| for(int i=0;i<input.length();i++) |
| { |
| if(input.charAt(i)=='$') |
| {//Enclosing$Inner$MoreInner |
| String inner = input.substring(i+1); |
| IType enclosingType = cu.getType(input.substring(0, i)); |
| return getInnermostType(enclosingType,inner); |
| } |
| } |
| //has no inner type |
| return cu.getType(input); |
| |
| } |
| |
| /** |
| * Helper method for getLowestType (ICompilationUnit cu, String input) |
| * @param enclosing name of enclosing Type |
| * @param name the typename, possibly including inner type, |
| * separated by $. |
| * eg: EnclosingType$InnerType |
| * @return |
| */ |
| private IType getInnermostType(IType enclosing, String name) { |
| for(int i=0;i<name.length();i++) |
| { |
| if(name.charAt(i)=='$') |
| {//Enclosing$Inner$MoreInner |
| enclosing.getType(name.substring(0, i)); |
| return getInnermostType(enclosing,name.substring(i+1)); |
| } |
| } |
| //has no inner type |
| return enclosing.getType(name); |
| |
| } |
| } |