'From Croquet1.0beta of 11 April 2006 [latest update: #2] on 18 July 2008 at 9:34:15 am'! Encoder subclass: #CEncoder instanceVariableNames: 'scriptee' classVariableNames: '' poolDictionaries: '' category: 'Tweak-Compiler'! !CAssignmentTile methodsFor: 'compiling' stamp: 'eem 7/18/2008 09:20'! asParseNode: encoder ^ MessageNode new receiver: (encoder encodeScriptObject: self receiver) selector: self selector arguments: {operator ifNil: [self expressionAsParseNode: encoder] ifNotNil: [self operatorAsParseNode: encoder]} precedence: 1 from: encoder! ! !CAssignmentTile methodsFor: 'compiling' stamp: 'eem 7/18/2008 09:21'! operatorAsParseNode: encoder ^ MessageNode new receiver: (property asParseNode: encoder) selector: operator arguments: {self expressionAsParseNode: encoder} precedence: operator precedence from: encoder! ! !CEncoder methodsFor: 'script compiling' stamp: 'eem 7/18/2008 09:18'! encodeScriptObject: anObject | lookupSpec | anObject == scriptee ifTrue: [^self encodeVariable: 'self']. ({nil. true. false} includes: anObject) ifTrue: [^self encodeVariable: anObject asString]. "Colors are not identified as literals but we allow them here" (anObject isLiteral or:[anObject isColor or:[anObject isPoint]]) ifTrue: [^self encodeLiteral: anObject]. lookupSpec := scriptee lookupSpecFor: anObject. self assert: [lookupSpec isLiteral]. self flag: #bf. "behaviour lookup should go away" ^MessageNode new receiver: (self encodeVariable: 'self') selector: (self encodeSelector: (anObject isBehavior ifTrue: [#lookupBehavior:] ifFalse: [#lookup:])) arguments: {self encodeLiteral: lookupSpec} precedence: 3 ! ! !CEncoder methodsFor: 'script compiling' stamp: 'bf 2/18/2005 14:13'! initScriptee: scriptedObject context: aContext notifying: req "initialize encoding for scriptedObject" scriptee := scriptedObject. ^self init: scriptedObject class context: aContext notifying: req! ! !CMessageTile methodsFor: 'compiling' stamp: 'eem 7/18/2008 09:21'! asParseNode: encoder | recNode | recNode := encoder encodeScriptObject: receiver. selector ifNil: [^ recNode]. ^ MessageNode new receiver: recNode selector: selector arguments: (arguments collect: [:each | each asParseNode: encoder]) precedence: selector precedence from: encoder! ! !COperatorTile methodsFor: 'compiling' stamp: 'eem 7/18/2008 09:21'! asParseNode: encoder | recNode | recNode := receiver asParseNode: encoder. selector ifNil: [^ recNode]. ^ MessageNode new receiver: recNode selector: selector arguments: (arguments collect: [:each | each asParseNode: encoder]) precedence: selector precedence from: encoder! ! !COperatorTile methodsFor: '*Tweak-DevTools-ParseBackedText' stamp: 'eem 7/18/2008 09:19'! dropBestOn: anAttribute "Return true if I can always replace a ParseNode of the kind held by this attribute." ^ (anAttribute parseNode isKindOf: LeafNode) and: [ (anAttribute parseNode class == SelectorNode) not]! ! !CParseNodeAttribute methodsFor: 'as yet unclassified' stamp: 'eem 7/18/2008 09:19'! shortestExpresionNodeIn: allAttList "Return the smallest expression that this run is part of." | shortList shortest done | shortList := allAttList select: [:anAtt | ((anAtt parseNode isKindOf: LeafNode) and: [ (anAtt parseNode class == SelectorNode) not]) ifTrue: [^ anAtt]. "a leaf node is always best" anAtt parseNode class == MessageNode]. shortList size = 0 ifTrue: [^ nil]. "in regular text or non-expression" shortest := shortList first. "an attribute" "If we had parent pointers on parseNodes, we would not have to do this!!" [done := true. shortList allButFirst do: [:anAtt | "See if this one is shorter" shortest parseNode receiver == anAtt parseNode ifTrue: [ shortest := anAtt. done := false]. shortest parseNode arguments do: [:anArgNode | anAtt parseNode == anArgNode ifTrue: [ shortest := anAtt. done := false]]]. done] whileFalse. ^ shortest parseNode selector key precedence < 3 ifTrue: [shortest] ifFalse: [nil]! ! !CPropertyTile methodsFor: 'compiling' stamp: 'eem 7/18/2008 09:20'! asParseNode: encoder | recNode | recNode := encoder encodeScriptObject: receiver. property == nil ifTrue: [^ recNode]. ^ MessageNode new receiver: recNode selector: (encoder encodeSelector: property) arguments: #() precedence: 1! ! !CPropertyTile methodsFor: '*Tweak-DevTools-ParseBackedText' stamp: 'eem 7/18/2008 09:19'! dropBestOn: anAttribute "Return true if I can always replace a ParseNode of the kind held by this attribute." ^ (anAttribute parseNode isKindOf: LeafNode) and: [ (anAttribute parseNode class == SelectorNode) not]! ! !CSequenceTile methodsFor: 'compiling' stamp: 'eem 7/18/2008 09:11'! asParseNode: encoder ^BlockNode new arguments: #() statements: (statements collect: [:each | each asParseNode: encoder]) returns: false from: encoder! ! !CScriptorTile methodsFor: 'compiling' stamp: 'eem 7/18/2008 09:21'! asParseNode: encoder ^ MethodNode new selector: selector arguments: #() precedence: selector precedence temporaries: #() block: (super asParseNode: encoder) returnNilIfNoOther encoder: encoder primitive: 0 properties: properties copy "(!!)"! ! !CValueTile methodsFor: '*Tweak-DevTools-ParseBackedText' stamp: 'eem 7/18/2008 09:20'! dropBestOn: anAttribute "Return true if I can always replace a ParseNode of the kind held by this attribute." ^ (anAttribute parseNode isKindOf: LeafNode) and: [ (anAttribute parseNode class == SelectorNode) not]! !