Hi,
I think I found a simple solution: the ability to reference any variable.
https://pharo.fogbugz.com/f/cases/19467/Metalinks-support-accessing-variables-for-arguments
This test shows how to use it for a temp:
testAccessTemp
| varNode instance |
varNode := (ReflectivityExamples>>#exampleAssignment) ast body
statements second.
link := MetaLink new
metaObject: self;
selector: #tagExec:;
arguments: {RBVariableNode named: #temp}.
varNode link: link.
self assert: varNode hasMetalink.
self assert: (tag isNil).
instance := ReflectivityExamples new .
self assert: (instance exampleAssignment = 3).
self assert: (tag = 3).
I have not yet tested it for any other example, but it should work for your
case, too, which would look
like this:
MetaLink new
metaObject: [ :surface :trachelCanvas |
surface clear: trachelCanvas color.
];
selector: #value:value:;
arguments: {RBVariableNode named: #surface . RBVariableNode named:
#trachelCanvas }.
control: #instead.
> On 12 Dec 2016, at 09:36, Marcus Denker <[email protected]> wrote:
>
> Hello,
>
> Not yet. It should be easy to add if we find a good API for it…
>
> I will work on it this week (I have blocked some time for RF related hacking).
>
> e.g I think we have to extend the syntax for reifications to use classes.
>
> something like:
>
> arguments: {RFTempReification named: #trachelCanvas};
>
> The current symbols then would be the same as using
>
> RFReification named: #object
>
> But subclasses can be used directly and parametrized.
>
> Marcus
>
>> On 5 Dec 2016, at 20:42, Peter Uhnak <[email protected]> wrote:
>>
>> Hi,
>>
>> what is the best way to access variables from within a metalink?
>>
>> for example I have a message send `surface clear` and I want to change it to
>> `surface clear: trachelCanvas color`.
>>
>> I can use #instVarNamed:
>>
>> ```
>> MetaLink new
>> metaObject: [ :object |
>> (object instVarNamed: #surface) clear: (object instVarNamed:
>> #trachelCanvas) color.
>> ];
>> selector: #value:;
>> arguments: #(object);
>> control: #instead.
>> ```
>>
>> but the above isn't exactly nice, plus it wouldn't work with temporary
>> variables.
>>
>> Thanks,
>> Peter
>>
>