aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2015-03-31 18:51:48 -0700
committerBen Gruver <bgruv@google.com>2015-03-31 18:51:48 -0700
commit48aacd2c01c116b154ee85df98024f6c6e4cb55a (patch)
tree2487d5066b72b31de383b70839a9c4358efe1159
parent923cc91ea26693cad32056f9a08eca432f3e4c61 (diff)
downloadsmali-48aacd2c01c116b154ee85df98024f6c6e4cb55a.tar.gz
Add support for renaming methods
-rw-r--r--smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java14
-rw-r--r--smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethodReference.java8
-rw-r--r--smalidea/src/test/java/org/jf/smalidea/MethodRenameTest.java50
-rw-r--r--smalidea/testData/methodRename/methodRename/after/blah.smali27
-rw-r--r--smalidea/testData/methodRename/methodRename/before/blah.smali27
5 files changed, 121 insertions, 5 deletions
diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java
index a2894f6d..1c6d704b 100644
--- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java
+++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java
@@ -225,8 +225,12 @@ public class SmaliMethod extends SmaliStubBasedPsiElement<SmaliMethodStub>
}
@Override public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
- // TODO: implement this
- throw new IncorrectOperationException();
+ SmaliMemberName smaliMemberName = getNameIdentifier();
+ if (smaliMemberName == null) {
+ throw new IncorrectOperationException();
+ }
+ smaliMemberName.setName(name);
+ return this;
}
@NotNull @Override public HierarchicalMethodSignature getHierarchicalMethodSignature() {
@@ -253,7 +257,11 @@ public class SmaliMethod extends SmaliStubBasedPsiElement<SmaliMethodStub>
}
@Nullable @Override public SmaliClass getContainingClass() {
- return (SmaliClass)getStubOrPsiParent();
+ PsiElement parent = getStubOrPsiParent();
+ if (parent instanceof SmaliClass) {
+ return (SmaliClass) parent;
+ }
+ return null;
}
@Override public boolean hasModifierProperty(@ModifierConstant @NonNls @NotNull String name) {
diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethodReference.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethodReference.java
index 907306ab..f8048e9f 100644
--- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethodReference.java
+++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethodReference.java
@@ -177,8 +177,12 @@ public class SmaliMethodReference extends SmaliCompositeElement implements PsiRe
}
@Override public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
- //TODO: implement this
- throw new IncorrectOperationException();
+ SmaliMemberName memberName = getMemberName();
+ if (memberName == null) {
+ throw new IncorrectOperationException();
+ }
+ memberName.setName(newElementName);
+ return this;
}
@Override public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
diff --git a/smalidea/src/test/java/org/jf/smalidea/MethodRenameTest.java b/smalidea/src/test/java/org/jf/smalidea/MethodRenameTest.java
new file mode 100644
index 00000000..29cf4d36
--- /dev/null
+++ b/smalidea/src/test/java/org/jf/smalidea/MethodRenameTest.java
@@ -0,0 +1,50 @@
+package org.jf.smalidea;
+
+import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiMethod;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.refactoring.MultiFileTestCase;
+import com.intellij.refactoring.rename.RenameProcessor;
+import org.jetbrains.annotations.NotNull;
+
+public class MethodRenameTest extends MultiFileTestCase {
+ @Override
+ protected String getTestDataPath() {
+ return "testData";
+ }
+
+ @NotNull
+ @Override
+ protected String getTestRoot() {
+ return "/methodRename/";
+ }
+
+ public void testMethodRename() {
+ doTest("blah", "blah", "blort");
+ }
+
+ private void doTest(@NotNull final String containingClass, @NotNull final String oldMethodName,
+ @NotNull final String newMethodName) {
+ doTest(new PerformAction() {
+ @Override
+ public void performAction(VirtualFile rootDir, VirtualFile rootAfter) throws Exception {
+ doRename(containingClass, oldMethodName, newMethodName);
+ }
+ });
+ }
+
+ private void doRename(String containingClass, String oldMethodName, String newMethodName) throws Exception {
+ PsiClass testClass = myJavaFacade.findClass(containingClass, GlobalSearchScope.allScope(getProject()));
+
+ PsiMethod method = testClass.findMethodsByName(oldMethodName, false)[0];
+
+ RenameProcessor processor = new RenameProcessor(getProject(), method, newMethodName, false, false);
+ processor.run();
+
+ PsiDocumentManager.getInstance(getProject()).commitAllDocuments();
+ FileDocumentManager.getInstance().saveAllDocuments();
+ }
+}
diff --git a/smalidea/testData/methodRename/methodRename/after/blah.smali b/smalidea/testData/methodRename/methodRename/after/blah.smali
new file mode 100644
index 00000000..2343699e
--- /dev/null
+++ b/smalidea/testData/methodRename/methodRename/after/blah.smali
@@ -0,0 +1,27 @@
+.class public Lblah;
+.super Ljava/lang/Object;
+
+.annotation runtime Lblah;
+ element = Lblah;->blort()V;
+.end annotation
+
+.method public blort()V
+ .registers 2
+
+ invoke-direct {v0}, Lblah;->blort()V
+ invoke-direct/empty {v0}, Lblah;->blort()V
+ invoke-direct/range {v0}, Lblah;->blort()V
+ invoke-interface {v0}, Lblah;->blort()V
+ invoke-interface/range {v0}, Lblah;->blort()V
+ invoke-object-init/range {v0}, Lblah;->blort()V
+ invoke-static {v0}, Lblah;->blort()V
+ invoke-static/range {v0}, Lblah;->blort()V
+ invoke-super {v0}, Lblah;->blort()V
+ invoke-super/range {v0}, Lblah;->blort()V
+ invoke-virtual {v0}, Lblah;->blort()V
+ invoke-virtual/range {v0}, Lblah;->blort()V
+
+ throw-verification-error generic-error, Lblah;->blort()V
+
+ return-void
+.end method
diff --git a/smalidea/testData/methodRename/methodRename/before/blah.smali b/smalidea/testData/methodRename/methodRename/before/blah.smali
new file mode 100644
index 00000000..9a800dc5
--- /dev/null
+++ b/smalidea/testData/methodRename/methodRename/before/blah.smali
@@ -0,0 +1,27 @@
+.class public Lblah;
+.super Ljava/lang/Object;
+
+.annotation runtime Lblah;
+ element = Lblah;->blah()V;
+.end annotation
+
+.method public blah()V
+ .registers 2
+
+ invoke-direct {v0}, Lblah;->blah()V
+ invoke-direct/empty {v0}, Lblah;->blah()V
+ invoke-direct/range {v0}, Lblah;->blah()V
+ invoke-interface {v0}, Lblah;->blah()V
+ invoke-interface/range {v0}, Lblah;->blah()V
+ invoke-object-init/range {v0}, Lblah;->blah()V
+ invoke-static {v0}, Lblah;->blah()V
+ invoke-static/range {v0}, Lblah;->blah()V
+ invoke-super {v0}, Lblah;->blah()V
+ invoke-super/range {v0}, Lblah;->blah()V
+ invoke-virtual {v0}, Lblah;->blah()V
+ invoke-virtual/range {v0}, Lblah;->blah()V
+
+ throw-verification-error generic-error, Lblah;->blah()V
+
+ return-void
+.end method