[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/pnfsoftware/jeb-samplecode/master/scripts/JavaRenameField2.py [Back]  [Original]

#?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.java import IJavaSourceUnit
from com.pnfsoftware.jeb.core.units.code.java import IJavaInstanceField, IJavaAssignment, IJavaIdentifier
"""
Sample script for JEB Decompiler.

Rename a Java field to its source variable's name, in a field assignment statement.

Demo for ITextFragment.getDocumentObjectsAtCaret()
Requires JEB 4.21 or above
"""
class JavaRenameField2(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
    dex = ast_unit.getDecompiler().getDex()

    # ITextFragment.getDocumentObjectsAtCaret() is key to this demo script
    # this API function retrieves a stack of unit objects relating to the text element where the caret is currently positioned
    # these objects are unit-specific; in the case of an IJavaSourceUnit object, they are IJavaElement objects (AST objects)
    astobjstk = fragment.getDocumentObjectsAtCaret()
    if len(astobjstk) < 2:
      return
    ast0 = astobjstk[-1]
    ast1 = astobjstk[-2]

    # we want: some_object.some_field = some_var
    #                      ^ (the caret is supposed to highlight the field item)
    if not isinstance(ast0, IJavaInstanceField):
      return
    if not isinstance(ast1, IJavaAssignment):
      return
    if not isinstance(ast1.getRight(), IJavaIdentifier):
      return

    # perform the renaming
    ident_name = ast1.getRight().getName()
    fsig = ast0.getField().getSignature()
    dex.getField(fsig).setName(ident_name)

Web Proxy Viewer  |  New URL  |  Original Page