On 27 août 2010, at 12:05, Stéphane Ducasse wrote:


On Aug 26, 2010, at 6:55 PM, Simon Denier wrote:

I am reviewing the code relating to invocations in Famix. I noticed the following.


FamixInvocation>>to
^ self receiver

Receiver can be a variable or a class, but can also be nil. This seemed a reasonable default at one time, because we do not necessarily now which method we are invoking (but again, we may not have a clear receiver to refer too).

indeed an invocation is a message send.
and sometimes we know the method but we may also not

So it is for receiver: sometimes we know (self, ClassX, local variable...), sometimes we don't (chained calls)


However, with respect to other associations, consider:

FamixReference: from -> aMethod to -> aClass

how should I read it?

Verbatim (almost): a FamixReference is from a Method to a Class



FamixInheritance: form -> aClass to -> aClass
FamixAccess: from -> aMethod to -> aVariable
FamixInvocation: from -> aMethod to -> aVariable or a Class ???
(FamixExtension: from -> aPackage to -> aClass (well, this one is just future work :) )

It seems much more intuitive to have:
FamixInvocation: from -> aMethod to -> aMethod

indeed this is really the question of what is to compare to receiver.
I think that if you do not deprecate receiver then this sounds good


Yes we don't deprecate receiver.



Now of course, how do we refine that when we may have multiple candidates?

What would be a reasonable default?

FamixInvocation>>to
^ self candidates ifNotEmpty: [ self candidates any ]

now why to in such a case is not to methodS because taking one arbitrary looks to me like the worse we can do

That depends, if by any we mean first and if candidates came as sorted list of best candidates to worst candidates. But I don't think we should go in this direction.


or:
FamixInvocation>>to
^ self candidates


Actually, this one has my preference even if slightly different, because with the other choices we make hypothesis which are not clear.

FamixInvocation: from -> aMethod to -> a collection of Methods (candidates)

Yes!

That's probably that we will do, even if it breaks a bit the nice regularity of #from/#to in FamixAssociation.


The point of from/to is that you can write nice generic queries about associations.

You want classes which are referenced by a method?
aMethod outgoingReferences collect: [ :r | r to ]

You want super classes/interfaces?
aClass superInheritances collect: [ :i | i to ]

You want variables accessed from a method?
aMethod accesses collect: [ :a | a to ]


Same for incoming dependencies:

aClass incomingReferences collect: [ :r | r from ]   --> Methods referring to class
aClass subInheritances collect: [ :i | i from ]   --> subclasses
aVariable incomingAccesses collect: [ :a | a from ]  --> Methods accessing the variable
aMethod incomingInvocations collect: [ :i | a from ]  --> Methods invoking the method


Notice the nice regulariry, and that's something we want to use with Jannik to build reusable generic queries in a trait. That's the goal of MooseChef.


But...
aMethod outgoingInvocations collect: [ :i | a to ]  --> a collection of collections of Methods invoked by the method
So we have to flatten the collection at one point. Anyway, we will find a workaround...


So you know a bit more about ongoing work :)


--
 Simon