private void modifyImplicitCallsToNoArgConstructor(AbstractTypeDeclaration subclass, CompilationUnitRewrite cuRewrite) { MethodDeclaration[] constructors= getAllConstructors(subclass); if (constructors.length == 0){ addNewConstructorToSubclass(subclass, cuRewrite); } else { for (int i= 0; i < constructors.length; i++) { if (! containsImplicitCallToSuperConstructor(constructors[i])) continue; addExplicitSuperConstructorCall(constructors[i], cuRewrite); } } }
public boolean isSignatureSameAsInitial() throws JavaModelException { if (! isVisibilitySameAsInitial()) return false; if (! isMethodNameSameAsInitial()) return false; if (! isReturnTypeSameAsInitial()) return false; if (! areExceptionsSameAsInitial()) return false; if (fMethod.getNumberOfParameters() == 0 && fParameterInfos.isEmpty()) return true; if (areNamesSameAsInitial() && isOrderSameAsInitial() && areParameterTypesSameAsInitial()) return true; return false; }
private void createNameControl(Composite parent) { Composite name= new Composite(parent, SWT.NONE); name.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout layout= new GridLayout(1, false); layout.marginHeight= 0; layout.marginWidth= 0; name.setLayout(layout); Label label= new Label(name, SWT.NONE); label.setText(RefactoringMessages.ChangeSignatureInputPage_method_name); final Text text= new Text(name, SWT.BORDER); text.setText(getChangeMethodSignatureProcessor().getMethodName()); text.setLayoutData((new GridData(GridData.FILL_HORIZONTAL))); TextFieldNavigationHandler.install(text); if (getChangeMethodSignatureProcessor().canChangeNameAndReturnType()) { text.addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent e) { getChangeMethodSignatureProcessor().setNewMethodName(text.getText()); update(true); } }); } else { text.setEnabled(false); } }
/** * @return true if the new method cannot coexist with the old method since * the signatures are too much alike */ public boolean isSignatureClashWithInitial() { if (!isMethodNameSameAsInitial()) return false; // name has changed. if (fMethod.getNumberOfParameters() == 0 && fParameterInfos.isEmpty()) return true; // name is equal and both parameter lists are empty // name is equal and there are some parameters. // check if there are more or less parameters than before int no= getNotDeletedInfos().size(); if (fMethod.getNumberOfParameters() != no) return false; // name is equal and parameter count is equal. // check whether types remained the same if (isOrderSameAsInitial()) return areParameterTypesSameAsInitial(); else return false; // could be more specific here }
pm.beginTask(RefactoringCoreMessages.ChangeSignatureRefactoring_checking_preconditions, 8); RefactoringStatus result= new RefactoringStatus(); clearManagers(); fBaseCuRewrite.clearASTAndImportRewrites(); fBaseCuRewrite.getASTRewrite().setTargetSourceRangeComputer(new TightSourceRangeComputer()); if (isSignatureSameAsInitial()) return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.ChangeSignatureRefactoring_unchanged); result.merge(checkSignature(true)); if (result.hasFatalError()) return result; if (fDelegateUpdating && isSignatureClashWithInitial()) result.merge(RefactoringStatus.createErrorStatus(RefactoringCoreMessages.ChangeSignatureRefactoring_old_and_new_signatures_not_sufficiently_different )); String binaryRefsDescription= Messages.format(RefactoringCoreMessages.ReferencesInBinaryContext_ref_in_binaries_description , BasicElementLabels.getJavaElementName(getMethodName())); ReferencesInBinaryContext binaryRefs= new ReferencesInBinaryContext(binaryRefsDescription); result.merge(checkVarargs()); if (result.hasFatalError()) return result; fOccurrences= findOccurrences(new SubProgressMonitor(pm, 1), binaryRefs, result); binaryRefs.addErrorIfNecessary(result); result.merge(checkVisibilityChanges()); result.merge(checkTypeVariables()); if (! isOrderSameAsInitial())
fChangeSignatureProcessor= new ChangeSignatureProcessor(fArguments, result); if (!result.hasFatalError()) { fChangeSignatureRefactoring= new ProcessorBasedRefactoring(fChangeSignatureProcessor); fChangeSignatureRefactoring.setValidationContext(getValidationContext()); result.merge(fChangeSignatureProcessor.checkInitialConditions(new SubProgressMonitor(pm, 2))); if (result.hasFatalError()) return result; fChangeSignatureProcessor= RefactoringAvailabilityTester.isChangeSignatureAvailable(fMethod) ? new ChangeSignatureProcessor(fMethod) : null; if (fChangeSignatureProcessor == null) return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.IntroduceParameterRefactoring_expression_in_method); fChangeSignatureRefactoring= new ProcessorBasedRefactoring(fChangeSignatureProcessor); fChangeSignatureRefactoring.setValidationContext(getValidationContext()); result.merge(fChangeSignatureProcessor.checkInitialConditions(new SubProgressMonitor(pm, 1))); if (result.hasFatalError()) { RefactoringStatusEntry entry= result.getEntryMatchingSeverity(RefactoringStatus.FATAL); fChangeSignatureProcessor= RefactoringAvailabilityTester.isChangeSignatureAvailable(method) ? new ChangeSignatureProcessor(method) : null; if (fChangeSignatureProcessor == null) { String msg= Messages.format(RefactoringCoreMessages.IntroduceParameterRefactoring_cannot_introduce, entry.getMessage()); result= fChangeSignatureProcessor.checkInitialConditions(new SubProgressMonitor(pm, 1)); if (result.hasFatalError()) return result; CompilationUnitRewrite cuRewrite= fChangeSignatureProcessor.getBaseCuRewrite(); if (! cuRewrite.getCu().equals(fSourceCU)) cuRewrite= new CompilationUnitRewrite(fSourceCU); // TODO: should try to avoid throwing away this AST
private void createReturnTypeControl(Composite parent) { Composite returnType= new Composite(parent, SWT.NONE); returnType.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout layout= new GridLayout(1, false); layout.marginHeight= 0; layout.marginWidth= 0; returnType.setLayout(layout); Label label= new Label(returnType, SWT.NONE); label.setText(RefactoringMessages.ChangeSignatureInputPage_return_type); final Text text= new Text(returnType, SWT.BORDER); text.setText(getChangeMethodSignatureProcessor().getReturnTypeString()); text.setLayoutData((new GridData(GridData.FILL_HORIZONTAL))); TextFieldNavigationHandler.install(text); if (getChangeMethodSignatureProcessor().canChangeNameAndReturnType()) { text.addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent e) { getChangeMethodSignatureProcessor().setNewReturnTypeName(text.getText()); update(true); } }); } else { text.setEnabled(false); } JavaTypeCompletionProcessor processor= new JavaTypeCompletionProcessor(true, true); StubTypeContext stubTypeContext= getChangeMethodSignatureProcessor().getStubTypeContext(); processor.setCompletionContext(stubTypeContext.getCuHandle(), stubTypeContext.getBeforeString(), stubTypeContext.getAfterString()); ControlContentAssistHelper.createTextContentAssistant(text, processor); }
private void checkMethodName(RefactoringStatus result) { if (isMethodNameSameAsInitial() || ! canChangeNameAndReturnType()) return; if ("".equals(fMethodName.trim())) { //$NON-NLS-1$ String msg= RefactoringCoreMessages.ChangeSignatureRefactoring_method_name_not_empty; result.addFatalError(msg); return; } if (fMethodName.equals(fMethod.getDeclaringType().getElementName())) { String msg= RefactoringCoreMessages.ChangeSignatureRefactoring_constructor_name; result.addWarning(msg); } result.merge(Checks.checkMethodName(fMethodName, fMethod)); }
private void addNewConstructorToSubclass(AbstractTypeDeclaration subclass, CompilationUnitRewrite cuRewrite) { AST ast= subclass.getAST(); MethodDeclaration newConstructor= ast.newMethodDeclaration(); newConstructor.setName(ast.newSimpleName(subclass.getName().getIdentifier())); newConstructor.setConstructor(true); newConstructor.setJavadoc(null); newConstructor.modifiers().addAll(ASTNodeFactory.newModifiers(ast, getAccessModifier(subclass))); newConstructor.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID)); Block body= ast.newBlock(); newConstructor.setBody(body); SuperConstructorInvocation superCall= ast.newSuperConstructorInvocation(); addArgumentsToNewSuperConstructorCall(superCall, cuRewrite); body.statements().add(superCall); String msg= RefactoringCoreMessages.ChangeSignatureRefactoring_add_constructor; TextEditGroup description= cuRewrite.createGroupDescription(msg); cuRewrite.getASTRewrite().getListRewrite(subclass, subclass.getBodyDeclarationsProperty()).insertFirst(newConstructor, description); // TODO use AbstractTypeDeclaration }
return; try { ChangeSignatureProcessor processor= new ChangeSignatureProcessor(method); RefactoringStatus status= processor.checkInitialConditions(new NullProgressMonitor()); if (status.hasFatalError()) { final RefactoringStatusEntry entry= status.getEntryMatchingSeverity(RefactoringStatus.FATAL);
@Override public void updateNode() throws CoreException { if (canChangeNameAndReturnType()) changeMethodName(); }
@Override public Refactoring createRefactoring(JavaRefactoringDescriptor descriptor, RefactoringStatus status) throws CoreException { JavaRefactoringArguments arguments= new JavaRefactoringArguments(descriptor.getProject(), retrieveArgumentMap(descriptor)); ChangeSignatureProcessor processor= new ChangeSignatureProcessor(arguments, status); return new ProcessorBasedRefactoring(processor); }
@Override public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException, OperationCanceledException { RefactoringStatus status= new RefactoringStatus(); IMethod method= getMethod(); // TODO: Check for availability status.merge(Checks.checkTypeName(fParameterObjectFactory.getClassName(), method)); status.merge(Checks.checkIdentifier(getParameterName(), method)); if (status.hasFatalError()) return status; status.merge(super.checkFinalConditions(pm, context)); return status; }
private void addExplicitSuperConstructorCall(MethodDeclaration constructor, CompilationUnitRewrite cuRewrite) { SuperConstructorInvocation superCall= constructor.getAST().newSuperConstructorInvocation(); addArgumentsToNewSuperConstructorCall(superCall, cuRewrite); String msg= RefactoringCoreMessages.ChangeSignatureRefactoring_add_super_call; TextEditGroup description= cuRewrite.createGroupDescription(msg); cuRewrite.getASTRewrite().getListRewrite(constructor.getBody(), Block.STATEMENTS_PROPERTY).insertFirst(superCall, description); }
pm.beginTask(RefactoringCoreMessages.ChangeSignatureRefactoring_checking_preconditions, 8); RefactoringStatus result= new RefactoringStatus(); clearManagers(); fBaseCuRewrite.clearASTAndImportRewrites(); fBaseCuRewrite.getASTRewrite().setTargetSourceRangeComputer(new TightSourceRangeComputer()); if (isSignatureSameAsInitial()) return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.ChangeSignatureRefactoring_unchanged); result.merge(checkSignature(true)); if (result.hasFatalError()) return result; if (fDelegateUpdating && isSignatureClashWithInitial()) result.merge(RefactoringStatus.createErrorStatus(RefactoringCoreMessages.ChangeSignatureRefactoring_old_and_new_signatures_not_sufficiently_different )); String binaryRefsDescription= Messages.format(RefactoringCoreMessages.ReferencesInBinaryContext_ref_in_binaries_description , BasicElementLabels.getJavaElementName(getMethodName())); ReferencesInBinaryContext binaryRefs= new ReferencesInBinaryContext(binaryRefsDescription); result.merge(checkVarargs()); if (result.hasFatalError()) return result; fOccurrences= findOccurrences(new SubProgressMonitor(pm, 1), binaryRefs, result); binaryRefs.addErrorIfNecessary(result); result.merge(checkVisibilityChanges()); result.merge(checkTypeVariables()); if (! isOrderSameAsInitial())
/** * @return true if the new method cannot coexist with the old method since * the signatures are too much alike */ public boolean isSignatureClashWithInitial() { if (!isMethodNameSameAsInitial()) return false; // name has changed. if (fMethod.getNumberOfParameters() == 0 && fParameterInfos.isEmpty()) return true; // name is equal and both parameter lists are empty // name is equal and there are some parameters. // check if there are more or less parameters than before int no= getNotDeletedInfos().size(); if (fMethod.getNumberOfParameters() != no) return false; // name is equal and parameter count is equal. // check whether types remained the same if (isOrderSameAsInitial()) return areParameterTypesSameAsInitial(); else return false; // could be more specific here }
fChangeSignatureProcessor= new ChangeSignatureProcessor(fArguments, result); if (!result.hasFatalError()) { fChangeSignatureRefactoring= new ProcessorBasedRefactoring(fChangeSignatureProcessor); fChangeSignatureRefactoring.setValidationContext(getValidationContext()); result.merge(fChangeSignatureProcessor.checkInitialConditions(new SubProgressMonitor(pm, 2))); if (result.hasFatalError()) return result; fChangeSignatureProcessor= RefactoringAvailabilityTester.isChangeSignatureAvailable(fMethod) ? new ChangeSignatureProcessor(fMethod) : null; if (fChangeSignatureProcessor == null) return RefactoringStatus.createFatalErrorStatus(RefactoringCoreMessages.IntroduceParameterRefactoring_expression_in_method); fChangeSignatureRefactoring= new ProcessorBasedRefactoring(fChangeSignatureProcessor); fChangeSignatureRefactoring.setValidationContext(getValidationContext()); result.merge(fChangeSignatureProcessor.checkInitialConditions(new SubProgressMonitor(pm, 1))); if (result.hasFatalError()) { RefactoringStatusEntry entry= result.getEntryMatchingSeverity(RefactoringStatus.FATAL); fChangeSignatureProcessor= RefactoringAvailabilityTester.isChangeSignatureAvailable(method) ? new ChangeSignatureProcessor(method) : null; if (fChangeSignatureProcessor == null) { String msg= Messages.format(RefactoringCoreMessages.IntroduceParameterRefactoring_cannot_introduce, entry.getMessage()); result= fChangeSignatureProcessor.checkInitialConditions(new SubProgressMonitor(pm, 1)); if (result.hasFatalError()) return result; CompilationUnitRewrite cuRewrite= fChangeSignatureProcessor.getBaseCuRewrite(); if (! cuRewrite.getCu().equals(fSourceCU)) cuRewrite= new CompilationUnitRewrite(fSourceCU); // TODO: should try to avoid throwing away this AST
private void createReturnTypeControl(Composite parent) { Composite returnType= new Composite(parent, SWT.NONE); returnType.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout layout= new GridLayout(1, false); layout.marginHeight= 0; layout.marginWidth= 0; returnType.setLayout(layout); Label label= new Label(returnType, SWT.NONE); label.setText(RefactoringMessages.ChangeSignatureInputPage_return_type); final Text text= new Text(returnType, SWT.BORDER); text.setText(getChangeMethodSignatureProcessor().getReturnTypeString()); text.setLayoutData((new GridData(GridData.FILL_HORIZONTAL))); TextFieldNavigationHandler.install(text); if (getChangeMethodSignatureProcessor().canChangeNameAndReturnType()) { text.addModifyListener(new ModifyListener(){ @Override public void modifyText(ModifyEvent e) { getChangeMethodSignatureProcessor().setNewReturnTypeName(text.getText()); update(true); } }); } else { text.setEnabled(false); } JavaTypeCompletionProcessor processor= new JavaTypeCompletionProcessor(true, true); StubTypeContext stubTypeContext= getChangeMethodSignatureProcessor().getStubTypeContext(); processor.setCompletionContext(stubTypeContext.getCuHandle(), stubTypeContext.getBeforeString(), stubTypeContext.getAfterString()); ControlContentAssistHelper.createTextContentAssistant(text, processor); }
private void checkMethodName(RefactoringStatus result) { if (isMethodNameSameAsInitial() || ! canChangeNameAndReturnType()) return; if ("".equals(fMethodName.trim())) { //$NON-NLS-1$ String msg= RefactoringCoreMessages.ChangeSignatureRefactoring_method_name_not_empty; result.addFatalError(msg); return; } if (fMethodName.equals(fMethod.getDeclaringType().getElementName())) { String msg= RefactoringCoreMessages.ChangeSignatureRefactoring_constructor_name; result.addWarning(msg); } result.merge(Checks.checkMethodName(fMethodName, fMethod)); }
private void addNewConstructorToSubclass(AbstractTypeDeclaration subclass, CompilationUnitRewrite cuRewrite) { AST ast= subclass.getAST(); MethodDeclaration newConstructor= ast.newMethodDeclaration(); newConstructor.setName(ast.newSimpleName(subclass.getName().getIdentifier())); newConstructor.setConstructor(true); newConstructor.setJavadoc(null); newConstructor.modifiers().addAll(ASTNodeFactory.newModifiers(ast, getAccessModifier(subclass))); newConstructor.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID)); Block body= ast.newBlock(); newConstructor.setBody(body); SuperConstructorInvocation superCall= ast.newSuperConstructorInvocation(); addArgumentsToNewSuperConstructorCall(superCall, cuRewrite); body.statements().add(superCall); String msg= RefactoringCoreMessages.ChangeSignatureRefactoring_add_constructor; TextEditGroup description= cuRewrite.createGroupDescription(msg); cuRewrite.getASTRewrite().getListRewrite(subclass, subclass.getBodyDeclarationsProperty()).insertFirst(newConstructor, description); // TODO use AbstractTypeDeclaration }