[Pharo-dev] [Ann] Class meta annotations

Henrik Sperre Johansen henrik.s.johansen at veloxit.no
Wed Oct 4 05:56:13 EDT 2017


Denis Kudriashov wrote
> 2017-10-04 9:48 GMT+02:00 Guillermo Polito <

> guillermopolito@

> >:
> 
>> I'd even call them First class pragmas from that point of view :P
>>
> 
> Yes.
> But we decided avoid pragma related names here. Because in future it can
> be
> possible to add normal pragmas into the class definition.
> 
> 
>>
>> I wonder what are the side-effects of instantiating the annotation
>> yourself in a method.
>>
>> specialAnnotationExample
>>     
> <classAnnotation>
>>     ^MySpecialAnnotation new
>>
> 
> I not understand the question. You supposed to return an *instance* of the
> annotation from the "annotating method".
> 
> 
>>
>> I mean, I understand we can use the class state to initialize the
>> annotation. But the fact that the annotation is cached after its first
>> instantiation means that the annotation will not necessarily evolve as
>> the
>> class evolves.
>>
> 
> Cache is updated after related class changes: method added, removed and so
> on (driven by PragmaCollector logic). So outdated annotations should not
> exist.
> Is it what you ask?
> 
> 
>> Do we want annotations to be stateless? Or depend only in literals?
>>
> 
> I want annotations to be any object with any state inside. Of course you
> will be restricted by what is visible from the class side. But in
> "annotating method" you can create any complex object (see below).
> 
> 
>> I wonder then what is the main difference with
>>
>> specialAnnotationExample
>>     
> <classAnnotation: MySpecialAnnotation>
>>
>> And what is the impact of having an annotation with parameters.
>>
> 
> Generally it is same like having pragma with parameters.
> But with annotation you are not restricted by literal objects. So
> annotation parameters can be anything.
> 
> And it is important feature for Commander.
> For example I need instance of KMKeyCombination to define shortcut for
> command. So I just use normal expression for this:
> 
> RenamePackageCommand class>>packageBrowserShortcutActivation
> <classAnnotation>
> ^CmdShortcutCommandActivation by: *$r meta* for: ClyPackageBrowserContext
> 
> 
> It will be very complicated to express it with method pragma and it will
> be
> restricted anyway.

Would it?
With pure method tags, you'd do something like:
SomeClass >> #renamePackage: aPackage
<command: 'Rename package'
 category: 'Package'
 order: 25
 shortcut: #($r meta)>
... method renaming package here ...

Then have different pragma traversers capable of creating the actual menus /
commands invoking such methods.
(And yes, all caching/invalidation would be the responsibility of the
traverser(s) if necessary, as usual)

Cheers,
Henry



--
Sent from: http://forum.world.st/Pharo-Smalltalk-Developers-f1294837.html




More information about the Pharo-dev mailing list