在Pharo Smalltalk中重构方法并使用不同的名称创建副本?

时间:2017-01-16 12:15:30

标签: reflection metaprogramming smalltalk pharo

我正在尝试重构和一些自定义功能。有没有办法将方法复制到与原始类相同的类但以新名称? (基本上创建一个非常浅的副本)您可以通过编辑方法源手动完成此操作,但是可以以编程方式完成吗?

例如:

doMethodName: anArgument
^ anObject doThat with: anArgument

变为:

doNewMethodName: anArgument
^ anObject doThat with: anArgument

1 个答案:

答案 0 :(得分:3)

您可以通过向目标类发送compile:消息来编译方法。

  1. 检索方法
    • e.g。 method := Float>>#cosmethod := Float methodNamed: #cos
  2. 检索源代码

    • method sourceCode会将方法代码作为字符串
    • 返回
    • method ast(或method parseTree)会将代码作为已解析的树表示返回
  3. 将代码编译到类中(可选择使用协议)

    • TargetClass compile: sourceCode
    • TargetClass compile: sourceCode classified: protocol
  4. 所以,如果你有

    Something>>doMethodName: anArgument
        ^ anObject doThat with: anArgument
    

    你可以做到

    code := (Something>>#doMethodName:) sourceCode.
    "replace all matches"
    newCode := code copyReplaceAll: 'doMethodName:' with: 'doNewMethodName:'.
    "or just the first"
    newCode := code copyWithRegex: '^doMethodName\:' matchesReplacedWith: 'doNewMethodName:'.
    Something compile: newCode.
    

    使用AST

    sourceCode将代码作为字符串返回,这不是最好的操作。 如果您只想更改方法名称,可以在AST中重命名,例如

    tree := (Something>>#doMethodName:) parseTree.
    tree selector: 'doNewerMethodName:'.
    Something compile: tree newSource.