I think that it makes sense to do it on ast level.

As you may know I’m working with SmallLint rules. And in a first place I want 
to get them working on CompiledMethods. But another issue is that you cannot 
run the rules on RBMethods or RGMethods.

Uko

> On 17 May 2015, at 16:21, Tudor Girba <[email protected]> wrote:
> 
> That is my suggestion, too. See the bug entry.
> 
> Now, we might choose to not do it at the CompiledMethod level, but in 
> RGMethodDefinition. That is why I would like to have a discussion about it. 
> 
> Cheers,
> Doru
> 
> On Sun, May 17, 2015 at 4:14 PM, Yuriy Tymchuk <[email protected] 
> <mailto:[email protected]>> wrote:
> Can we add an implementation for method and the one for class will reuse it?
> 
> Uko
> 
> Sent from my iPhone
> 
> On 17 May 2015, at 16:01, Tudor Girba <[email protected] 
> <mailto:[email protected]>> wrote:
> 
>> Indeed. I took again a look at it, and I found two bugs. The method looks 
>> like this:
>>  
>> TBehavior>>referencedClasses
>>      "Return the set of classes that are directly referenced by my methods"
>>      | answer |
>>      answer := Set new.
>>      self methods do: [ :cm |
>>              answer addAll: 
>>                      ( cm literals select: [ :l | l isKindOf: Association ] 
>> thenCollect: #value ) ].
>>      ^ answer
>> 
>> 
>> 1. The last literal of a method because the last literal always points to 
>> the class of the method.
>> 
>> Object methods collectAsSet: [ : cm | cm literals last value ]
>> ==>  "a Set(Object)"
>> 
>> So, we need to ignore the last literal
>> 
>> 
>> 2. The literals that are Associations can also point to other global 
>> literals that are not classes:
>> (ASTCache class>>#initialize) literals allButLast
>>      select: [ :l | l isKindOf: Association ] 
>>      thenCollect: #value
>> ==> "{Smalltalk}"
>> 
>> So, a better implementation for a method is:
>> 
>> 
>> (Object>>#actionMap)  literals allButLast
>>      select: [ :l | l value isKindOf: Class ] 
>>      thenCollect: #value
>> 
>> I opened a bug:
>> https://pharo.fogbugz.com/f/cases/15550/TBehavior-referencedClasses-is-wrong 
>> <https://pharo.fogbugz.com/f/cases/15550/TBehavior-referencedClasses-is-wrong>
>> 
>> Cheers,
>> Doru
>> 
>> 
>> 
>> On Sun, May 17, 2015 at 12:24 PM, Nicolai Hess <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> 
>> 2015-05-17 11:34 GMT+02:00 stepharo <[email protected] 
>> <mailto:[email protected]>>:
>> 
>> 
>> Le 17/5/15 11:07, Yuriy Tymchuk a écrit :
>> Hi, it want to rewrite the SmallLint rule which checks whether an abstract 
>> class is referenced. First question is whether the rule is really important, 
>> because sometimes there are abstract classes with some utility class 
>> methods, so maybe we should check whether they are “instantiated” with #new 
>> or #basicNew.
>> 
>> indeed this rule is not really revelant.
>> 
>> 
>> Now the real question is how do you get all classes referenced by a method. 
>> So instead of performing a rule check on a class, do it on a method and find 
>> if any of the accessed classes is abstract.
>> 
>> check the literal frame of the methods. When a method refers to a class the 
>> class binding is in the literal frame of the compiled method.
>> 
>> There is one method to get all referenced classes by a class
>> 
>> Morph referencedClasses -> MorphLostFocus MorphChanged PolygonMorph 
>> SystemWindow IdentityTransform GLMUIThemeExtraIcons RGMethodDefinition 
>> GTObjectPrinter .....
>> 
>> It is defined by TBehavior.
>> 
>> 
>> 
>> 
>>  
>> 
>> 
>> Uko
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> -- 
>> www.tudorgirba.com <http://www.tudorgirba.com/>
>> 
>> "Every thing has its own flow"
> 
> 
> 
> -- 
> www.tudorgirba.com <http://www.tudorgirba.com/>
> 
> "Every thing has its own flow"

Reply via email to