private ParameterObjectFactory initializeFactory() { ParameterObjectFactory pof= new ParameterObjectFactory(); pof.setClassName(fDescriptor.getClassName()); pof.setPackage(fDescriptor.getPackage()); pof.setEnclosingType(fDescriptor.getType().getFullyQualifiedName('.')); pof.setCreateGetter(fDescriptor.isCreateGetterSetter()); pof.setCreateSetter(fDescriptor.isCreateGetterSetter()); List<ParameterInfo> variables= new ArrayList<>(); for (Iterator<FieldInfo> iterator= fVariables.values().iterator(); iterator.hasNext();) { FieldInfo info= iterator.next(); boolean createField= isCreateField(info); info.pi.setCreateField(createField); if (createField) { Field field= getField(info.name); info.pi.setNewName(field.getNewFieldName()); } variables.add(info.pi); } pof.setVariables(variables); return pof; }
public TypeDeclaration createClassDeclaration(ICompilationUnit unit, String declaringType, CompilationUnitRewrite cuRewrite) throws CoreException { AST ast= cuRewrite.getAST(); TypeDeclaration typeDeclaration= ast.newTypeDeclaration(); typeDeclaration.setName(ast.newSimpleName(fClassName)); List body= typeDeclaration.bodyDeclarations(); for (Iterator iter= fVariables.iterator(); iter.hasNext();) { ParameterInfo pi= (ParameterInfo) iter.next(); if (isValidField(pi)) { FieldDeclaration declaration= createField(pi, unit, cuRewrite); body.add(declaration); } } MethodDeclaration constructor= createConstructor(unit, declaringType, cuRewrite); body.add(constructor); for (Iterator iter= fVariables.iterator(); iter.hasNext();) { ParameterInfo pi= (ParameterInfo) iter.next(); if (fCreateGetter && isValidField(pi)) { ASTNode getter= createGetter(pi, declaringType, unit, cuRewrite); body.add(getter); } if (fCreateSetter && isValidField(pi)) { if (!Modifier.isFinal(pi.getOldBinding().getModifiers())) { ASTNode setter= createSetter(pi, declaringType, unit, cuRewrite); body.add(setter); } } } return typeDeclaration; }
@Override public Type createType(String newTypeName, int startPosition, CompilationUnitRewrite cuRewrite) { return fParameterObjectFactory.createType(fCreateAsTopLevel, cuRewrite, startPosition); }
private void updateReferenceType() { if (fCreateAsTopLevel) fParameterObjectReference.setNewTypeName(JavaModelUtil.concatenateName(fParameterObjectFactory.getPackage(), fParameterObjectFactory .getClassName())); else fParameterObjectReference.setNewTypeName(JavaModelUtil.concatenateName(fParameterObjectFactory.getEnclosingType(), fParameterObjectFactory.getClassName())); }
protected String getTypeComment(ICompilationUnit parentCU, String lineDelimiter) throws CoreException { if (fParameterObjectFactory.isCreateComments()) { StringBuffer typeName= new StringBuffer(); typeName.append(fParameterObjectFactory.getClassName()); String[] typeParamNames= new String[0]; String comment= CodeGeneration.getTypeComment(parentCU, typeName.toString(), typeParamNames, lineDelimiter); if (comment != null && isValidComment(comment)) { return comment; } } return null; }
protected String getTypeComment(ICompilationUnit parentCU, String lineDelimiter) throws CoreException { if (StubUtility.doAddComments(parentCU.getJavaProject())) { StringBuilder typeName= new StringBuilder(); typeName.append(getClassName()); String[] typeParamNames= new String[0]; String comment= CodeGeneration.getTypeComment(parentCU, typeName.toString(), typeParamNames, lineDelimiter); if (comment != null && isValidComment(comment)) { return comment; } } return null; }
private JDTRefactoringDescriptorComment createComment(String project) throws JavaModelException { String header= Messages.format(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_description, getOldMethodSignature()); JDTRefactoringDescriptorComment comment= new JDTRefactoringDescriptorComment(project, this, header); comment.addSetting(Messages.format(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_object_class, BasicElementLabels.getJavaElementName(fParameterObjectFactory.getClassName()))); if (fCreateAsTopLevel) { comment.addSetting(Messages.format(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_package, BasicElementLabels.getJavaElementName(fParameterObjectFactory.getPackage()))); } else { comment.addSetting(Messages.format(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_enclosing_type, BasicElementLabels.getJavaElementName(fParameterObjectFactory.getEnclosingType()))); if (!kept.isEmpty()) comment.addSetting(JDTRefactoringDescriptorComment.createCompositeSetting(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_keep_parameter, kept.toArray(new String[0]))); if (fParameterObjectFactory.isCreateGetter()) comment.addSetting(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_create_getter); if (fParameterObjectFactory.isCreateSetter()) comment.addSetting(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_create_setter); return comment;
public List<ResourceChange> createTopLevelParameterObject(IPackageFragmentRoot packageFragmentRoot, CreationListener listener) throws CoreException { List<ResourceChange> changes= new ArrayList<>(); IPackageFragment packageFragment= packageFragmentRoot.getPackageFragment(getPackage()); if (!packageFragment.exists()) { changes.add(new CreatePackageChange(packageFragment)); ICompilationUnit unit= packageFragment.getCompilationUnit(getClassName() + JavaModelUtil.DEFAULT_CU_SUFFIX); Assert.isTrue(!unit.exists()); IJavaProject javaProject= unit.getJavaProject(); String fileComment= getFileComment(workingCopy, lineDelimiter); String typeComment= getTypeComment(workingCopy, lineDelimiter); String content= CodeGeneration.getCompilationUnitContent(workingCopy, fileComment, typeComment, "class " + getClassName() + "{}", lineDelimiter); //$NON-NLS-1$ //$NON-NLS-2$ workingCopy.getBuffer().setContents(content); String newTypeName= JavaModelUtil.concatenateName(getPackage(), getClassName()); TypeDeclaration classDeclaration= createClassDeclaration(newTypeName, cuRewrite, listener); classDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD)); Javadoc javadoc= (Javadoc) dummyType.getStructuralProperty(TypeDeclaration.JAVADOC_PROPERTY);
private void initializeFields(IMethod method) { fParameterObjectFactory= new ParameterObjectFactory(); String methodName= method.getElementName(); String className= String.valueOf(Character.toUpperCase(methodName.charAt(0))); if (methodName.length() > 1) className+= methodName.substring(1); className+= PARAMETER_CLASS_APPENDIX; fParameterObjectReference= ParameterInfo.createInfoForAddedParameter(className, DEFAULT_PARAMETER_OBJECT_NAME); fParameterObjectFactory.setClassName(className); IType declaringType= method.getDeclaringType(); Assert.isNotNull(declaringType); fParameterObjectFactory.setPackage(declaringType.getPackageFragment().getElementName()); updateReferenceType(); }
private void createParameterClass(MethodDeclaration methodDeclaration, CompilationUnitRewrite cuRewrite) throws CoreException { if (fCreateAsTopLevel) { IJavaProject javaProject= fCompilationUnit.getJavaProject(); IPackageFragment packageFragment= getPackageFragmentRoot().getPackageFragment(fParameterObjectFactory.getPackage()); if (!packageFragment.exists()) { fOtherChanges.add(new CreatePackageChange(packageFragment)); } ICompilationUnit unit= packageFragment.getCompilationUnit(fParameterObjectFactory.getClassName() + ".java"); //$NON-NLS-1$ Assert.isTrue(!unit.exists()); createTopLevelParameterObject(javaProject, unit); } else { ASTRewrite rewriter= cuRewrite.getASTRewrite(); TypeDeclaration enclosingType= (TypeDeclaration) methodDeclaration.getParent(); ListRewrite bodyRewrite= rewriter.getListRewrite(enclosingType, TypeDeclaration.BODY_DECLARATIONS_PROPERTY); TypeDeclaration classDeclaration= fParameterObjectFactory.createClassDeclaration(fCompilationUnit, enclosingType.getName() .getFullyQualifiedName(), cuRewrite); classDeclaration.modifiers().add(rewriter.getAST().newModifier(ModifierKeyword.PUBLIC_KEYWORD)); classDeclaration.modifiers().add(rewriter.getAST().newModifier(ModifierKeyword.STATIC_KEYWORD)); bodyRewrite.insertBefore(classDeclaration, methodDeclaration, null); } }
public ExpressionStatement createInitializer(ParameterInfo pi, String paramName, CompilationUnitRewrite cuRewrite) { AST ast= cuRewrite.getAST(); VariableDeclarationFragment fragment= ast.newVariableDeclarationFragment(); fragment.setName(ast.newSimpleName(pi.getOldName())); fragment.setInitializer(createFieldReadAccess(pi, paramName, ast)); VariableDeclarationExpression declaration= ast.newVariableDeclarationExpression(fragment); IVariableBinding variable= pi.getOldBinding(); declaration.setType(importBinding(pi.getNewTypeBinding(), cuRewrite)); int modifiers= variable.getModifiers(); List newModifiers= ast.newModifiers(modifiers); declaration.modifiers().addAll(newModifiers); return ast.newExpressionStatement(declaration); }
public void updateBody(MethodDeclaration methodDeclaration, CompilationUnitRewrite cuRewrite, RefactoringStatus result) throws CoreException { fParameterObjectFactory.createType(fCreateAsTopLevel, cuRewrite, methodDeclaration.getStartPosition()); if (cuRewrite.getCu().equals(fCompilationUnit) && !fParameterClassCreated) { createParameterClass(methodDeclaration, cuRewrite); pi.setInlined(true); } else { ExpressionStatement initializer= fParameterObjectFactory.createInitializer(pi, getParameterName(), cuRewrite); bodyStatements.insertFirst(initializer, null);
private void createParameterClass(MethodDeclaration methodDeclaration, CompilationUnitRewrite cuRewrite) throws CoreException { if (fCreateAsTopLevel) { IPackageFragmentRoot root= (IPackageFragmentRoot) cuRewrite.getCu().getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); fOtherChanges.addAll(fParameterObjectFactory.createTopLevelParameterObject(root)); } else { ASTRewrite rewriter= cuRewrite.getASTRewrite(); TypeDeclaration enclosingType= (TypeDeclaration) methodDeclaration.getParent(); ListRewrite bodyRewrite= rewriter.getListRewrite(enclosingType, TypeDeclaration.BODY_DECLARATIONS_PROPERTY); String fqn= enclosingType.getName().getFullyQualifiedName(); TypeDeclaration classDeclaration= fParameterObjectFactory.createClassDeclaration(fqn, cuRewrite, null); classDeclaration.modifiers().add(rewriter.getAST().newModifier(ModifierKeyword.PUBLIC_KEYWORD)); classDeclaration.modifiers().add(rewriter.getAST().newModifier(ModifierKeyword.STATIC_KEYWORD)); bodyRewrite.insertBefore(classDeclaration, methodDeclaration, null); } }
private void updateSimpleName(ASTRewrite rewriter, ParameterInfo pi, SimpleName node, List enclosingParameters) { AST ast= rewriter.getAST(); IBinding binding= node.resolveBinding(); Expression replacementNode= fParameterObjectFactory.createFieldReadAccess(pi, getParameterName(), ast); if (binding instanceof IVariableBinding) { IVariableBinding variable= (IVariableBinding) binding; if (variable.isParameter() && variable.getName().equals(getNameInScope(pi, enclosingParameters))) { rewriter.replace(node, replacementNode, null); } } else { ASTNode parent= node.getParent(); if (! (parent instanceof QualifiedName || parent instanceof FieldAccess || parent instanceof SuperFieldAccess)) { if (node.getIdentifier().equals(getNameInScope(pi, enclosingParameters))) { rewriter.replace(node, replacementNode, null); } } } }
@Override public Expression createDefaultExpression(List<Expression> invocationArguments, ParameterInfo addedInfo, List<ParameterInfo> parameterInfos, MethodDeclaration enclosingMethod, boolean isRecursive, CompilationUnitRewrite cuRewrite) { final AST ast= cuRewrite.getAST(); final ASTRewrite rewrite= cuRewrite.getASTRewrite(); if (isRecursive && canReuseParameterObject(invocationArguments, addedInfo, parameterInfos, enclosingMethod)) { return ast.newSimpleName(addedInfo.getNewName()); } ClassInstanceCreation classCreation= ast.newClassInstanceCreation(); int startPosition= enclosingMethod != null ? enclosingMethod.getStartPosition() : cuRewrite.getRoot().getStartPosition(); ContextSensitiveImportRewriteContext context= fParameterObjectFactory.createParameterClassAwareContext(fCreateAsTopLevel, cuRewrite, startPosition); classCreation.setType(fParameterObjectFactory.createType(fCreateAsTopLevel, cuRewrite, startPosition)); List<Expression> constructorArguments= classCreation.arguments(); for (Iterator<ParameterInfo> iter= parameterInfos.iterator(); iter.hasNext();) { ParameterInfo pi= iter.next(); if (isValidField(pi)) { if (pi.isOldVarargs()) { boolean isLastParameter= !iter.hasNext(); constructorArguments.addAll(computeVarargs(invocationArguments, pi, isLastParameter, cuRewrite, context)); } else { Expression exp= invocationArguments.get(pi.getOldIndex()); importNodeTypes(exp, cuRewrite, context); constructorArguments.add(moveNode(exp, rewrite)); } } } return classCreation; }
} else { NullLiteral marker= qualifier == null ? null : ast.newNullLiteral(); Expression access= pof.createFieldWriteAccess(pi, parameterName, ast, javaProject, assignedValue, useSuper, marker); replaceMarker(rewrite, qualifier, access, marker); rewrite.replace(replaceNode, access, writeGroup); Expression fieldReadAccess= pof.createFieldReadAccess(pi, parameterName, ast, javaProject, false, null); //qualifier is already there rewrite.replace(name, fieldReadAccess, readGroup);
public String getClassName() { return fParameterObjectFactory.getClassName(); }
private JDTRefactoringDescriptorComment createComment(String project) throws JavaModelException { String header= Messages.format(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_description, getOldMethodSignature()); JDTRefactoringDescriptorComment comment= new JDTRefactoringDescriptorComment(project, this, header); comment.addSetting(Messages.format(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_object_class, BasicElementLabels.getJavaElementName(fParameterObjectFactory.getClassName()))); if (fCreateAsTopLevel) { comment.addSetting(Messages.format(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_package, BasicElementLabels.getJavaElementName(fParameterObjectFactory.getPackage()))); } else { comment.addSetting(Messages.format(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_enclosing_type, BasicElementLabels.getJavaElementName(fParameterObjectFactory.getEnclosingType()))); if (!kept.isEmpty()) comment.addSetting(JDTRefactoringDescriptorComment.createCompositeSetting(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_keep_parameter, kept.toArray(new String[0]))); if (fParameterObjectFactory.isCreateGetter()) comment.addSetting(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_create_getter); if (fParameterObjectFactory.isCreateSetter()) comment.addSetting(RefactoringCoreMessages.IntroduceParameterObjectRefactoring_descriptor_create_setter); return comment;
private void updateReferenceType() { if (fCreateAsTopLevel) fParameterObjectReference.setNewTypeName(JavaModelUtil.concatenateName(fParameterObjectFactory.getPackage(), fParameterObjectFactory .getClassName())); else fParameterObjectReference.setNewTypeName(JavaModelUtil.concatenateName(fParameterObjectFactory.getEnclosingType(), fParameterObjectFactory.getClassName())); }
public List<ResourceChange> createTopLevelParameterObject(IPackageFragmentRoot packageFragmentRoot, CreationListener listener) throws CoreException { List<ResourceChange> changes= new ArrayList<>(); IPackageFragment packageFragment= packageFragmentRoot.getPackageFragment(getPackage()); if (!packageFragment.exists()) { changes.add(new CreatePackageChange(packageFragment)); ICompilationUnit unit= packageFragment.getCompilationUnit(getClassName() + JavaModelUtil.DEFAULT_CU_SUFFIX); Assert.isTrue(!unit.exists()); IJavaProject javaProject= unit.getJavaProject(); String fileComment= getFileComment(workingCopy, lineDelimiter); String typeComment= getTypeComment(workingCopy, lineDelimiter); String content= CodeGeneration.getCompilationUnitContent(workingCopy, fileComment, typeComment, "class " + getClassName() + "{}", lineDelimiter); //$NON-NLS-1$ //$NON-NLS-2$ workingCopy.getBuffer().setContents(content); String newTypeName= JavaModelUtil.concatenateName(getPackage(), getClassName()); TypeDeclaration classDeclaration= createClassDeclaration(newTypeName, cuRewrite, listener, context); classDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD)); Javadoc javadoc= (Javadoc) dummyType.getStructuralProperty(TypeDeclaration.JAVADOC_PROPERTY);