--- a/DoWhatIMeanSupport.st Thu Mar 12 11:07:58 2015 +0100
+++ b/DoWhatIMeanSupport.st Wed Mar 18 19:18:31 2015 +0100
@@ -1695,24 +1695,27 @@
| nm nodeVal receiverClass nodeSelector nodeReceiver mthd|
aNode isBlock ifTrue:[
- ^ Block
+ ^ Block
].
(nodeVal := self valueOfNode:aNode) notNil ifTrue:[
- "/ knowing the value is always great!!
- ^ nodeVal class
+ "/ knowing the value is always great!!
+ ^ nodeVal class
].
aNode isVariable ifTrue:[
- nm := aNode name.
- nm = 'self' ifTrue:[
- classOrNil isNil ifTrue:[^ UndefinedObject].
- ^ classOrNil
- ].
- nm = 'super' ifTrue:[
- classOrNil isNil ifTrue:[^ Object].
- ^ classOrNil superclass
- ].
+ nm := aNode name.
+ nm = 'self' ifTrue:[
+ classOrNil isNil ifTrue:[^ UndefinedObject].
+ ^ classOrNil
+ ].
+ nm = 'super' ifTrue:[
+ classOrNil isNil ifTrue:[^ Object].
+ ^ classOrNil superclass
+ ].
+ nm = 'thisContext' ifTrue:[
+ ^ Context
+ ].
"/ classOrNil notNil ifTrue:[
"/ (classOrNil allInstVarNames includes:nm) ifTrue:[
@@ -1720,83 +1723,83 @@
"/ self breakPoint:#cg.
"/ ].
"/ ].
- ^ nil
+ ^ nil
].
aNode isMessage ifTrue:[
- nodeSelector := aNode selector.
- nodeReceiver := aNode receiver.
-
- "/ some hardwired knowlegde here
- receiverClass := self classOfNode:nodeReceiver.
- receiverClass notNil ifTrue:[
- nodeSelector == #class ifTrue:[
- ^ receiverClass class
- ].
-
- receiverClass isBehavior ifTrue:[
- mthd := receiverClass lookupMethodFor:nodeSelector.
- receiverClass isMeta ifTrue:[
- ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: nodeSelector ) ifTrue:[
- ^ receiverClass theNonMetaclass
- ].
- "/ if that method sends one of new/basicNew/new:/basicNew:, assume it returns an instance of itself
- mthd notNil ifTrue:[
- ( mthd sendsAny:#( #'new' #'basicNew' #'new:' #'basicNew:' )) ifTrue:[
- ^ receiverClass theNonMetaclass
- ].
- ].
- ] ifFalse:[
- mthd notNil ifTrue:[
- (ParseTreeSearcher methodIsSetterMethod:mthd) ifTrue:[
- ^ receiverClass.
- ]
- ]
- ]
- ].
- ].
- classOrNil notNil ifTrue:[
- (nodeReceiver isSelf and:[nodeSelector = #'class']) ifTrue:[
- ^ classOrNil class
- ].
- ].
-
- (nodeSelector = #'asFilename') ifTrue:[
- ^ Filename
- ].
- (nodeSelector = #'asOrderedCollection') ifTrue:[
- ^ OrderedCollection
- ].
- (nodeSelector = #'asArray') ifTrue:[
- ^ Array
- ].
- (nodeSelector = #'asSet') ifTrue:[
- ^ Set
- ].
- (nodeSelector = #'size') ifTrue:[
- ^ SmallInteger
- ].
-
- "/ some wellknown boolean returners (need better type inference here)
- (#( isNil notNil not isEmptyOrNil notEmptyOrNil notEmpty isEmpty
- isBehavior isMeta
- = ~= == ~~ > >= < <=
- includes: contains:
- and: or:
- exists atEnd
- ) includes:nodeSelector ) ifTrue:[
- ^ True "/ Boolean - not boolean; it does not contain the full protocol (would not find ifTrue:)
- ].
-
- ( #( + - * / // \\ ) includes:nodeSelector) ifTrue:[
- "/ assume numeric
- ^ Number
- ].
-
- ( #( class theMetaclass theNonMetaclass ) includes:nodeSelector) ifTrue:[
- "/ assume behavior
- ^ Behavior
- ].
+ nodeSelector := aNode selector.
+ nodeReceiver := aNode receiver.
+
+ "/ some hardwired knowlegde here
+ receiverClass := self classOfNode:nodeReceiver.
+ receiverClass notNil ifTrue:[
+ nodeSelector == #class ifTrue:[
+ ^ receiverClass class
+ ].
+
+ receiverClass isBehavior ifTrue:[
+ mthd := receiverClass lookupMethodFor:nodeSelector.
+ receiverClass isMeta ifTrue:[
+ ( #( #'new' #'basicNew' #'new:' #'basicNew:' #'with:' #'with:with:') includes: nodeSelector ) ifTrue:[
+ ^ receiverClass theNonMetaclass
+ ].
+ "/ if that method sends one of new/basicNew/new:/basicNew:, assume it returns an instance of itself
+ mthd notNil ifTrue:[
+ ( mthd sendsAny:#( #'new' #'basicNew' #'new:' #'basicNew:' )) ifTrue:[
+ ^ receiverClass theNonMetaclass
+ ].
+ ].
+ ] ifFalse:[
+ mthd notNil ifTrue:[
+ (ParseTreeSearcher methodIsSetterMethod:mthd) ifTrue:[
+ ^ receiverClass.
+ ]
+ ]
+ ]
+ ].
+ ].
+ classOrNil notNil ifTrue:[
+ (nodeReceiver isSelf and:[nodeSelector = #'class']) ifTrue:[
+ ^ classOrNil class
+ ].
+ ].
+
+ (nodeSelector = #'asFilename') ifTrue:[
+ ^ Filename
+ ].
+ (nodeSelector = #'asOrderedCollection') ifTrue:[
+ ^ OrderedCollection
+ ].
+ (nodeSelector = #'asArray') ifTrue:[
+ ^ Array
+ ].
+ (nodeSelector = #'asSet') ifTrue:[
+ ^ Set
+ ].
+ (nodeSelector = #'size') ifTrue:[
+ ^ SmallInteger
+ ].
+
+ "/ some wellknown boolean returners (need better type inference here)
+ (#( isNil notNil not isEmptyOrNil notEmptyOrNil notEmpty isEmpty
+ isBehavior isMeta
+ = ~= == ~~ > >= < <=
+ includes: contains:
+ and: or:
+ exists atEnd
+ ) includes:nodeSelector ) ifTrue:[
+ ^ True "/ Boolean - not boolean; it does not contain the full protocol (would not find ifTrue:)
+ ].
+
+ ( #( + - * / // \\ ) includes:nodeSelector) ifTrue:[
+ "/ assume numeric
+ ^ Number
+ ].
+
+ ( #( class theMetaclass theNonMetaclass ) includes:nodeSelector) ifTrue:[
+ "/ assume behavior
+ ^ Behavior
+ ].
].
^ nil
@@ -4764,10 +4767,10 @@
!DoWhatIMeanSupport class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.219 2015-02-13 22:48:09 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.220 2015-03-18 18:18:31 cg Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.219 2015-02-13 22:48:09 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.220 2015-03-18 18:18:31 cg Exp $'
! !