gui/PPDefineProdcutionRefactoring.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 30 Jul 2015 08:37:37 +0100
changeset 510 869853decf31
parent 336 ce1f4383ef4d
permissions -rw-r--r--
Tests refactoring - use generated test cases to make sure all posibilities are tested. Do not generate resource for all combinations, use PPCSetUpBeforeTearDownAfterResource instead that delegates parser compilation to the testcase itself (it calls it's #setUpBefore method).

"{ 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 $'
! !