--- a/SmallSense__SmalltalkInferencer.st Fri Sep 05 16:10:56 2014 +0100
+++ b/SmallSense__SmalltalkInferencer.st Fri Sep 26 11:53:53 2014 +0100
@@ -587,21 +587,42 @@
visitMessageNode:aMessageNode
+ | selector |
+
super visitMessageNode: aMessageNode.
+ selector := aMessageNode selector.
"/ Some selectors are known / expected to return boolean
- (#( #== #~~ #= #~= #< #<= #=> #> #contains: includes: includesKey: #anySatisfy: #allSatisfy:) includes: aMessageNode selector) ifTrue:[
+ (#( #== #~~ #= #~= #< #<= #=> #> #contains: includes: includesKey: #anySatisfy: #allSatisfy:) includes: selector) ifTrue:[
aMessageNode inferedType: (Type withClass: Boolean).
^ self.
].
"/ Some selectors are known / expected to return some numerical values
- (#( #+ #- #* #/ #// #\\ ) includes: aMessageNode selector) ifTrue:[
+ (#( #+ #- #* #/ #// #\\ ) includes: selector) ifTrue:[
aMessageNode inferedType: (Type withClass: Number).
^ self.
].
+
+ "/ #new / #basicNew: conventionally returns an instance of the class, if receiver is a class.
+ (#(#new: #basicNew:) includes: selector) ifTrue:[
+ | rec type |
+ rec := aMessageNode receiver.
+ (rec isSelf and:[class isMetaclass]) ifTrue:[
+ type := Type withClass: class theNonMetaclass.
+ type trustfullnessAdd: 50.
+ aMessageNode inferedType: type.
+ ^self.
+ ].
+
+ type := aMessageNode receiver inferedType instanceSide.
+ aMessageNode inferedType: type.
+ ^self.
+ ].
+
"Created: / 05-08-2014 / 14:03:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 26-09-2014 / 11:20:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
visitUnaryNode:anObject