add method for retrieving builded source code as string: CustomSourceCodeBuilder >> buildedSource
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomGetterMethodsCodeGenerator.st Mon May 19 21:12:23 2014 +0200
@@ -0,0 +1,132 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomCodeGenerator subclass:#CustomGetterMethodsCodeGenerator
+ instanceVariableNames:'generateCommentsForGetters'
+ classVariableNames:''
+ poolDictionaries:''
+ category:''
+!
+
+!CustomGetterMethodsCodeGenerator class methodsFor:'queries'!
+
+availableInContext:aCustomContext
+
+ ^ aCustomContext selectedClasses notEmptyOrNil
+
+ "Modified: / 11-05-2014 / 17:37:08 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+availableInPerspective:aCustomPerspective
+
+ ^ aCustomPerspective isClassPerspective or: [
+ aCustomPerspective isInstanceVariablePerspective
+ ]
+
+ "Modified: / 11-05-2014 / 16:44:10 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomGetterMethodsCodeGenerator class methodsFor:'testing'!
+
+isAbstract
+ ^ self == CustomGetterMethodsCodeGenerator
+! !
+
+!CustomGetterMethodsCodeGenerator methodsFor:'accessing'!
+
+protocol
+ "Returns protocol name in which will belong getter method"
+
+ ^ 'accessing'
+
+ "Created: / 12-05-2014 / 23:26:24 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomGetterMethodsCodeGenerator methodsFor:'code generation'!
+
+sourceForClass: aClass variableName: aName
+ "Should return getter method source code for given class and variable name"
+
+ self subclassResponsibility
+
+ "Created: / 12-05-2014 / 22:44:09 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+ "Modified: / 19-05-2014 / 20:33:51 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomGetterMethodsCodeGenerator methodsFor:'executing'!
+
+buildInContext:aCustomContext
+ | selectedVariables |
+
+ selectedVariables := aCustomContext selectedVariables.
+
+ aCustomContext selectedClasses do: [ :class |
+ | variableNames |
+
+ variableNames := class instVarNames.
+
+ selectedVariables isEmptyOrNil ifFalse: [
+ variableNames := variableNames select: [ :variableName |
+ selectedVariables include: variableName
+ ]
+ ].
+
+ variableNames do:[ :variableName |
+ | method source |
+
+ source := self sourceForClass: class variableName: variableName.
+
+ method := builder createMethod.
+ method
+ class: class;
+ protocol: self protocol;
+ source: source
+ ]
+ ]
+
+ "Modified: / 17-05-2014 / 22:12:53 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomGetterMethodsCodeGenerator methodsFor:'initialization'!
+
+initialize
+
+ super initialize.
+ generateCommentsForGetters := userPreferences generateCommentsForGetters
+
+ "Created: / 12-05-2014 / 22:12:51 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomGetterMethodsCodeGenerator methodsFor:'protected'!
+
+methodNameFor: aVarName
+ "Creates getter method name for given variable name"
+
+ | methodName |
+
+ methodName := aVarName.
+ aVarName isUppercaseFirst ifTrue:[
+ (aVarName conform:[:ch | ch isLetter not or:[ch isUppercase]]) ifFalse:[ "/ allow all-uppercase for class-vars
+ methodName := methodName asLowercaseFirst.
+ ]
+ ].
+
+ ^ methodName
+
+ "Created: / 12-05-2014 / 22:04:21 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+varTypeOf: aVarName class: aClass
+ "Returns variable type as string for given variable name and class"
+
+ | classesClassVars |
+
+ classesClassVars := aClass theNonMetaclass allClassVarNames.
+
+ ^ (classesClassVars includes: aVarName)
+ ifTrue:['static']
+ ifFalse:[
+ (aClass isMeta ifTrue:['classInstVar'] ifFalse:['instance'])]
+
+ "Created: / 12-05-2014 / 21:40:49 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomSimpleGetterMethodsCodeGenerator.st Mon May 19 21:12:23 2014 +0200
@@ -0,0 +1,58 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomGetterMethodsCodeGenerator subclass:#CustomSimpleGetterMethodsCodeGenerator
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Refactoring-Custom'
+!
+
+!CustomSimpleGetterMethodsCodeGenerator class methodsFor:'accessing-presentation'!
+
+description
+
+ ^ 'Getter methods for selected instance variables'
+
+ "Modified: / 11-05-2014 / 16:37:33 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+label
+
+ ^ 'Getter Method(s)'
+
+ "Modified (format): / 11-05-2014 / 16:29:56 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomSimpleGetterMethodsCodeGenerator methodsFor:'code generation'!
+
+sourceForClass: aClass variableName: aName
+ "Returns simple getter method source code for given class and variable name"
+
+ | methodName comment methodBuilder |
+
+ methodName := self methodNameFor: aName.
+ comment := ''.
+
+ generateCommentsForGetters ifTrue:[
+ | varType |
+
+ varType := self varTypeOf: aName class: aClass.
+ comment := '"return the %1 instance variable ''%2'' (automatically generated)"'.
+ comment bindWith: varType with: aName.
+ ].
+
+ methodBuilder := builder methodBuilder.
+ methodBuilder
+ source: ('`@methodName
+
+ %1
+
+ ^ `variableName' bindWith: comment);
+ replace: '`@methodName' with: methodName asSymbol;
+ replace: '`variableName' with: aName asString.
+
+ ^ methodBuilder buildedSource
+
+ "Created: / 19-05-2014 / 20:32:34 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
--- a/CustomSourceCodeBuilder.st Mon May 19 21:09:16 2014 +0200
+++ b/CustomSourceCodeBuilder.st Mon May 19 21:12:23 2014 +0200
@@ -41,14 +41,11 @@
!CustomSourceCodeBuilder methodsFor:'accessing'!
-buildedMethodSource
- | method |
- method := RBParser parseRewriteMethod: source.
- method source: nil.
- method acceptVisitor: self.
- ^ method formattedCode.
+buildedSource
- "Created: / 29-04-2014 / 19:25:46 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+ self subclassResponsibility
+
+ "Created: / 18-05-2014 / 16:48:53 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!
change
@@ -62,6 +59,7 @@
!CustomSourceCodeBuilder methodsFor:'code creation'!
createClass
+ "Much like createMethod, but for class"
| classBuilder |
classBuilder := self class classBuilder.
@@ -71,18 +69,23 @@
"Created: / 09-04-2014 / 21:38:20 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
"Modified: / 29-04-2014 / 20:51:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+ "Modified (comment): / 18-05-2014 / 11:59:00 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!
createMethod
+ "
+ Creates, returns method builder with adding it to codeBuils
+ so code changes can be created withing this class at once -
+ see method createChange.
+ "
| methodBuilder |
- methodBuilder := self class methodBuilder.
- self fillDefaultValuesTo: methodBuilder.
+ methodBuilder := self methodBuilder.
codeBuilds add: methodBuilder.
^ methodBuilder
"Created: / 09-04-2014 / 23:54:03 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
- "Modified: / 29-04-2014 / 20:53:40 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+ "Modified (comment): / 18-05-2014 / 11:57:59 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
! !
!CustomSourceCodeBuilder methodsFor:'compiling'!
@@ -267,6 +270,20 @@
"Modified: / 29-04-2014 / 20:17:19 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
! !
+!CustomSourceCodeBuilder methodsFor:'instance creation'!
+
+methodBuilder
+ "Creates and returns method source code builder with default values"
+
+ | methodBuilder |
+
+ methodBuilder := self class methodBuilder.
+ self fillDefaultValuesTo: methodBuilder.
+ ^ methodBuilder
+
+ "Created: / 18-05-2014 / 11:41:10 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
!CustomSourceCodeBuilder methodsFor:'private'!
createChange
@@ -459,6 +476,21 @@
!CustomSourceCodeBuilder::Method methodsFor:'accessing'!
+buildedSource
+ "
+ Returns builded and formatted method source
+ code as string (with replacements and so on)
+ "
+
+ | method |
+ method := RBParser parseRewriteMethod: source.
+ method source: nil.
+ method acceptVisitor: self.
+ ^ method formattedCode
+
+ "Created: / 18-05-2014 / 16:48:27 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
category:aString
self protocol: aString
@@ -508,15 +540,7 @@
!CustomSourceCodeBuilder::Method methodsFor:'private'!
createChange
- | method |
-
- method := RBParser parseRewriteMethod: source.
- method source: nil.
- method acceptVisitor: self.
-
- Transcript showCR: 'Create change:'.
- Transcript showCR: 'Source: ', source.
- Transcript showCR: 'Method: ', (method formattedCode).
+ "Creates a refactory browser change (add method change)"
change := nil.
(classes length > 0) ifTrue: [
@@ -534,11 +558,11 @@
change addChange: (InteractiveAddMethodChange new
class: methodClass
protocol: protocol
- source: method formattedCode)
+ source: self buildedSource)
]
"Created: / 10-04-2014 / 00:03:34 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
- "Modified (format): / 02-05-2014 / 23:11:32 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+ "Modified (comment): / 18-05-2014 / 19:24:09 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
! !
!CustomSourceCodeBuilder::Method methodsFor:'queries'!
--- a/CustomSourceCodeBuilderTests.st Mon May 19 21:09:16 2014 +0200
+++ b/CustomSourceCodeBuilderTests.st Mon May 19 21:12:23 2014 +0200
@@ -230,6 +230,50 @@
"Modified: / 27-04-2014 / 17:17:26 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
!
+test_method_source_builded
+ | methodBuilder source |
+
+ methodBuilder := builder methodBuilder.
+ methodBuilder
+ source: '`@methodName
+
+ ^ `variableName';
+ replace: '`@methodName' with: #selector;
+ replace: '`variableName' with: 'aName'.
+
+ source := methodBuilder buildedSource.
+
+ self assert: source = 'selector
+ ^aName'.
+
+ "Created: / 18-05-2014 / 17:14:13 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+ "Modified: / 19-05-2014 / 19:01:29 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_method_source_builded_with_comment
+ | methodBuilder source |
+
+ methodBuilder := builder methodBuilder.
+ methodBuilder
+ source: '`@methodName
+
+ `#comment
+
+ ^ `variableName';
+ replace: '`@methodName' with: #selector;
+ replace: '`variableName' with: 'aName';
+ replace: '`#comment' with: '"a comment"'.
+
+ source := methodBuilder buildedSource.
+
+ self assert: source = 'selector
+ "a comment"
+
+ ^ aName'.
+
+ "Created: / 19-05-2014 / 18:57:25 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
test_one_method_for_multiple_classes
| classCollection classNames |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomValueHolderGetterMethodsCodeGenerator.st Mon May 19 21:12:23 2014 +0200
@@ -0,0 +1,67 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomGetterMethodsCodeGenerator subclass:#CustomValueHolderGetterMethodsCodeGenerator
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Refactoring-Custom'
+!
+
+!CustomValueHolderGetterMethodsCodeGenerator class methodsFor:'accessing-presentation'!
+
+description
+
+ ^ 'Getter methods with ValueHolder for selected instance variables'
+
+ "Created: / 19-05-2014 / 20:56:42 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+label
+
+ ^ 'Getter Method(s) for ValueHolder'
+
+ "Created: / 19-05-2014 / 20:56:20 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomValueHolderGetterMethodsCodeGenerator methodsFor:'accessing'!
+
+protocol
+ "Returns protocol name in which will belong getter method"
+
+ ^ 'aspects'
+
+ "Created: / 19-05-2014 / 20:59:12 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomValueHolderGetterMethodsCodeGenerator methodsFor:'code generation'!
+
+sourceForClass: aClass variableName: aName
+ "Returns simple getter method source code for given class and variable name"
+
+ | methodName comment methodBuilder |
+
+ methodName := self methodNameFor: aName.
+ comment := ''.
+
+ generateCommentsForGetters ifTrue:[
+ comment := '"return/create the ''%1'' value holder (automatically generated)"'.
+ comment bindWith: aName.
+ ].
+
+ methodBuilder := builder methodBuilder.
+ methodBuilder
+ source: ('`@methodName
+ %1
+
+ `variableName isNil ifTrue:[
+ `variableName := ValueHolder new.
+ ].
+ ^ `variableName' bindWith: comment);
+ replace: '`@methodName' with: methodName asSymbol;
+ replace: '`variableName' with: aName asString.
+
+ ^ methodBuilder buildedSource
+
+ "Created: / 19-05-2014 / 20:52:07 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+