#?description=Rename a Java field to its source variable's name, in a field assignment statement.
#?shortcut=
from com.pnfsoftware.jeb.client.api import IScript, IGraphicalClientContext
from com.pnfsoftware.jeb.core.units.code.android.dex import IDexField
from com.pnfsoftware.jeb.core.units.code.java import IJavaSourceUnit, IJavaClass, IJavaInstanceField, IJavaAssignment, IJavaIdentifier
"""
Sample script for JEB Decompiler.
Rename a Java field to its source variable's name, in a field assignment statement.
In a decompiled Java method, place the caret on the target object field.
Example: this.field3 = blah;
^^^^ caret here
"""
class JavaRenameField1(IScript):
def run(self, ctx):
# must be a GUI client
prj = ctx.getMainProject()
if not isinstance(ctx, IGraphicalClientContext):
return
# retrieve the focused text fragment
fragment = ctx.getFocusedFragment()
if not fragment:
return
# focused fragment must be decompiled Java, underlying unit is of type IJavaSourceUnit
ast_unit = fragment.getUnit()
if not isinstance(ast_unit, IJavaSourceUnit):
return
self.dex = ast_unit.getDecompiler().getDex()
# retrieve the active (highlighted) item, which must be an object field
item = fragment.getActiveItem()
if not item:
return
# retrieve the underlying IDexField object
o = ast_unit.getItemObject(item.getItemId())
if not isinstance(o, IDexField):
return
self.target_field = o
# walk the methods's AST tree, look for assignments to the target field
elt = ast_unit.getASTElement()
if isinstance(elt, IJavaClass):
for m in elt.getMethods():
self.processASTMethod(None, m)
def processASTMethod(self, parent, e):
if isinstance(e, IJavaAssignment) and isinstance(e.getRight(), IJavaIdentifier) and isinstance(e.getLeft(), IJavaInstanceField):
dst, src = e.getLeft(), e.getRight()
# perform the renaming
ident_name = src.getName()
fsig = dst.getField().getSignature()
if self.dex.getField(fsig) == self.target_field:
self.target_field.setName(ident_name)
for subelt in e.getSubElements():
self.processASTMethod(e, subelt)