翻訳対象を切り出す on OLPC
OLPC etoys用に書き直しました。Tweak-kedamaの一部としてParseNode中に実装されている一般化構文木トラバーサーを使っています。そのため、Squeakland上では動作しません。
(トラバーサーのコードが正しい限り)一応全ての種類ParseNodeを処理しているはずです。
あと少し手を加えれば、リテラル以外のレシーバーも集められます。
'From OLPC2.0 of ''24 October 2006'' [latest update: #1315] on 10 July 2007 at 12:47:51 pm'! !TranslatedReceiverFinder methodsFor: 'private' stamp: 'KR 7/10/2007 12:38'! searchParseNode: aParseNode addTo: aCollection (aParseNode isMemberOf: MessageNode) ifTrue: [ ((aParseNode selector isMemberOf: SelectorNode) and: [aParseNode selector key = #translated]) ifTrue: [ aCollection add: aParseNode. ]. ]. aParseNode isNil not ifTrue: [ aParseNode isLeaf not ifTrue: [ aParseNode getAllChildren do: [:child | self searchParseNode: child addTo: aCollection. ]. ]. ]. ! ! !TranslatedReceiverFinder methodsFor: 'as yet unclassified' stamp: 'KR 7/10/2007 12:44'! analyzeSenders | mrs results rr cls mn t o | mrs _ SystemNavigation default allCallsOn: #translated. results _ OrderedCollection new. mrs do: [:mr | rr _ OrderedCollection new. cls _ Smalltalk at: mr classSymbol. rr add: cls category. rr add: mr classSymbol. rr add: mr methodSymbol. mr classIsMeta ifTrue: [ mn _ cls class decompile: mr methodSymbol. ] ifFalse: [ mn _ cls decompile: mr methodSymbol. ]. o _ OrderedCollection new. t _ Set new. self searchParseNode: mn addTo: t. t do: [ :te | oe _ OrderedCollection new. (te receiver isMemberOf: LiteralNode) ifTrue: [ o add: te receiver key. ]. ]. rr add: o. results add: rr. ]. ^ results. ! !