SmallSense__CompletionEngine.st
changeset 210 1922d415c704
parent 205 43bee6463c53
child 212 a2caebc602a7
--- a/SmallSense__CompletionEngine.st	Wed May 14 15:23:05 2014 +0100
+++ b/SmallSense__CompletionEngine.st	Thu May 15 10:40:02 2014 +0100
@@ -92,6 +92,159 @@
 
 !CompletionEngine methodsFor:'completion-individual'!
 
+addMethodsForType: type 
+    | classes seen |
+
+    classes := type classes.
+    "/ Hack for Boolean: ifTrue:iFalse: etc are not defined
+    "/ in Boolean ?!!?
+    (classes size == 1 and:[classes anElement == Boolean ]) ifTrue:[
+        classes := Array with: True with: False.
+    ].
+    classes size == 1 ifTrue:[
+        classes anElement == JavaPackage class ifTrue:[  
+            "/ Special hack for JAVA: for pattern `JAVA java lang reflect`
+            "/ complete all Java classes in that package
+            | node |
+
+            node := result context node.
+            node isUnaryMessage ifTrue:[
+                | package |
+                "/ Compute package prefix...
+
+                package := node selector.
+                node := node receiver.
+                [ node isUnaryMessage ] whileTrue:[
+                    package := node selector , '/' , package.
+                    node := node receiver.
+                ].
+                self addJavaClassesInPackage: package.
+                ^ self.
+            ]
+        ]
+    ].
+
+    seen := Set new.
+    classes do: [:each | 
+        | class |
+
+        class := each.
+        [ class notNil and:[(seen includes: class) not]] whileTrue: [
+            seen add: class.
+            "/ Now, special care for Java classes, sigh...
+            (class isMetaclass and:[class theNonMetaclass isJavaClass]) ifTrue:[
+                class theNonMetaclass selectorsAndMethodsDo: [:selector :met | 
+                    met isStatic ifTrue:[
+                        result add: (MethodPO 
+                                    name: selector
+                                    class: met mclass).
+                    ].
+                ].
+            ] ifFalse:[
+                class selectorsAndMethodsDo: [:selector :met | 
+                    met isSynthetic ifFalse:[
+                        result add: (MethodPO 
+                                    name: selector
+                                    class: met mclass).
+                    ]
+                ].
+            ].
+            class := class superclass.
+        ]
+    ].
+
+    "Created: / 26-11-2011 / 17:03:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 22-01-2014 / 19:48:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+addMethodsForType: type prefix: prefix stripOff: stripprefix
+
+    type isUnknownType ifFalse:[
+        self addMethodsForType:type stripOff: stripprefix.
+        
+        "/ If the type is union of more than 6 types, then
+        "/ assume that the inferencer is likely wrong.
+        "/ then, if the prefix is at least 3 chars,
+        "/ also add methods with that prefix.
+        
+        ((type classes size > 6) and:[ prefix size > 2 ]) ifTrue:[
+            self addMethodsStartingWith:prefix stripOff: stripprefix
+        ].
+    ] ifTrue:[
+        self addMethodsStartingWith:prefix stripOff: stripprefix  
+    ].
+
+    "Created: / 08-04-2014 / 21:04:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 09-04-2014 / 09:31:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+addMethodsForType: type stripOff: stripprefix     
+    | classes seen |
+
+    classes := type classes.
+    "/ Hack for Boolean: ifTrue:iFalse: etc are not defined
+    "/ in Boolean ?!!?
+    (classes size == 1 and:[classes anElement == Boolean ]) ifTrue:[
+        classes := Array with: True with: False.
+    ].
+    classes size == 1 ifTrue:[
+        classes anElement == JavaPackage class ifTrue:[  
+            "/ Special hack for JAVA: for pattern `JAVA java lang reflect`
+            "/ complete all Java classes in that package
+            | node |
+
+            node := result context node.
+            node isUnaryMessage ifTrue:[
+                | package |
+                "/ Compute package prefix...
+
+                package := node selector.
+                node := node receiver.
+                [ node isUnaryMessage ] whileTrue:[
+                    package := node selector , '/' , package.
+                    node := node receiver.
+                ].
+                self addJavaClassesInPackage: package.
+                ^ self.
+            ]
+        ]
+    ].
+
+    seen := Set new.
+    classes do: [:each | 
+        | class |
+
+        class := each.
+        [ class notNil and:[(seen includes: class) not]] whileTrue: [
+            seen add: class.
+            "/ Now, special care for Java classes, sigh...
+            (class isMetaclass and:[class theNonMetaclass isJavaClass]) ifTrue:[
+                class theNonMetaclass selectorsAndMethodsDo: [:selector :met | 
+                    met isStatic ifTrue:[
+                        result add: (MethodPO 
+                                    name: selector
+                                    class: met mclass).
+                    ].
+                ].
+            ] ifFalse:[
+                class selectorsAndMethodsDo: [:selector :met | 
+                    met isSynthetic ifFalse:[
+                        (stripprefix isNil or:[ selector size > stripprefix size and:[selector startsWith: stripprefix]]) ifTrue:[
+                            result add: (MethodPO 
+                                        name: selector
+                                        class: met mclass
+                                        stripOff: stripprefix).
+                        ].
+                    ]
+                ].
+            ].
+            class := class superclass.
+        ]
+    ].
+
+    "Created: / 08-04-2014 / 21:23:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 addMethodsStartingWith: prefix
     ^ self addMethodsStartingWith: prefix stripOff: nil filter: nil