From 48aacd2c01c116b154ee85df98024f6c6e4cb55a Mon Sep 17 00:00:00 2001 From: Ben Gruver Date: Tue, 31 Mar 2015 18:51:48 -0700 Subject: [PATCH] Add support for renaming methods --- .../org/jf/smalidea/psi/impl/SmaliMethod.java | 14 ++++-- .../psi/impl/SmaliMethodReference.java | 8 ++- .../org/jf/smalidea/MethodRenameTest.java | 50 +++++++++++++++++++ .../methodRename/after/blah.smali | 27 ++++++++++ .../methodRename/before/blah.smali | 27 ++++++++++ 5 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 smalidea/src/test/java/org/jf/smalidea/MethodRenameTest.java create mode 100644 smalidea/testData/methodRename/methodRename/after/blah.smali create mode 100644 smalidea/testData/methodRename/methodRename/before/blah.smali 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 } @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 } @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