add method for retrieving builded source code as string: CustomSourceCodeBuilder >> buildedSource
authorJakub Nesveda <jakubnesveda@seznam.cz>
Mon, 19 May 2014 21:12:23 +0200
changeset 549 d34ea0b715b2
parent 548 bb96640904ac
child 550 7654392478ca
add method for retrieving builded source code as string: CustomSourceCodeBuilder >> buildedSource
CustomGetterMethodsCodeGenerator.st
CustomSimpleGetterMethodsCodeGenerator.st
CustomSourceCodeBuilder.st
CustomSourceCodeBuilderTests.st
CustomValueHolderGetterMethodsCodeGenerator.st
--- /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>"
+! !
+