diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF index 5695e125..ccd945e3 100644 --- a/META-INF/MANIFEST.MF +++ b/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: JDeodorant Plug-in Bundle-SymbolicName: gr.uom.java.jdeodorant; singleton:=true -Bundle-Version: 5.0.73 +Bundle-Version: 5.0.74 Bundle-Activator: gr.uom.java.jdeodorant.refactoring.Activator Bundle-Localization: plugin Require-Bundle: org.eclipse.ui, diff --git a/src/gr/uom/java/jdeodorant/refactoring/manipulators/ReplaceTypeCodeWithStateStrategy.java b/src/gr/uom/java/jdeodorant/refactoring/manipulators/ReplaceTypeCodeWithStateStrategy.java index 6aa41b7e..039b1a83 100644 --- a/src/gr/uom/java/jdeodorant/refactoring/manipulators/ReplaceTypeCodeWithStateStrategy.java +++ b/src/gr/uom/java/jdeodorant/refactoring/manipulators/ReplaceTypeCodeWithStateStrategy.java @@ -2300,6 +2300,50 @@ else if(switchCaseExpression instanceof FieldAccess) { } } } + else if(statement instanceof VariableDeclarationStatement) { + VariableDeclarationStatement variableDeclarationStatement = (VariableDeclarationStatement)statement; + List fragments = variableDeclarationStatement.fragments(); + for(VariableDeclarationFragment fragment : fragments) { + Expression intializerExpression = fragment.getInitializer(); + SimpleName accessedVariable = null; + if(intializerExpression instanceof SimpleName) { + accessedVariable = (SimpleName)intializerExpression; + } + else if(intializerExpression instanceof FieldAccess) { + FieldAccess fieldAccess = (FieldAccess)intializerExpression; + accessedVariable = fieldAccess.getName(); + } + if(accessedVariable != null) { + IBinding initializerExpressionBinding = accessedVariable.resolveBinding(); + if(initializerExpressionBinding != null && initializerExpressionBinding.getKind() == IBinding.VARIABLE) { + IVariableBinding accessedVariableBinding = (IVariableBinding)initializerExpressionBinding; + if(accessedVariableBinding.isField() && typeCheckElimination.getTypeField().resolveBinding().isEqualTo(accessedVariableBinding)) { + if(modify && !nodeExistsInsideTypeCheckCodeFragment(intializerExpression)) { + ASTRewrite sourceRewriter = ASTRewrite.create(sourceTypeDeclaration.getAST()); + AST contextAST = sourceTypeDeclaration.getAST(); + MethodInvocation getterMethodInvocation = contextAST.newMethodInvocation(); + if(typeCheckElimination.getTypeFieldGetterMethod() != null) { + sourceRewriter.set(getterMethodInvocation, MethodInvocation.NAME_PROPERTY, typeCheckElimination.getTypeFieldGetterMethod().getName(), null); + } + else { + sourceRewriter.set(getterMethodInvocation, MethodInvocation.NAME_PROPERTY, contextAST.newSimpleName("get" + abstractClassName), null); + } + sourceRewriter.replace(intializerExpression, getterMethodInvocation, null); + try { + TextEdit sourceEdit = sourceRewriter.rewriteAST(); + ICompilationUnit sourceICompilationUnit = (ICompilationUnit)sourceCompilationUnit.getJavaElement(); + CompilationUnitChange change = compilationUnitChanges.get(sourceICompilationUnit); + change.getEdit().addChild(sourceEdit); + change.addTextEditGroup(new TextEditGroup("Replace field access with invocation of getter method", new TextEdit[] {sourceEdit})); + } catch (JavaModelException e) { + e.printStackTrace(); + } + } + } + } + } + } + } List methodInvocations = expressionExtractor.getMethodInvocations(statement); for(Expression expression : methodInvocations) { if(expression instanceof MethodInvocation) {