|
From: <mir...@us...> - 2007-02-21 13:13:03
|
Revision: 1992
http://svn.sourceforge.net/rubyeclipse/?rev=1992&view=rev
Author: mirkostocker
Date: 2007-02-21 05:13:01 -0800 (Wed, 21 Feb 2007)
Log Message:
-----------
Inline method now creates accessors if the inlined method body accesses members of the class.
Modified Paths:
--------------
trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineAndRemoveEditProvider.java
trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineMethodConditionChecker.java
trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineMethodConfig.java
trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/MethodBodyStatementReplacer.java
trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/RenameDuplicatedVariables.java
trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/movefield/GenerateAccessorsAtTarget.java
trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/TC_MethodBodyStatementReplacer.source.rb
trunk/org.rubypeople.rdt.refactoring.tests/src/org/rubypeople/rdt/refactoring/tests/core/inlinemethod/TC_MethodBodyStatementReplacer.java
Added Paths:
-----------
trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.result.rb
trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.source.rb
trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.test_properties
Modified: trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineAndRemoveEditProvider.java
===================================================================
--- trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineAndRemoveEditProvider.java 2007-02-21 12:57:27 UTC (rev 1991)
+++ trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineAndRemoveEditProvider.java 2007-02-21 13:13:01 UTC (rev 1992)
@@ -31,6 +31,7 @@
import java.util.ArrayList;
import java.util.Collection;
+import org.rubypeople.rdt.refactoring.core.movefield.GenerateAccessorsAtTarget;
import org.rubypeople.rdt.refactoring.editprovider.DeleteEditProvider;
import org.rubypeople.rdt.refactoring.editprovider.EditProvider;
import org.rubypeople.rdt.refactoring.editprovider.MultiEditProvider;
@@ -51,6 +52,11 @@
if(remove) {
editProviders.add(new DeleteEditProvider(config.getMethodDefinitionNode()));
}
+ if(config.getUsedMembers() != null && !config.getUsedMembers().isEmpty()) {
+ for(String member : config.getUsedMembers()) {
+ editProviders.add(new GenerateAccessorsAtTarget(config.getDocumentProvider(), config.getClassName(), member.substring(1)).getEditProvider());
+ }
+ }
return editProviders;
}
Modified: trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineMethodConditionChecker.java
===================================================================
--- trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineMethodConditionChecker.java 2007-02-21 12:57:27 UTC (rev 1991)
+++ trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineMethodConditionChecker.java 2007-02-21 13:13:01 UTC (rev 1992)
@@ -29,6 +29,8 @@
package org.rubypeople.rdt.refactoring.core.inlinemethod;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
import org.jruby.ast.AssignableNode;
import org.jruby.ast.ListNode;
@@ -113,8 +115,12 @@
private void createInlinedMethodBody(DocumentProvider doc) {
MethodBodyStatementReplacer bodyReplacer = new MethodBodyStatementReplacer();
if(config.getSelectedCall().getReceiver() != null) {
- config.setMethodDefDoc(bodyReplacer.replaceSelfWithObject(config.getMethodDefDoc(), ((INameNode)config.getSelectedCall().getReceiver()).getName()));
- config.setMethodDefDoc(bodyReplacer.prefixCallsWithObject(config.getMethodDefDoc(), new IncludedClassesProvider(doc), config.getClassName(), ((INameNode)config.getSelectedCall().getReceiver()).getName()));
+ final String name = ((INameNode)config.getSelectedCall().getReceiver()).getName();
+ config.setMethodDefDoc(bodyReplacer.replaceSelfWithObject(config.getMethodDefDoc(), name));
+ config.setMethodDefDoc(bodyReplacer.prefixCallsWithObject(config.getMethodDefDoc(), new IncludedClassesProvider(doc), config.getClassName(), name));
+ Collection<String> usedMembers = new HashSet<String>();
+ config.setMethodDefDoc(bodyReplacer.replaceVarsWithAccessor(config.getMethodDefDoc(), name, usedMembers));
+ config.setUsedMembers(usedMembers);
}
config.setMethodDefDoc(bodyReplacer.removeReturnStatements(config.getMethodDefDoc()));
}
Modified: trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineMethodConfig.java
===================================================================
--- trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineMethodConfig.java 2007-02-21 12:57:27 UTC (rev 1991)
+++ trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/InlineMethodConfig.java 2007-02-21 13:13:01 UTC (rev 1992)
@@ -28,6 +28,8 @@
package org.rubypeople.rdt.refactoring.core.inlinemethod;
+import java.util.Collection;
+
import org.jruby.ast.MethodDefNode;
import org.jruby.ast.Node;
import org.rubypeople.rdt.refactoring.core.NodeProvider;
@@ -43,6 +45,7 @@
private final DocumentProvider originalDocument;
private int pos;
private ITargetClassFinder targetClassFinder;
+ private Collection<String> usedMembers;
public InlineMethodConfig(DocumentProvider doc, int pos, ITargetClassFinder targetClassFinder) {
@@ -106,4 +109,12 @@
public void setMethodDefinitionNode(MethodDefNode methodDefinitionNode) {
this.methodDefinitionNode = methodDefinitionNode;
}
+
+ public void setUsedMembers(Collection<String> usedMembers) {
+ this.usedMembers = usedMembers;
+ }
+
+ public Collection<String> getUsedMembers() {
+ return usedMembers;
+ }
}
Modified: trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/MethodBodyStatementReplacer.java
===================================================================
--- trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/MethodBodyStatementReplacer.java 2007-02-21 12:57:27 UTC (rev 1991)
+++ trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/MethodBodyStatementReplacer.java 2007-02-21 13:13:01 UTC (rev 1992)
@@ -32,14 +32,17 @@
import java.util.Collection;
import org.jruby.ast.FCallNode;
+import org.jruby.ast.InstAsgnNode;
+import org.jruby.ast.InstVarNode;
import org.jruby.ast.Node;
import org.jruby.ast.ReturnNode;
import org.jruby.ast.SelfNode;
import org.jruby.ast.VCallNode;
+import org.jruby.ast.types.INameNode;
import org.rubypeople.rdt.refactoring.classnodeprovider.IncludedClassesProvider;
import org.rubypeople.rdt.refactoring.core.NodeProvider;
+import org.rubypeople.rdt.refactoring.documentprovider.DocumentProvider;
import org.rubypeople.rdt.refactoring.documentprovider.StringDocumentProvider;
-import org.rubypeople.rdt.refactoring.documentprovider.DocumentProvider;
import org.rubypeople.rdt.refactoring.nodewrapper.MethodNodeWrapper;
public class MethodBodyStatementReplacer implements IMethodBodyStatementReplacer {
@@ -63,7 +66,31 @@
return result;
}
+
+ public DocumentProvider replaceVarsWithAccessor(DocumentProvider doc, String object, Collection<String> usedMembers) {
+ DocumentProvider result = new StringDocumentProvider(doc);
+ Collection<Node> varNodes = null;
+ do {
+ varNodes = NodeProvider.gatherNodesOfTypeInAktScopeNode(result.getRootNode().getBodyNode(), InstVarNode.class, InstAsgnNode.class);
+
+ if(varNodes.isEmpty()) {
+ continue;
+ }
+ final Node varNode = varNodes.iterator().next();
+ String name = ((INameNode) varNode).getName();
+ usedMembers.add(name);
+ StringBuilder src = new StringBuilder(result.getActiveFileContent());
+ src.replace(varNode.getPosition().getStartOffset(),
+ varNode.getPosition().getStartOffset() + name.length(),
+ object + '.' + name.substring(1));
+ result = new StringDocumentProvider(src.toString());
+
+ } while(!varNodes.isEmpty());
+
+ return result;
+ }
+
public DocumentProvider prefixCallsWithObject(DocumentProvider doc, IncludedClassesProvider provider, String className, String object) {
DocumentProvider result = new StringDocumentProvider(doc);
@@ -78,7 +105,6 @@
return result;
}
-
private IMethodCallNode findCallToMethodInClass(DocumentProvider doc, IncludedClassesProvider provider, String className) {
Collection<MethodNodeWrapper> definedMethods = provider.getAllMethodsFor(className);
Modified: trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/RenameDuplicatedVariables.java
===================================================================
--- trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/RenameDuplicatedVariables.java 2007-02-21 12:57:27 UTC (rev 1991)
+++ trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/inlinemethod/RenameDuplicatedVariables.java 2007-02-21 13:13:01 UTC (rev 1992)
@@ -42,6 +42,7 @@
DocumentProvider result = new StringDocumentProvider(doc.getActiveFileContent());
for (String name : NameHelper.findDuplicates(rootNode.getStaticScope().getVariables(), localNames)) {
+ if("$~".equals(name) || "$_".equals(name)) continue;
result = new LocalVariableRenamer(result, name, NameHelper.createName(name)).rename();
}
return result;
Modified: trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/movefield/GenerateAccessorsAtTarget.java
===================================================================
--- trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/movefield/GenerateAccessorsAtTarget.java 2007-02-21 12:57:27 UTC (rev 1991)
+++ trunk/org.rubypeople.rdt.refactoring/src/org/rubypeople/rdt/refactoring/core/movefield/GenerateAccessorsAtTarget.java 2007-02-21 13:13:01 UTC (rev 1992)
@@ -43,7 +43,10 @@
for(String fileName : doc.getFileNames()) {
StringDocumentProvider stringDocumentProvider = new StringDocumentProvider(fileName, doc.getFileContent(fileName));
- targetClass = stringDocumentProvider.getIncludedClassNodeProvider().getClassNode(className);
+ ClassNodeWrapper classNodeWrapper = stringDocumentProvider.getIncludedClassNodeProvider().getClassNode(className);
+ if(classNodeWrapper != null) {
+ targetClass = classNodeWrapper;
+ }
}
generatedAccessor = new GeneratedAccessor("attr_accessor", accessorName, GeneratedAccessor.TYPE_SIMPLE_ACCESSOR, targetClass);
Modified: trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/TC_MethodBodyStatementReplacer.source.rb
===================================================================
--- trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/TC_MethodBodyStatementReplacer.source.rb 2007-02-21 12:57:27 UTC (rev 1991)
+++ trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/TC_MethodBodyStatementReplacer.source.rb 2007-02-21 13:13:01 UTC (rev 1992)
@@ -32,3 +32,9 @@
##!result5
fac = (1..10).inject(1) { |i, j| i * j }
fac
+##!test6
+@x = 5
+puts @x
+##!result6
+a.x = 5
+puts a.x
\ No newline at end of file
Added: trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.result.rb
===================================================================
--- trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.result.rb (rev 0)
+++ trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.result.rb 2007-02-21 13:13:01 UTC (rev 1992)
@@ -0,0 +1,14 @@
+class A
+
+ attr_accessor :x
+
+ def a
+ @x = 5
+ end
+end
+class B
+ def b
+ a = A.new
+ a.x = 5
+ end
+end
Added: trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.source.rb
===================================================================
--- trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.source.rb (rev 0)
+++ trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.source.rb 2007-02-21 13:13:01 UTC (rev 1992)
@@ -0,0 +1,11 @@
+class A
+ def a
+ @x = 5
+ end
+end
+class B
+ def b
+ a = A.new
+ a.a
+ end
+end
Added: trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.test_properties
===================================================================
--- trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.test_properties (rev 0)
+++ trunk/org.rubypeople.rdt.refactoring.tests/resources/core/inlinemethod/inline_method_test_13.test_properties 2007-02-21 13:13:01 UTC (rev 1992)
@@ -0,0 +1,2 @@
+pos=73
+remove=false
Modified: trunk/org.rubypeople.rdt.refactoring.tests/src/org/rubypeople/rdt/refactoring/tests/core/inlinemethod/TC_MethodBodyStatementReplacer.java
===================================================================
--- trunk/org.rubypeople.rdt.refactoring.tests/src/org/rubypeople/rdt/refactoring/tests/core/inlinemethod/TC_MethodBodyStatementReplacer.java 2007-02-21 12:57:27 UTC (rev 1991)
+++ trunk/org.rubypeople.rdt.refactoring.tests/src/org/rubypeople/rdt/refactoring/tests/core/inlinemethod/TC_MethodBodyStatementReplacer.java 2007-02-21 13:13:01 UTC (rev 1992)
@@ -28,6 +28,8 @@
package org.rubypeople.rdt.refactoring.tests.core.inlinemethod;
+import java.util.ArrayList;
+
import org.rubypeople.rdt.refactoring.core.inlinemethod.MethodBodyStatementReplacer;
import org.rubypeople.rdt.refactoring.documentprovider.IDocumentProvider;
import org.rubypeople.rdt.refactoring.tests.core.MultipleDocumentsInOneProvider;
@@ -49,10 +51,14 @@
public void testReturnStatement() {
replaceReturn("test4", "result4");
}
-
+
public void testReturnStatementFac() {
replaceReturn("test5", "result5");
}
+
+ public void testReturnCallToMember() {
+ replaceCallToMember("test6", "result6", "a");
+ }
private void replace(String testName, String newName, String resultName) {
IDocumentProvider result = new MethodBodyStatementReplacer().replaceSelfWithObject(doc.setActive(testName), newName);
@@ -64,6 +70,11 @@
compareResults(resultName, result);
}
+ private void replaceCallToMember(String testName, String resultName, String objName) {
+ IDocumentProvider result = new MethodBodyStatementReplacer().replaceVarsWithAccessor(doc.setActive(testName), objName, new ArrayList<String>());
+ compareResults(resultName, result);
+ }
+
private void compareResults(String resultName, IDocumentProvider result) {
assertEquals(doc.setActive(resultName).getActiveFileContent(), result.getActiveFileContent());
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|