@Override public Refactoring createRefactoring(JavaRefactoringDescriptor descriptor, RefactoringStatus status) throws CoreException { if (!(descriptor instanceof ExtractClassDescriptor)) { status.addFatalError(RefactoringCoreMessages.ExtractClassContribution_error_unknown_descriptor); return null; } return new ExtractClassRefactoring((ExtractClassDescriptor) descriptor); }
@Override public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { pm.beginTask(RefactoringCoreMessages.ExtractClassRefactoring_progress_create_change, 10); try { ICompilationUnit typeCU= fDescriptor.getType().getCompilationUnit(); IPackageFragmentRoot packageRoot= (IPackageFragmentRoot) typeCU.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); ArrayList<Change> changes= new ArrayList<>(); changes.addAll(createParameterObject(fParameterObjectFactory, packageRoot)); fChangeManager.manage(typeCU, fBaseCURewrite.createChange(true, pm)); changes.addAll(Arrays.asList(fChangeManager.getAllChanges())); String project= fDescriptor.getType().getJavaProject().getElementName(); fDescriptor.setProject(project); fDescriptor.setDescription(getName()); fDescriptor.setComment(createComment()); DynamicValidationRefactoringChange change= new DynamicValidationRefactoringChange(fDescriptor, RefactoringCoreMessages.ExtractClassRefactoring_change_name, changes .toArray(new Change[changes.size()])); return change; } finally { pm.done(); } }
private boolean isCreateField(FieldInfo fi) { return getField(fi.name).isCreateField(); }
ParameterInfo pi= getFieldInfo(name.getIdentifier()).pi; boolean writeAccess= ASTResolving.isWriteAccess(name); if (writeAccess && fDescriptor.isCreateGetterSetter()) { boolean useSuper= parent.getNodeType() == ASTNode.SUPER_FIELD_ACCESS; Expression qualifier= getQualifier(parent); ASTNode replaceNode= getReplacementNode(parent, useSuper, qualifier); Expression assignedValue= getAssignedValue(pof, parameterName, javaProject, status, rewrite, pi, useSuper, name.resolveTypeBinding(), qualifier, replaceNode, typeRoot); if (assignedValue == null) { status.addError(RefactoringCoreMessages.ExtractClassRefactoring_error_unable_to_convert_node, JavaStatusContext.create(typeRoot, replaceNode)); 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);
TextEditGroup removeFieldGroup= fBaseCURewrite.createGroupDescription(RefactoringCoreMessages.ExtractClassRefactoring_group_remove_field); FieldDeclaration lastField= null; initializeDeclaration(typeNode); for (Iterator<FieldInfo> iter= fVariables.values().iterator(); iter.hasNext();) { FieldInfo pi= iter.next(); if (isCreateField(pi)) { VariableDeclarationFragment vdf= pi.declaration; FieldDeclaration parent= (FieldDeclaration) vdf.getParent(); removeNode(vdf, removeFieldGroup, fBaseCURewrite); if (listRewrite.getRewrittenList().size() == 0) { removeNode(parent, removeFieldGroup, fBaseCURewrite); FieldDeclaration fieldDeclaration= createParameterObjectField(pof, typeNode, modifier); ListRewrite bodyDeclList= rewrite.getListRewrite(typeNode, TypeDeclaration.BODY_DECLARATIONS_PROPERTY); if (lastField != null)
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; }
private void initializeDeclaration(TypeDeclaration node) { FieldDeclaration[] fields= node.getFields(); for (int i= 0; i < fields.length; i++) { FieldDeclaration fieldDeclaration= fields[i]; List<VariableDeclarationFragment> fragments= fieldDeclaration.fragments(); for (Iterator<VariableDeclarationFragment> iterator= fragments.iterator(); iterator.hasNext();) { VariableDeclarationFragment vdf= iterator.next(); FieldInfo fieldInfo= getFieldInfo(vdf.getName().getIdentifier()); if (fieldInfo != null) { Assert.isNotNull(vdf); fieldInfo.declaration= vdf; fieldInfo.pi.setOldBinding(vdf.resolveBinding()); } } } }
ParameterInfo pi= getFieldInfo(name.getIdentifier()).pi; boolean writeAccess= ASTResolving.isWriteAccess(name); if (writeAccess && fDescriptor.isCreateGetterSetter()) { boolean useSuper= parent.getNodeType() == ASTNode.SUPER_FIELD_ACCESS; Expression qualifier= getQualifier(parent); ASTNode replaceNode= getReplacementNode(parent, useSuper, qualifier); Expression assignedValue= getAssignedValue(pof, parameterName, javaProject, status, rewrite, pi, useSuper, name.resolveTypeBinding(), qualifier, replaceNode, typeRoot); if (assignedValue == null) { status.addError(RefactoringCoreMessages.ExtractClassRefactoring_error_unable_to_convert_node, JavaStatusContext.create(typeRoot, replaceNode)); 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);
TextEditGroup removeFieldGroup= fBaseCURewrite.createGroupDescription(RefactoringCoreMessages.ExtractClassRefactoring_group_remove_field); FieldDeclaration lastField= null; initializeDeclaration(typeNode); for (Iterator<FieldInfo> iter= fVariables.values().iterator(); iter.hasNext();) { FieldInfo pi= iter.next(); if (isCreateField(pi)) { VariableDeclarationFragment vdf= pi.declaration; FieldDeclaration parent= (FieldDeclaration) vdf.getParent(); removeNode(vdf, removeFieldGroup, fBaseCURewrite); if (listRewrite.getRewrittenList().size() == 0) { removeNode(parent, removeFieldGroup, fBaseCURewrite); FieldDeclaration fieldDeclaration= createParameterObjectField(pof, typeNode, modifier); ListRewrite bodyDeclList= rewrite.getListRewrite(typeNode, TypeDeclaration.BODY_DECLARATIONS_PROPERTY); if (lastField != null)
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; }
private void initializeDeclaration(TypeDeclaration node) { FieldDeclaration[] fields= node.getFields(); for (int i= 0; i < fields.length; i++) { FieldDeclaration fieldDeclaration= fields[i]; List<VariableDeclarationFragment> fragments= fieldDeclaration.fragments(); for (Iterator<VariableDeclarationFragment> iterator= fragments.iterator(); iterator.hasNext();) { VariableDeclarationFragment vdf= iterator.next(); FieldInfo fieldInfo= getFieldInfo(vdf.getName().getIdentifier()); if (fieldInfo != null) { Assert.isNotNull(vdf); fieldInfo.declaration= vdf; fieldInfo.pi.setOldBinding(vdf.resolveBinding()); } } } }
@Override public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { pm.beginTask(RefactoringCoreMessages.ExtractClassRefactoring_progress_create_change, 10); try { ICompilationUnit typeCU= fDescriptor.getType().getCompilationUnit(); IPackageFragmentRoot packageRoot= (IPackageFragmentRoot) typeCU.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT); ArrayList<Change> changes= new ArrayList<>(); changes.addAll(createParameterObject(fParameterObjectFactory, packageRoot)); fChangeManager.manage(typeCU, fBaseCURewrite.createChange(true, pm)); changes.addAll(Arrays.asList(fChangeManager.getAllChanges())); String project= fDescriptor.getType().getJavaProject().getElementName(); fDescriptor.setProject(project); fDescriptor.setDescription(getName()); fDescriptor.setComment(createComment()); DynamicValidationRefactoringChange change= new DynamicValidationRefactoringChange(fDescriptor, RefactoringCoreMessages.ExtractClassRefactoring_change_name, changes .toArray(new Change[changes.size()])); return change; } finally { pm.done(); } }
@Override public Refactoring createRefactoring(JavaRefactoringDescriptor descriptor, RefactoringStatus status) throws CoreException { if (!(descriptor instanceof ExtractClassDescriptor)) { status.addFatalError(RefactoringCoreMessages.ExtractClassContribution_error_unknown_descriptor); return null; } return new ExtractClassRefactoring((ExtractClassDescriptor) descriptor); }
private Expression handleSimpleNameAssignment(ASTNode replaceNode, ParameterObjectFactory pof, String parameterName, AST ast, IJavaProject javaProject, boolean useSuper) { if (replaceNode instanceof Assignment) { Assignment assignment= (Assignment) replaceNode; Expression rightHandSide= assignment.getRightHandSide(); if (rightHandSide.getNodeType() == ASTNode.SIMPLE_NAME) { SimpleName sn= (SimpleName) rightHandSide; IVariableBinding binding= ASTNodes.getVariableBinding(sn); if (binding != null && binding.isField()) { if (fDescriptor.getType().getFullyQualifiedName().equals(binding.getDeclaringClass().getQualifiedName())) { FieldInfo fieldInfo= getFieldInfo(binding.getName()); if (fieldInfo != null && binding == fieldInfo.pi.getOldBinding()) { return pof.createFieldReadAccess(fieldInfo.pi, parameterName, ast, javaProject, useSuper, null); } } } } } return null; }
private boolean isCreateField(FieldInfo fi) { return getField(fi.name).isCreateField(); }
public static void startExtractClassRefactoring(IType type, Shell shell) { ExtractClassDescriptor descriptor= RefactoringSignatureDescriptorFactory.createExtractClassDescriptor(); descriptor.setType(type); ExtractClassRefactoring refactoring= new ExtractClassRefactoring(descriptor); ExtractClassWizard wizard= new ExtractClassWizard(descriptor, refactoring); new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING); }
private Expression handleSimpleNameAssignment(ASTNode replaceNode, ParameterObjectFactory pof, String parameterName, AST ast, IJavaProject javaProject, boolean useSuper) { if (replaceNode instanceof Assignment) { Assignment assignment= (Assignment) replaceNode; Expression rightHandSide= assignment.getRightHandSide(); if (rightHandSide.getNodeType() == ASTNode.SIMPLE_NAME) { SimpleName sn= (SimpleName) rightHandSide; IVariableBinding binding= ASTNodes.getVariableBinding(sn); if (binding != null && binding.isField()) { if (fDescriptor.getType().getFullyQualifiedName().equals(binding.getDeclaringClass().getQualifiedName())) { FieldInfo fieldInfo= getFieldInfo(binding.getName()); if (fieldInfo != null && binding == fieldInfo.pi.getOldBinding()) { return pof.createFieldReadAccess(fieldInfo.pi, parameterName, ast, javaProject, useSuper, null); } } } } } return null; }
public static void startExtractClassRefactoring(IType type, Shell shell) { ExtractClassDescriptor descriptor= RefactoringSignatureDescriptorFactory.createExtractClassDescriptor(); descriptor.setType(type); ExtractClassRefactoring refactoring= new ExtractClassRefactoring(descriptor); ExtractClassWizard wizard= new ExtractClassWizard(descriptor, refactoring); new RefactoringStarter().activate(wizard, shell, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringSaveHelper.SAVE_REFACTORING); }