--- 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