[Glass] RefactoringBrowser (RB) failing to correctly bind "self" in closures?

Mariano Martinez Peck via Glass glass at lists.gemtalksystems.com
Sun Nov 22 10:58:40 PST 2015


OK, I found the place Dale, and now my tests DO work :)
I replaced *"source evaluate"* with the below lines in bold.

RBPatternBlockNode >> createBlockFor: aRBBlockNode
  | source |
  self replacePatternNodesIn: aRBBlockNode.
  source := aRBBlockNode formattedCode.
*  ^ (source*
*    _compileInContext: self*
*    symbolList: GsSession currentSession symbolList*
*    oldLitVars: nil*
*    environmentId: 0) _executeInContext: self*

I will see if there are tests I can run from RB and next week I will fork
and commit fix.

Thanks,


On Fri, Nov 20, 2015 at 4:54 PM, Dale Henrichs via Glass <
glass at lists.gemtalksystems.com> wrote:

> In tODE, I've been able to make `self` resolve to a proper object by using
> the following to evaluate code:
>
>   | meth |
>   meth := self
>     _compileInContext: aContext
>     symbolList: symbolList
>     oldLitVars: litVarArray
>     environmentId: 0.
>   ^ meth _executeInContext: aContext
>
> `self` is bound to aContext ... presumable RB is passing in a `nil` arg
> there ....
>
> If you have fixes for RB, please fork the RB project[1] and share your
> fixes via a pull request.
>
> Dale
>
> [1]  https://github.com/dalehenrich/rb
>
> On 11/19/2015 12:17 PM, Mariano Martinez Peck via Glass wrote:
>
> Hi guys,
>
> I have some code that uses RB and such code works correctly in Pharo but
> it fails in GemStone. It seems a problem with a closure which in Pharo
> "self" resolves to the real object while in GemStone resolves to nil.
>
> The way to reproduce it is:
>
> *| tree rewriter |*
> *tree := RBParser parseMethod: 'DoIt ^ [:proxy | proxy at: #oldSelector.
> ]'.*
> *rewriter := RBParseTreeRewriter new. *
> *rewriter *
> * replace: ('`#oldSelector `{:node | node value isSymbol and: [node value
> matchesRegex: ''.*oldSelector.*''] }')*
> * with: ('`{RBLiteralNode value: (`#oldSelector value copyReplaceAll:
> ''oldSelector'' with: ''newSelector'') asSymbol }').*
> *rewriter executeTree: tree. *
> *rewriter tree newSource*
> And the problem is the line:
> *with: ('`{RBLiteralNode value: (`#oldSelector value copyReplaceAll:
> ''oldSelector'' with: ''newSelector'') asSymbol }').*
> which gets translated to:
> *[ :aDictionary | RBLiteralNode  value:    ((self lookupMatchFor:
> '`#oldSelector' in: aDictionary) value      copyReplaceAll: 'oldSelector'
>     with: 'newSelector') asSymbol ]*
> And the self there fails.
> Any idea how this is expected to work?
> Thanks in advance
>
> --
> Mariano
> http://marianopeck.wordpress.com
>
>
> _______________________________________________
> Glass mailing listGlass at lists.gemtalksystems.comhttp://lists.gemtalksystems.com/mailman/listinfo/glass
>
>
>
> _______________________________________________
> Glass mailing list
> Glass at lists.gemtalksystems.com
> http://lists.gemtalksystems.com/mailman/listinfo/glass
>
>


-- 
Mariano
http://marianopeck.wordpress.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gemtalksystems.com/mailman/private/glass/attachments/20151122/109dd2ef/attachment.html>


More information about the Glass mailing list