gui/PPDefineProdcutionRefactoring.st
changeset 336 ce1f4383ef4d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gui/PPDefineProdcutionRefactoring.st	Tue Mar 04 22:15:26 2014 +0100
@@ -0,0 +1,89 @@
+"{ Package: 'stx:goodies/petitparser/gui' }"
+
+Refactoring subclass:#PPDefineProdcutionRefactoring
+	instanceVariableNames:'class source protocols method'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitGui-Refactoring'
+!
+
+
+!PPDefineProdcutionRefactoring class methodsFor:'instance creation'!
+
+onClass: aClass source: aString protocols: anArray
+	^ self new
+		setClass: aClass;
+		setSource: aString;
+		setProtocols: anArray;
+		yourself
+! !
+
+!PPDefineProdcutionRefactoring methodsFor:'accessing'!
+
+selector
+	^ method selector
+! !
+
+!PPDefineProdcutionRefactoring methodsFor:'initialization'!
+
+setClass: aClass
+	class := self classObjectFor: aClass
+!
+
+setProtocols: anArray
+	protocols := anArray
+!
+
+setSource: aString
+	source := aString
+! !
+
+!PPDefineProdcutionRefactoring methodsFor:'preconditions'!
+
+preconditions
+	^ (self checkCompositeParser: class)
+		& (RBCondition withBlock: [ self checkSource ] errorString: 'Unable to parse source code')
+! !
+
+!PPDefineProdcutionRefactoring methodsFor:'private'!
+
+checkSource
+	| rewriter |
+	method := RBParser
+		parseMethod: source
+		onError: [ :string :position | ^ false ].
+	rewriter := self sourceRewriter.
+	[ rewriter executeTree: method ]
+		whileTrue: [ method := rewriter tree ].
+	^ method selector isUnary
+!
+
+sourceRewriter
+        ^ ParseTreeRewriter new
+                replace: '`#literal' with: '`#literal asParser' when: [ :node |
+                        (node isLiteralNode and: [ node value isString or: [ node value isCharacter ] ])
+                                and: [ (node parent isNil or: [ node parent isMessage not or: [ node parent selector ~= #asParser ] ])
+                                and: [ (node parents noneSatisfy: [ :each | each isBlock ]) ] ] ];
+                replaceMethod: '`@method: `@args | `@temps | ``@.statements. ``.statement `{ :node | node isReturn not }' 
+                        with: '`@method: `@args | `@temps | ``@.statements. ^ ``.statement';
+                yourself
+! !
+
+!PPDefineProdcutionRefactoring methodsFor:'transforming'!
+
+transform
+	(class definesInstanceVariable: method selector asString)
+		ifFalse: [ class addInstanceVariable: method selector asString ].
+	class compile: method newSource classified: protocols
+! !
+
+!PPDefineProdcutionRefactoring class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/goodies/petitparser/gui/PPDefineProdcutionRefactoring.st,v 1.1 2014-03-04 21:15:26 cg Exp $'
+!
+
+version_CVS
+    ^ '$Header: /cvs/stx/stx/goodies/petitparser/gui/PPDefineProdcutionRefactoring.st,v 1.1 2014-03-04 21:15:26 cg Exp $'
+! !
+