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]> 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 > > Cheers, > Doru > > > >> On Sun, May 17, 2015 at 12:24 PM, Nicolai Hess <[email protected]> wrote: >> >> >> 2015-05-17 11:34 GMT+02:00 stepharo <[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 > > "Every thing has its own flow"
