# HG changeset patch # User Claus Gittinger # Date 1393967726 -3600 # Node ID ce1f4383ef4dfc2d6fb29c6d4ebb75db8731c4bb # Parent 30d654399277bcb4eb89f7877adb7000de4198ee initial checkin diff -r 30d654399277 -r ce1f4383ef4d gui/PPDefineProdcutionRefactoring.st --- /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 $' +! ! +