SmallSense__SmalltalkInferencer.st
changeset 286 dc60bdb2fa92
parent 263 df89d5b4dfe0
child 302 44433b666576
--- 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