CustomMultiSetterMethodsCodeGenerator.st
changeset 614 66a50b63a877
child 628 6f639016753b
child 632 7a0f27afd9e0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomMultiSetterMethodsCodeGenerator.st	Sun Jul 13 22:12:01 2014 +0200
@@ -0,0 +1,95 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomAccessMethodsCodeGenerator subclass:#CustomMultiSetterMethodsCodeGenerator
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Refactoring-Custom'
+!
+
+!CustomMultiSetterMethodsCodeGenerator class methodsFor:'accessing-presentation'!
+
+description
+    "Returns more detailed description of the receiver"
+    
+    ^ 'Multi-Setter Method(s) for selected instance variables'
+
+    "Modified: / 13-07-2014 / 19:06:56 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+label
+    "Returns show label describing the receiver. This label
+     is used in UI as menu item/tree item label."
+    
+    ^ 'Multi-Setter Method(s)'
+
+    "Modified: / 13-07-2014 / 19:06:16 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomMultiSetterMethodsCodeGenerator class methodsFor:'queries'!
+
+availableInContext:aCustomContext
+
+    ^ aCustomContext selectedClasses notEmptyOrNil and: [ 
+        aCustomContext selectedVariables notEmptyOrNil and: [ 
+            aCustomContext selectedVariables size >= 2
+        ]
+    ]
+
+    "Created: / 13-07-2014 / 19:14:36 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomMultiSetterMethodsCodeGenerator methodsFor:'code generation'!
+
+createMultiSetterMethodForVariables: aVariableNames inClass: aClass
+    "Creates multi-setter access method for given variable names and class"
+
+    | setterSelector comment assignVariablesCode method |
+
+    setterSelector := ''.
+    comment := ''.
+    assignVariablesCode := ''.
+
+    userPreferences generateCommentsForSetters ifTrue: [ 
+        comment := '"set instance variables"'.
+    ].
+
+    aVariableNames do: [ :variableName |
+        | argumentName |
+
+        argumentName := variableName asString, 'Arg'.
+
+        setterSelector := setterSelector, variableName asString, ': ', argumentName, ' '.
+        assignVariablesCode := assignVariablesCode, variableName asString, ' := ', argumentName, '. '.
+    ].
+
+    method := builder createMethod.
+    method
+        class: aClass;
+        protocol: 'accessing';
+        source: '`@setterSelector
+            `"comment
+
+            `@assignVariablesCode
+        ';
+        replace: '`@setterSelector' with: setterSelector asSymbol;
+        replace: '`"comment' with: comment;
+        replace: '`@assignVariablesCode' with: assignVariablesCode.
+
+    "Created: / 13-07-2014 / 20:45:41 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomMultiSetterMethodsCodeGenerator methodsFor:'executing'!
+
+buildInContext: aCustomContext
+    "Creates multi-setter access methods for given context"
+
+    aCustomContext selectedClasses do:[ :class | 
+        self
+            createMultiSetterMethodForVariables: aCustomContext selectedVariables
+            inClass: class 
+    ].
+
+    "Modified: / 13-07-2014 / 20:45:41 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+