added poor mans private classes support in AddClassChange
authorJakub Nesveda <jakubnesveda@seznam.cz>
Sun, 16 Nov 2014 18:06:36 +0100
changeset 752 516a6334136c
parent 750 1696b42da73d
child 753 3aef52eef51f
added poor mans private classes support in AddClassChange changed CustomNamespace to behave more like STX namespace added missing class API to RBAbstractClass so that it can work with native STX parser/compiler composite changes are now shared across model, refactoryBuilder and generator - so that correct order is preserved tests and fixes for CustomIsAbstractCodeGenerator work in progress - added some code selection refactorings
CustomAddClassChangeTests.st
CustomCodeGeneratorOrRefactoring.st
CustomCodeSelectionRefactoring.st
CustomCodeSelectionToResourceTranslation.st
CustomIsAbstractCodeGenerator.st
CustomIsAbstractCodeGeneratorTests.st
CustomNamespace.st
CustomNamespaceTests.st
CustomPrintCodeSelectionRefactoring.st
CustomRBAbstractClassTests.st
CustomRefactoryBuilder.st
CustomRefactoryBuilderTests.st
Make.proto
Make.spec
abbrev.stc
bc.mak
extensions.st
jn_refactoring_custom.st
libInit.cc
patches/Make.proto
patches/bc.mak
patches/extensions.st
patches/jn_refactoring_custom_patches.st
patches/patches.rc
refactoring_custom.rc
--- a/CustomAddClassChangeTests.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomAddClassChangeTests.st	Sun Nov 16 18:06:36 2014 +0100
@@ -50,6 +50,165 @@
 
 !CustomAddClassChangeTests methodsFor:'tests'!
 
+test_argumens_by_selector_parts_from_message_arguments_missing
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'Object subclass: SomeClass01 category: #SomeCategory01 '.
+    messageNode arguments: #().
+
+    expectedResult := Dictionary new.
+    actualResult := change argumensBySelectorPartsFromMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:12:19 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_argumens_by_selector_parts_from_message_none_argument
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'Object name'.
+
+    expectedResult := Dictionary new.
+    actualResult := change argumensBySelectorPartsFromMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:03:54 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_argumens_by_selector_parts_from_message_one_argument
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'Object subclass: SomeClass01'.
+
+    expectedResult := Dictionary new
+        at: #subclass: put: (messageNode arguments at: 1);
+        yourself.
+
+    actualResult := change argumensBySelectorPartsFromMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:05:30 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_argumens_by_selector_parts_from_message_selector_empty
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'Object subclass: SomeClass01 category: #SomeCategory01 '.
+    messageNode selectorParts: #().
+
+    expectedResult := Dictionary new
+        at: 1 put: (messageNode arguments at: 1);
+        at: 2 put: (messageNode arguments at: 2);
+        yourself.
+
+    actualResult := change argumensBySelectorPartsFromMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:10:50 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_argumens_by_selector_parts_from_message_selector_missing
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'Object subclass: SomeClass01 category: #SomeCategory01 '.
+    messageNode selectorParts: nil.
+
+    expectedResult := Dictionary new
+        at: 1 put: (messageNode arguments at: 1);
+        at: 2 put: (messageNode arguments at: 2);
+        yourself.
+
+    actualResult := change argumensBySelectorPartsFromMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:10:22 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_argumens_by_selector_parts_from_message_two_arguments
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'Object subclass: SomeClass01 category: #SomeCategory01 '.
+
+    expectedResult := Dictionary new
+        at: #subclass: put: (messageNode arguments at: 1);
+        at: #category: put: (messageNode arguments at: 2);
+        yourself.
+
+    actualResult := change argumensBySelectorPartsFromMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:09:31 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_fill_out_definition_ordinary_class
+
+    change definition: 'SomeObject01 subclass:#DummySubclass01
+        instanceVariableNames:''inst01 inst02''
+        classVariableNames:''Cls01 Cls02''
+        poolDictionaries:''pool01''
+        category:''Some-Category01'''.
+
+    change fillOutDefinition. 
+
+    self assert: #DummySubclass01 = (change changeClassName).
+    self assert: change privateInClassName isNil.
+    self assert: #SomeObject01 = (change superclassName).
+    self assert: #'Some-Category01' = (change category).
+    self assert: (#(inst01 inst02) asOrderedCollection) = (change instanceVariableNames).
+    self assert: (#(Cls01 Cls02) asOrderedCollection) = (change classVariableNames).
+    self assert: (#(pool01) asOrderedCollection) = (change poolDictionaryNames).
+
+    "Created: / 16-11-2014 / 16:12:45 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_fill_out_definition_private_class_01
+
+    change definition: 'Object subclass:#DummyPrivateClass01
+        instanceVariableNames:''''
+        classVariableNames:''''
+        poolDictionaries:''''
+        privateIn:Object'.
+
+    change fillOutDefinition. 
+
+    self assert: #Object::DummyPrivateClass01 = (change changeClassName).
+    self assert: #Object = (change privateInClassName).
+    self assert: #Object = (change superclassName).
+    self assert: #'' = (change category).
+    self assert: (OrderedCollection new) = (change instanceVariableNames).
+    self assert: (OrderedCollection new) = (change classVariableNames).
+    self assert: (OrderedCollection new) = (change poolDictionaryNames).
+
+    "Created: / 16-11-2014 / 15:56:30 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_fill_out_definition_private_class_02
+
+    change definition: 'SomeObject01 subclass:#DummyPrivateClass01
+        instanceVariableNames:''inst01 inst02''
+        classVariableNames:''Cls01 Cls02''
+        poolDictionaries:''pool01''
+        privateIn:SomeObject02'.
+
+    change fillOutDefinition. 
+
+    self assert: #SomeObject02::DummyPrivateClass01 = (change changeClassName).
+    self assert: #SomeObject02 = (change privateInClassName).
+    self assert: #SomeObject01 = (change superclassName).
+    self assert: #'' = (change category).
+    self assert: (#(inst01 inst02) asOrderedCollection) = (change instanceVariableNames).
+    self assert: (#(Cls01 Cls02) asOrderedCollection) = (change classVariableNames).
+    self assert: (#(pool01) asOrderedCollection) = (change poolDictionaryNames).
+
+    "Created: / 16-11-2014 / 16:08:16 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 test_get_and_set_package
 
     self assert: change package isNil.
@@ -61,6 +220,83 @@
     "Created: / 17-10-2014 / 09:06:07 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
+test_is_valid_message_name
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'Object subclass: SomeClass01 category: #SomeCategory01 '.
+
+    expectedResult := false.
+    actualResult := change isValidMessageName: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:15:00 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_is_valid_message_name_with_private_class
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'DummyObject01 subclass:#DummyPrivateClass01
+        instanceVariableNames:''''
+        classVariableNames:''''
+        poolDictionaries:''''
+        privateIn:DummyObject02'.
+
+    expectedResult := true.
+    actualResult := change isValidMessageName: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:16:27 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_is_valid_subclass_creation_message_for_private_class
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'DummyObject01 subclass:#DummyPrivateClass01
+        instanceVariableNames:''''
+        classVariableNames:''''
+        poolDictionaries:''''
+        privateIn:DummyObject02'.
+
+    expectedResult := true.
+    actualResult := change isValidSubclassCreationMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:23:59 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_is_valid_subclass_creation_message_for_private_class_wrong
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'DummyObject01 subclass:DummyPrivateClass01
+        instanceVariableNames:''''
+        classVariableNames:''''
+        poolDictionaries:''''
+        privateIn:DummyObject02'.
+
+    expectedResult := false.
+    actualResult := change isValidSubclassCreationMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:33:49 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_is_valid_subclass_creation_message_for_unkown_message
+    | expectedResult actualResult messageNode |
+
+    messageNode := RBParser parseExpression: 'DummyObject01 subclass:#DummyPrivateClass01'.
+
+    expectedResult := false.
+    actualResult := change isValidSubclassCreationMessage: messageNode.
+
+    self assert: expectedResult = actualResult
+
+    "Created: / 16-11-2014 / 15:34:38 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 test_primitive_execute_with_package
 
     | class |
--- a/CustomCodeGeneratorOrRefactoring.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomCodeGeneratorOrRefactoring.st	Sun Nov 16 18:06:36 2014 +0100
@@ -279,20 +279,24 @@
                 changeManager performChange: compositeChangeCollector
             ].
             compositeChangeCollector := nil.
+            self model changes: CompositeRefactoryChange new.
         ]
     ]
 
     "Created: / 31-05-2014 / 11:30:11 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 10:42:32 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 startCollectChanges
     (self canUseRefactoringSupport) ifTrue:[
         compositeChangeCollector isNil ifTrue:[
-            compositeChangeCollector := CompositeRefactoryChange new.
+            compositeChangeCollector := model changes.
             compositeChangeNesting := 0.
         ].
         compositeChangeNesting := compositeChangeNesting + 1.
     ]
+
+    "Modified: / 16-11-2014 / 10:43:06 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
 !CustomCodeGeneratorOrRefactoring methodsFor:'code generation'!
@@ -305,14 +309,6 @@
 
     "Created: / 23-08-2014 / 15:40:17 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
     "Modified: / 17-09-2014 / 22:53:48 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-!
-
-addChanges
-    self addChange:model changes.
-    self addChange:refactoryBuilder change
-
-    "Created: / 10-04-2014 / 23:26:12 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 21-09-2014 / 23:14:45 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
 !CustomCodeGeneratorOrRefactoring methodsFor:'compilation'!
@@ -357,6 +353,7 @@
     ].
 
     change := InteractiveAddMethodChange compile:(theCode asString) in:aClass classified:category.
+    change model: self model.
 
     "/ if collecting, add to changes (to be executed as one change at the end,
     "/ in order to have only one change in the undo-list (instead of many)
@@ -368,7 +365,7 @@
 
     "Modified: / 21-08-2006 / 18:39:06 / cg"
     "Modified (format): / 21-01-2012 / 10:40:59 / cg"
-    "Modified: / 21-09-2014 / 20:21:33 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 15-11-2014 / 17:32:18 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
 !CustomCodeGeneratorOrRefactoring methodsFor:'executing'!
@@ -393,12 +390,11 @@
     self validateInContext: aCustomContext.
     self buildInContext: aCustomContext.
 
-    self addChanges.
     self executeCollectedChangesNamed: self class description.
 
     "Created: / 19-03-2014 / 18:45:26 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
     "Modified: / 16-09-2014 / 11:04:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 12-11-2014 / 23:48:08 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 15-11-2014 / 22:18:34 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 executeInContextWithWaitCursor: aCustomContext
@@ -522,22 +518,25 @@
 
 setUpModel
 
-    model := CustomNamespace new.
-    model formatter: formatter.
-    model changeManager: changeManager.
+    model := CustomNamespace new
+        formatter: formatter;
+        changeManager: changeManager;
+        yourself
 
     "Created: / 09-06-2014 / 22:56:10 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 19-10-2014 / 19:40:21 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 10:41:34 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 setUpRefactoryBuilder
 
-    refactoryBuilder := CustomRefactoryBuilder new.
-    model formatter: formatter.
-    model changeManager: changeManager.
+    refactoryBuilder := CustomRefactoryBuilder new
+        formatter: formatter;
+        changeManager: changeManager;
+        model: model;  
+        yourself
 
     "Created: / 23-08-2014 / 00:05:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 19-10-2014 / 19:41:14 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 10:41:12 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
 !CustomCodeGeneratorOrRefactoring methodsFor:'private'!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomCodeSelectionRefactoring.st	Sun Nov 16 18:06:36 2014 +0100
@@ -0,0 +1,71 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomRefactoring subclass:#CustomCodeSelectionRefactoring
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Refactoring-Custom-Refactorings'
+!
+
+!CustomCodeSelectionRefactoring class methodsFor:'documentation'!
+
+documentation
+"
+    Template class for refactorings which operates on selected source code in the text editor.
+
+    [author:]
+        Jakub Nesveda <nesvejak@fit.cvut.cz>
+"
+! !
+
+!CustomCodeSelectionRefactoring class methodsFor:'queries'!
+
+availableInContext:aCustomContext
+    "Returns true if the generator/refactoring is available in given
+     context, false otherwise.
+     
+     Called by the UI to figure out what generators / refactorings
+     are available at given point. See class CustomContext for details."
+    | codes |
+
+    codes := aCustomContext selectedCodes.
+
+    codes notEmptyOrNil and: [ 
+        codes do: [ :selectedCode |
+            | sourceCode |
+
+            sourceCode := selectedCode selectedSourceCode.
+
+            (sourceCode notNil and: [ sourceCode size > 0 ]) ifTrue: [ 
+                ^ true
+            ]
+        ]
+    ].
+
+    ^ false
+
+    "Created: / 21-08-2014 / 23:28:25 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 05-11-2014 / 22:45:27 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+availableInPerspective:aCustomPerspective
+    "Returns true if the generator/refactoring is available in given
+     perspective, false otherwise.
+     
+     Called by the UI to figure out what generators / refactorings
+     to show"
+
+    ^ aCustomPerspective isCodeViewPerspective
+
+    "Created: / 21-08-2014 / 23:28:34 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 14-10-2014 / 10:29:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+isAbstract
+    "Return if this class is an abstract class.
+     True is returned here for myself only; false for subclasses.
+     Abstract subclasses must redefine again."
+
+    ^ self == CustomCodeSelectionRefactoring.
+! !
+
--- a/CustomCodeSelectionToResourceTranslation.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomCodeSelectionToResourceTranslation.st	Sun Nov 16 18:06:36 2014 +0100
@@ -1,6 +1,6 @@
 "{ Package: 'jn:refactoring_custom' }"
 
-CustomRefactoring subclass:#CustomCodeSelectionToResourceTranslation
+CustomCodeSelectionRefactoring subclass:#CustomCodeSelectionToResourceTranslation
 	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
@@ -41,49 +41,6 @@
     "Created: / 21-08-2014 / 23:43:03 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
-!CustomCodeSelectionToResourceTranslation class methodsFor:'queries'!
-
-availableInContext:aCustomContext
-    "Returns true if the generator/refactoring is available in given
-     context, false otherwise.
-     
-     Called by the UI to figure out what generators / refactorings
-     are available at given point. See class CustomContext for details."
-    | codes |
-
-    codes := aCustomContext selectedCodes.
-
-    codes notEmptyOrNil and: [ 
-        codes do: [ :selectedCode |
-            | sourceCode |
-
-            sourceCode := selectedCode selectedSourceCode.
-
-            (sourceCode notNil and: [ sourceCode size > 0 ]) ifTrue: [ 
-                ^ true
-            ]
-        ]
-    ].
-
-    ^ false
-
-    "Created: / 21-08-2014 / 23:28:25 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 05-11-2014 / 22:45:27 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-!
-
-availableInPerspective:aCustomPerspective
-    "Returns true if the generator/refactoring is available in given
-     perspective, false otherwise.
-     
-     Called by the UI to figure out what generators / refactorings
-     to show"
-
-    ^ aCustomPerspective isCodeViewPerspective
-
-    "Created: / 21-08-2014 / 23:28:34 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 14-10-2014 / 10:29:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-! !
-
 !CustomCodeSelectionToResourceTranslation methodsFor:'executing'!
 
 buildInContext:aCustomContext
--- a/CustomIsAbstractCodeGenerator.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomIsAbstractCodeGenerator.st	Sun Nov 16 18:06:36 2014 +0100
@@ -55,22 +55,22 @@
 !CustomIsAbstractCodeGenerator methodsFor:'executing'!
 
 buildInContext:aCustomContext
-    "Generates the code or perform the refactoring. This method
-     is guaranteed to be called only if #availableInContext: returns
-     true.
-     
-     Called by the UI when user want to perform the task a test"
-
     | classes |
 
     classes := aCustomContext selectedClasses.
-    classes do:[:class | 
-        (class canUnderstand: #isAbstract) ifFalse:[  
+    classes do:[:class |
+        | metaclass className |
+
+        metaclass := class theMetaclass.
+        className := class theNonMetaclass name.
+
+        (metaclass includesSelector: #isAbstract) ifFalse:[  
             self compile: ('isAbstract
-    ^ self == %1' bindWith: class) forClass: class class inCategory: 'testing'
+    ^ self == %1' bindWith: className) forClass: metaclass inCategory: 'testing'
         ].   
     ]
 
     "Created: / 16-09-2014 / 07:20:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:23:31 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomIsAbstractCodeGeneratorTests.st	Sun Nov 16 18:06:36 2014 +0100
@@ -0,0 +1,90 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomCodeGeneratorOrRefactoringTestCase subclass:#CustomIsAbstractCodeGeneratorTests
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Refactoring-Custom-Generators-Tests'
+!
+
+!CustomIsAbstractCodeGeneratorTests methodsFor:'accessing'!
+
+generatorOrRefactoring
+    ^ CustomIsAbstractCodeGenerator new
+! !
+
+!CustomIsAbstractCodeGeneratorTests methodsFor:'tests'!
+
+test_available_in_context
+
+    self deny: (generatorOrRefactoring class availableInContext:context).
+
+    context selectedClasses: (Array with: self class).
+
+    self assert: (generatorOrRefactoring class availableInContext:context).
+
+    "Modified (format): / 15-11-2014 / 15:51:33 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_available_in_perspective_class
+    
+    self assert: (generatorOrRefactoring class availableInPerspective: CustomPerspective classPerspective)
+
+    "Modified: / 15-11-2014 / 15:52:10 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_is_abstract_method_exists
+    | expectedSource metaclass class |
+
+    metaclass := model createClass
+        name: #DummyClass01;
+        compile;
+        theMetaclass.
+
+    metaclass compile: 'isAbstract ^ false'.
+
+    expectedSource := 'isAbstract ^ false'.
+
+    context selectedClasses: (Array with: metaclass).
+    generatorOrRefactoring executeInContext: context.  
+
+    class := Smalltalk at: #DummyClass01.
+    self assertClassMethodSource:expectedSource atSelector:#isAbstract forClass:class
+
+    "Created: / 16-11-2014 / 17:25:51 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_is_abstract_method_generated
+    |expectedSource|
+
+    expectedSource := 'isAbstract
+    ^ self == DummyClassForGeneratorTestCase'.
+
+    self executeGeneratorInContext:#classWithInstanceVariable. 
+
+    self assertClassMethodSource:expectedSource atSelector:#isAbstract
+
+    "Created: / 15-11-2014 / 15:53:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 15-11-2014 / 19:32:04 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_is_abstract_method_generated_for_metaclass
+    | expectedSource metaclass class |
+
+    metaclass := model createClass
+        name: #DummyClass01;
+        compile;
+        theMetaclass.
+
+    expectedSource := 'isAbstract
+    ^ self == DummyClass01'.
+
+    context selectedClasses: (Array with: metaclass).
+    generatorOrRefactoring executeInContext: context.  
+
+    class := Smalltalk at: #DummyClass01.
+    self assertClassMethodSource:expectedSource atSelector:#isAbstract forClass:class
+
+    "Created: / 16-11-2014 / 17:17:27 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
--- a/CustomNamespace.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomNamespace.st	Sun Nov 16 18:06:36 2014 +0100
@@ -11,6 +11,13 @@
 
 !CustomNamespace methodsFor:'accessing'!
 
+at: aClassName
+
+    ^ self classNamed: aClassName asSymbol
+
+    "Created: / 15-11-2014 / 17:30:04 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 changeManager
     ^ changeManager
 !
@@ -548,6 +555,14 @@
     "Created: / 30-08-2014 / 21:38:21 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
+!CustomNamespace methodsFor:'testing'!
+
+isNamespace
+    ^ true
+
+    "Created: / 15-11-2014 / 17:29:25 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
 !CustomNamespace class methodsFor:'documentation'!
 
 version_HG
--- a/CustomNamespaceTests.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomNamespaceTests.st	Sun Nov 16 18:06:36 2014 +0100
@@ -60,6 +60,33 @@
     "Modified: / 09-10-2014 / 10:47:56 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
+test_at_class_found
+    | expectedClass actualClass |
+
+    expectedClass := model createClass
+        name: #DummyClass01;
+        compile;
+        yourself.
+
+    actualClass := model at: #DummyClass01.
+    
+    self assert: expectedClass = actualClass
+
+    "Modified: / 16-11-2014 / 17:08:24 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_at_class_missing
+    | expectedClass actualClass |
+
+    expectedClass := nil.
+
+    actualClass := model at: #DummyClass01.
+    
+    self assert: expectedClass = actualClass
+
+    "Created: / 16-11-2014 / 17:08:44 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 test_chaining_api_create_class_and_method_with_default_class
     | class |
 
@@ -893,6 +920,13 @@
     "Modified: / 10-10-2014 / 15:48:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
+test_is_namespace
+    
+    self assert: model isNamespace
+
+    "Modified: / 16-11-2014 / 17:09:28 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 test_method_source_builded
     | method expectedSource actualSource |
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomPrintCodeSelectionRefactoring.st	Sun Nov 16 18:06:36 2014 +0100
@@ -0,0 +1,37 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomCodeSelectionRefactoring subclass:#CustomPrintCodeSelectionRefactoring
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Refactoring-Custom-Refactorings'
+!
+
+!CustomPrintCodeSelectionRefactoring class methodsFor:'accessing-presentation'!
+
+description
+
+    ^ 'Wraps selected source code with Transcript showCR: to be printed out'
+
+    "Modified: / 15-11-2014 / 16:21:56 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+label
+
+    ^ 'Wrap with Transcript showCR: '
+
+    "Modified: / 15-11-2014 / 16:21:05 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomPrintCodeSelectionRefactoring methodsFor:'executing - private'!
+
+buildInContext:aCustomContext
+
+    refactoryBuilder 
+          replace:'`@expression'
+          with:'(Transcript showCR: (`@expression) asString)'
+          inContext:aCustomContext
+
+    "Modified: / 15-11-2014 / 16:36:50 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
--- a/CustomRBAbstractClassTests.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomRBAbstractClassTests.st	Sun Nov 16 18:06:36 2014 +0100
@@ -242,6 +242,72 @@
     "Created: / 10-10-2014 / 11:56:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
+test_compiler_class_default
+    
+    self assert: Compiler == (rbClass compilerClass)
+
+    "Created: / 16-11-2014 / 16:44:26 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_compiler_class_java
+    | expectedCompiler actualCompiler |
+
+    rbClass realClass: JavaLanguage new.
+
+    expectedCompiler := JavaCompiler ? JavaCompilerForSmalltalkExtensionsOnly.
+    actualCompiler := rbClass compilerClass.
+    
+    self assert: expectedCompiler = actualCompiler
+
+    "Created: / 16-11-2014 / 16:45:33 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_compiler_class_javascript
+    | expectedCompiler actualCompiler |
+
+    rbClass realClass: STXJavaScriptLanguage new.
+
+    expectedCompiler := JavaScriptCompiler.
+    actualCompiler := rbClass compilerClass.
+    
+    self assert: expectedCompiler = actualCompiler
+
+    "Created: / 16-11-2014 / 16:54:54 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_compiler_class_smalltalk
+
+    rbClass realClass: self class.
+    
+    self assert: Compiler == (rbClass compilerClass)
+
+    "Created: / 16-11-2014 / 16:44:54 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_compiler_class_with_empty_real_class
+    | expectedCompiler actualCompiler |
+
+    expectedCompiler := Object compilerClass.
+    actualCompiler := rbClass compilerClass.
+    
+    self assert: expectedCompiler = expectedCompiler
+
+    "Created: / 15-11-2014 / 17:02:00 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_compiler_class_with_filled_real_class
+    | expectedCompiler actualCompiler |
+
+    expectedCompiler := JavaClass compilerClass.
+
+    rbClass realClass: JavaClass.  
+    actualCompiler := rbClass compilerClass.
+    
+    self assert: expectedCompiler = expectedCompiler
+
+    "Created: / 15-11-2014 / 17:02:10 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 test_inherits_from_model_class
     | class |
 
@@ -365,6 +431,13 @@
     "Created: / 02-11-2014 / 11:05:50 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
+test_is_loaded
+
+    self assert: rbClass isLoaded
+
+    "Created: / 15-11-2014 / 17:12:17 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 test_is_subclass_of_model_class
     | class |
 
@@ -693,6 +766,57 @@
     "Created: / 09-10-2014 / 23:37:01 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
+test_private_classes_at_found
+    | expectedClass actualClass |
+
+    model defineClass: 'Object subclass:#DummyPrivateClass01
+        instanceVariableNames:''''
+        classVariableNames:''''
+        poolDictionaries:''''
+        privateIn:Object'.
+
+    expectedClass := model classNamed: #Object::DummyPrivateClass01.
+    self assert: (expectedClass name) = #Object::DummyPrivateClass01. 
+
+    rbClass name: #Object.
+    actualClass := rbClass privateClassesAt: #DummyPrivateClass01.
+    
+    self assert: expectedClass = actualClass
+
+    "Created: / 16-11-2014 / 11:50:30 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_private_classes_at_not_found
+    | expectedClass actualClass |
+
+    expectedClass := nil.
+    actualClass := rbClass privateClassesAt: #None.
+    
+    self assert: expectedClass = actualClass
+
+    "Created: / 16-11-2014 / 11:41:11 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_private_classes_at_not_found_with_name
+    | expectedClass actualClass |
+
+    expectedClass := nil.
+    rbClass name: #DummyClass01.
+    actualClass := rbClass privateClassesAt: #None.
+    
+    self assert: expectedClass = actualClass
+
+    "Created: / 16-11-2014 / 11:43:06 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified (format): / 16-11-2014 / 16:25:34 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_real_shared_pool_names
+    
+    self assert: #() = (rbClass realSharedPoolNames)
+
+    "Created: / 16-11-2014 / 16:40:33 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 test_superclass_name
     | expectedClassName actualClassName |
 
@@ -708,6 +832,13 @@
     "Created: / 05-10-2014 / 00:16:02 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
+test_top_name_space
+
+    self assert: (rbClass topNameSpace) == (rbClass model)
+
+    "Created: / 16-11-2014 / 16:58:50 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 test_with_all_superclasses_do_for_one_superclass
     | expectedClassNames actualClassNames |
 
--- a/CustomRefactoryBuilder.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomRefactoryBuilder.st	Sun Nov 16 18:06:36 2014 +0100
@@ -64,27 +64,6 @@
 
 !CustomRefactoryBuilder methodsFor:'accessing'!
 
-change
-    "Returns single code change from collected code changes."
-
-    | change |
-
-    changes isEmpty ifTrue: [ 
-        ^ nil
-    ].
-
-    change := CompositeRefactoryChange new.
-
-    changes do: [ :codeChange | 
-        change addChange: codeChange
-    ].
-
-    ^ change
-
-    "Created: / 15-08-2014 / 00:45:10 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified (comment): / 17-08-2014 / 17:16:38 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-!
-
 changeManager
     ^ changeManager
 !
@@ -132,32 +111,30 @@
     so they take in effect ( method is added, class is renamed, ... )
     with respect to current change manager implementatin - see CustomChangeManager subclasses."
 
-    changeManager performChange: self change
+    model execute
 
     "Created: / 15-08-2014 / 00:45:10 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified (comment): / 19-10-2014 / 14:30:56 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:42:32 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 undoChanges
     "redo all changes made by execute method"
 
-    changeManager undoChanges
+    model undoChanges
 
     "Created: / 19-10-2014 / 14:57:49 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:42:55 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
-!CustomRefactoryBuilder methodsFor:'initialization'!
+!CustomRefactoryBuilder methodsFor:'initialize-release'!
 
 initialize
-    "Invoked when a new instance is created."
 
     super initialize.
     model := CustomNamespace new.
-    changeManager := model changeManager.
-    formatter := model formatter.
 
     "Created: / 15-08-2014 / 00:42:39 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 19-10-2014 / 19:03:30 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:33:43 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
 !CustomRefactoryBuilder methodsFor:'parsing'!
@@ -197,10 +174,10 @@
         category: aCategory;
         yourself.
 
-    changes add: change
+    model changes addChange: change
 
     "Created: / 08-11-2014 / 13:40:51 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 08-11-2014 / 16:14:53 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:35:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 executeReplace: searchPattern with: rewritePattern inCodeSelection: aCodeSelection
@@ -241,11 +218,11 @@
 
         change package: aCodeSelection selectedMethod package.  
 
-        changes add: change
+        model changes addChange: change
     ].
 
     "Created: / 24-08-2014 / 10:24:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 05-11-2014 / 23:08:31 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:36:07 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 executeReplace: searchPattern with: rewritePattern inMethod: aMethod
@@ -263,10 +240,10 @@
         in: aMethod mclass 
         classified: aMethod category.
 
-    changes add: change
+    model changes addChange: change
 
     "Created: / 17-08-2014 / 18:45:20 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 31-08-2014 / 17:41:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:37:22 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 initializeChange: aChangeClass
--- a/CustomRefactoryBuilderTests.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/CustomRefactoryBuilderTests.st	Sun Nov 16 18:06:36 2014 +0100
@@ -110,7 +110,6 @@
 
     expectedCategory := 'Category02'.
 
-    model execute.
     refactoryBuilder changeCategoryOf: class to: 'Category02'; execute.    
 
     actualCategory := (Smalltalk at: #DummyClassForTestCase01) category.
@@ -118,6 +117,7 @@
     self assert: expectedCategory = actualCategory
 
     "Created: / 08-11-2014 / 14:10:29 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:43:24 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 test_change_category_of_to_real_class
@@ -158,12 +158,14 @@
         with: '(resources string: `@code)'
         inCodeSelection: codeSelection.
 
-    actualSource := refactoryBuilder changes last source.
+    refactoryBuilder model changes do: [ :change |
+        actualSource := change source
+    ].
 
     self assertSource: expectedSource sameAs: actualSource.
 
     "Created: / 25-08-2014 / 21:53:39 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified: / 26-08-2014 / 22:35:26 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified (format): / 16-11-2014 / 17:52:26 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 test_execute_replace_with_in_code_selection_02
@@ -188,11 +190,14 @@
         with: '(resources string: `@code)'
         inCodeSelection: codeSelection.
 
-    actualSource := refactoryBuilder changes last source.
+    refactoryBuilder model changes do: [ :change |
+        actualSource := change source
+    ].
 
     self assertSource: expectedSource sameAs: actualSource.
 
     "Created: / 26-08-2014 / 22:37:59 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:52:41 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 test_execute_replace_with_in_code_selection_03
@@ -217,11 +222,14 @@
         with: '(resources string: `@code)'
         inCodeSelection: codeSelection.
 
-    actualSource := refactoryBuilder changes last source.
+    refactoryBuilder model changes do: [ :change |
+        actualSource := change source
+    ].
 
     self assertSource: expectedSource sameAs: actualSource.
 
     "Created: / 26-08-2014 / 22:41:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:52:53 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 test_execute_replace_with_in_code_selection_04
@@ -253,11 +261,14 @@
         with: '(resources string: `@code)'
         inCodeSelection: codeSelection.
 
-    actualSource := refactoryBuilder changes last source.
+    refactoryBuilder model changes do: [ :change |
+        actualSource := change source
+    ].
 
     self assertSource: expectedSource sameAs: actualSource.
 
     "Created: / 26-08-2014 / 22:52:47 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:53:11 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 test_initialize_change_for_add_class
--- a/Make.proto	Sat Nov 15 15:45:07 2014 +0100
+++ b/Make.proto	Sun Nov 16 18:06:36 2014 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/changes -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/helpers -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/parser -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/refactoring -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic3 -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libtool -I$(INCLUDE_TOP)/stx/libview -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/libwidg2
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/changes -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/helpers -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/parser -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/refactoring -I$(INCLUDE_TOP)/stx/goodies/sunit -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic3 -I$(INCLUDE_TOP)/stx/libcomp -I$(INCLUDE_TOP)/stx/libjava -I$(INCLUDE_TOP)/stx/libjava/tools -I$(INCLUDE_TOP)/stx/libjavascript -I$(INCLUDE_TOP)/stx/libtool -I$(INCLUDE_TOP)/stx/libview -I$(INCLUDE_TOP)/stx/libview2 -I$(INCLUDE_TOP)/stx/libwidg -I$(INCLUDE_TOP)/stx/libwidg2
 
 
 # if you need any additional defines for embedded C code,
@@ -165,7 +165,7 @@
 $(OUTDIR)CustomSubContext.$(O) CustomSubContext.$(H): CustomSubContext.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomContext.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomUserDialog.$(O) CustomUserDialog.$(H): CustomUserDialog.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomDialog.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomAccessMethodsCodeGenerator.$(O) CustomAccessMethodsCodeGenerator.$(H): CustomAccessMethodsCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)CustomCodeSelectionToResourceTranslation.$(O) CustomCodeSelectionToResourceTranslation.$(H): CustomCodeSelectionToResourceTranslation.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)CustomCodeSelectionRefactoring.$(O) CustomCodeSelectionRefactoring.$(H): CustomCodeSelectionRefactoring.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomIsAbstractCodeGenerator.$(O) CustomIsAbstractCodeGenerator.$(H): CustomIsAbstractCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomNewClassGenerator.$(O) CustomNewClassGenerator.$(H): CustomNewClassGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomReplaceIfNilWithIfTrueRefactoring.$(O) CustomReplaceIfNilWithIfTrueRefactoring.$(H): CustomReplaceIfNilWithIfTrueRefactoring.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -180,10 +180,12 @@
 $(OUTDIR)CustomChangeNotificationSetterMethodsCodeGenerator.$(O) CustomChangeNotificationSetterMethodsCodeGenerator.$(H): CustomChangeNotificationSetterMethodsCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomCodeGeneratorClassGenerator.$(O) CustomCodeGeneratorClassGenerator.$(H): CustomCodeGeneratorClassGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomNewClassGenerator.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator.$(O) CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator.$(H): CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomTestCaseCodeGenerator.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)CustomCodeSelectionToResourceTranslation.$(O) CustomCodeSelectionToResourceTranslation.$(H): CustomCodeSelectionToResourceTranslation.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeSelectionRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomDefaultGetterMethodsCodeGenerator.$(O) CustomDefaultGetterMethodsCodeGenerator.$(H): CustomDefaultGetterMethodsCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomLazyInitializationAccessMethodsCodeGenerator.$(O) CustomLazyInitializationAccessMethodsCodeGenerator.$(H): CustomLazyInitializationAccessMethodsCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomLazyInitializationGetterMethodsCodeGenerator.$(O) CustomLazyInitializationGetterMethodsCodeGenerator.$(H): CustomLazyInitializationGetterMethodsCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomMultiSetterMethodsCodeGenerator.$(O) CustomMultiSetterMethodsCodeGenerator.$(H): CustomMultiSetterMethodsCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)CustomPrintCodeSelectionRefactoring.$(O) CustomPrintCodeSelectionRefactoring.$(H): CustomPrintCodeSelectionRefactoring.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeSelectionRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomRefactoringClassGenerator.$(O) CustomRefactoringClassGenerator.$(H): CustomRefactoringClassGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomNewClassGenerator.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomSimpleAccessMethodsCodeGenerator.$(O) CustomSimpleAccessMethodsCodeGenerator.$(H): CustomSimpleAccessMethodsCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CustomSimpleGetterMethodsCodeGenerator.$(O) CustomSimpleGetterMethodsCodeGenerator.$(H): CustomSimpleGetterMethodsCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/Make.spec	Sat Nov 15 15:45:07 2014 +0100
+++ b/Make.spec	Sun Nov 16 18:06:36 2014 +0100
@@ -80,7 +80,7 @@
 	CustomSubContext \
 	CustomUserDialog \
 	CustomAccessMethodsCodeGenerator \
-	CustomCodeSelectionToResourceTranslation \
+	CustomCodeSelectionRefactoring \
 	CustomIsAbstractCodeGenerator \
 	CustomNewClassGenerator \
 	CustomReplaceIfNilWithIfTrueRefactoring \
@@ -95,10 +95,12 @@
 	CustomChangeNotificationSetterMethodsCodeGenerator \
 	CustomCodeGeneratorClassGenerator \
 	CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator \
+	CustomCodeSelectionToResourceTranslation \
 	CustomDefaultGetterMethodsCodeGenerator \
 	CustomLazyInitializationAccessMethodsCodeGenerator \
 	CustomLazyInitializationGetterMethodsCodeGenerator \
 	CustomMultiSetterMethodsCodeGenerator \
+	CustomPrintCodeSelectionRefactoring \
 	CustomRefactoringClassGenerator \
 	CustomSimpleAccessMethodsCodeGenerator \
 	CustomSimpleGetterMethodsCodeGenerator \
@@ -146,7 +148,7 @@
     $(OUTDIR_SLASH)CustomSubContext.$(O) \
     $(OUTDIR_SLASH)CustomUserDialog.$(O) \
     $(OUTDIR_SLASH)CustomAccessMethodsCodeGenerator.$(O) \
-    $(OUTDIR_SLASH)CustomCodeSelectionToResourceTranslation.$(O) \
+    $(OUTDIR_SLASH)CustomCodeSelectionRefactoring.$(O) \
     $(OUTDIR_SLASH)CustomIsAbstractCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomNewClassGenerator.$(O) \
     $(OUTDIR_SLASH)CustomReplaceIfNilWithIfTrueRefactoring.$(O) \
@@ -161,10 +163,12 @@
     $(OUTDIR_SLASH)CustomChangeNotificationSetterMethodsCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomCodeGeneratorClassGenerator.$(O) \
     $(OUTDIR_SLASH)CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator.$(O) \
+    $(OUTDIR_SLASH)CustomCodeSelectionToResourceTranslation.$(O) \
     $(OUTDIR_SLASH)CustomDefaultGetterMethodsCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomLazyInitializationAccessMethodsCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomLazyInitializationGetterMethodsCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomMultiSetterMethodsCodeGenerator.$(O) \
+    $(OUTDIR_SLASH)CustomPrintCodeSelectionRefactoring.$(O) \
     $(OUTDIR_SLASH)CustomRefactoringClassGenerator.$(O) \
     $(OUTDIR_SLASH)CustomSimpleAccessMethodsCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomSimpleGetterMethodsCodeGenerator.$(O) \
--- a/abbrev.stc	Sat Nov 15 15:45:07 2014 +0100
+++ b/abbrev.stc	Sun Nov 16 18:06:36 2014 +0100
@@ -81,7 +81,7 @@
 CustomVisitorCodeGeneratorAcceptVisitorTests CustomVisitorCodeGeneratorAcceptVisitorTests jn:refactoring_custom 'Interface-Refactoring-Custom-Generators-Tests' 1
 CustomVisitorCodeGeneratorTests CustomVisitorCodeGeneratorTests jn:refactoring_custom 'Interface-Refactoring-Custom-Generators-Tests' 1
 CustomAccessMethodsCodeGenerator CustomAccessMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
-CustomCodeSelectionToResourceTranslation CustomCodeSelectionToResourceTranslation jn:refactoring_custom 'Interface-Refactoring-Custom-Refactorings' 0
+CustomCodeSelectionRefactoring CustomCodeSelectionRefactoring jn:refactoring_custom 'Interface-Refactoring-Custom-Refactorings' 0
 CustomIsAbstractCodeGenerator CustomIsAbstractCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomNewClassGenerator CustomNewClassGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomReplaceIfNilWithIfTrueRefactoring CustomReplaceIfNilWithIfTrueRefactoring jn:refactoring_custom 'Interface-Refactoring-Custom-Refactorings' 0
@@ -96,10 +96,12 @@
 CustomChangeNotificationSetterMethodsCodeGenerator CustomChangeNotificationSetterMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomCodeGeneratorClassGenerator CustomCodeGeneratorClassGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
+CustomCodeSelectionToResourceTranslation CustomCodeSelectionToResourceTranslation jn:refactoring_custom 'Interface-Refactoring-Custom-Refactorings' 0
 CustomDefaultGetterMethodsCodeGenerator CustomDefaultGetterMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomLazyInitializationAccessMethodsCodeGenerator CustomLazyInitializationAccessMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomLazyInitializationGetterMethodsCodeGenerator CustomLazyInitializationGetterMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomMultiSetterMethodsCodeGenerator CustomMultiSetterMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
+CustomPrintCodeSelectionRefactoring CustomPrintCodeSelectionRefactoring jn:refactoring_custom 'Interface-Refactoring-Custom-Refactorings' 0
 CustomRefactoringClassGenerator CustomRefactoringClassGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomSimpleAccessMethodsCodeGenerator CustomSimpleAccessMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
 CustomSimpleGetterMethodsCodeGenerator CustomSimpleGetterMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom-Generators' 0
--- a/bc.mak	Sat Nov 15 15:45:07 2014 +0100
+++ b/bc.mak	Sun Nov 16 18:06:36 2014 +0100
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\changes -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\helpers -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\parser -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\refactoring -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic3 -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libtool -I$(INCLUDE_TOP)\stx\libview -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\libwidg2
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\changes -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\helpers -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\parser -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\refactoring -I$(INCLUDE_TOP)\stx\goodies\sunit -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic3 -I$(INCLUDE_TOP)\stx\libcomp -I$(INCLUDE_TOP)\stx\libjava -I$(INCLUDE_TOP)\stx\libjava\tools -I$(INCLUDE_TOP)\stx\libjavascript -I$(INCLUDE_TOP)\stx\libtool -I$(INCLUDE_TOP)\stx\libview -I$(INCLUDE_TOP)\stx\libview2 -I$(INCLUDE_TOP)\stx\libwidg -I$(INCLUDE_TOP)\stx\libwidg2
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
@@ -111,7 +111,7 @@
 $(OUTDIR)CustomSubContext.$(O) CustomSubContext.$(H): CustomSubContext.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomContext.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomUserDialog.$(O) CustomUserDialog.$(H): CustomUserDialog.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomDialog.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomAccessMethodsCodeGenerator.$(O) CustomAccessMethodsCodeGenerator.$(H): CustomAccessMethodsCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)CustomCodeSelectionToResourceTranslation.$(O) CustomCodeSelectionToResourceTranslation.$(H): CustomCodeSelectionToResourceTranslation.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)CustomCodeSelectionRefactoring.$(O) CustomCodeSelectionRefactoring.$(H): CustomCodeSelectionRefactoring.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomIsAbstractCodeGenerator.$(O) CustomIsAbstractCodeGenerator.$(H): CustomIsAbstractCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomNewClassGenerator.$(O) CustomNewClassGenerator.$(H): CustomNewClassGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomReplaceIfNilWithIfTrueRefactoring.$(O) CustomReplaceIfNilWithIfTrueRefactoring.$(H): CustomReplaceIfNilWithIfTrueRefactoring.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -126,10 +126,12 @@
 $(OUTDIR)CustomChangeNotificationSetterMethodsCodeGenerator.$(O) CustomChangeNotificationSetterMethodsCodeGenerator.$(H): CustomChangeNotificationSetterMethodsCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomCodeGeneratorClassGenerator.$(O) CustomCodeGeneratorClassGenerator.$(H): CustomCodeGeneratorClassGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomNewClassGenerator.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator.$(O) CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator.$(H): CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomTestCaseCodeGenerator.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)CustomCodeSelectionToResourceTranslation.$(O) CustomCodeSelectionToResourceTranslation.$(H): CustomCodeSelectionToResourceTranslation.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeSelectionRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomDefaultGetterMethodsCodeGenerator.$(O) CustomDefaultGetterMethodsCodeGenerator.$(H): CustomDefaultGetterMethodsCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomLazyInitializationAccessMethodsCodeGenerator.$(O) CustomLazyInitializationAccessMethodsCodeGenerator.$(H): CustomLazyInitializationAccessMethodsCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomLazyInitializationGetterMethodsCodeGenerator.$(O) CustomLazyInitializationGetterMethodsCodeGenerator.$(H): CustomLazyInitializationGetterMethodsCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomMultiSetterMethodsCodeGenerator.$(O) CustomMultiSetterMethodsCodeGenerator.$(H): CustomMultiSetterMethodsCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)CustomPrintCodeSelectionRefactoring.$(O) CustomPrintCodeSelectionRefactoring.$(H): CustomPrintCodeSelectionRefactoring.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeSelectionRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomRefactoringClassGenerator.$(O) CustomRefactoringClassGenerator.$(H): CustomRefactoringClassGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomNewClassGenerator.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomSimpleAccessMethodsCodeGenerator.$(O) CustomSimpleAccessMethodsCodeGenerator.$(H): CustomSimpleAccessMethodsCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CustomSimpleGetterMethodsCodeGenerator.$(O) CustomSimpleGetterMethodsCodeGenerator.$(H): CustomSimpleGetterMethodsCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomAccessMethodsCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/extensions.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/extensions.st	Sun Nov 16 18:06:36 2014 +0100
@@ -1,5 +1,32 @@
 "{ Package: 'jn:refactoring_custom' }"!
 
+!AddClassChange methodsFor:'private'!
+
+argumensBySelectorPartsFromMessage: aMessageNode
+    "Returns message arguments as dictionary indexed by selector part name.
+    For example: sel01:arg01 sel02:arg02 should be indexed 
+    'sel01:' -> 'arg01',
+    'sel02:' -> 'arg02' "
+    | argumensBySelectorParts selectorParts |
+
+    argumensBySelectorParts := Dictionary new.
+    selectorParts := aMessageNode selectorParts ? #().
+    aMessageNode arguments ? #() keysAndValuesDo: [ :key :argument |
+        | part |
+
+        part := selectorParts at: key ifAbsent: key.
+        part == key ifFalse: [ 
+            "We found appropriate selector part"
+            part := part value asSymbol
+        ].
+        argumensBySelectorParts at: part put: argument.    
+    ].
+
+    ^ argumensBySelectorParts
+
+    "Created: / 16-11-2014 / 14:47:55 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
 !AddClassChange methodsFor:'accessing'!
 
 package
@@ -18,6 +45,26 @@
     "Created: / 08-10-2014 / 20:07:05 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
+!AddClassChange methodsFor:'accessing'!
+
+privateInClassName
+    "Returns privateIn class name (when this class is a private class of another class)"
+
+    ^ self objectAttributeAt: #privateInClassName
+
+    "Created: / 16-11-2014 / 14:18:53 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!AddClassChange methodsFor:'accessing'!
+
+privateInClassName:aClassName
+    "see privateInClassName"
+
+    self objectAttributeAt: #privateInClassName put: aClassName
+
+    "Created: / 16-11-2014 / 14:18:34 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
 !AddMethodChange methodsFor:'accessing'!
 
 package: aPackageName    
@@ -90,6 +137,22 @@
     "Modified: / 10-10-2014 / 13:08:59 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
+!RBAbstractClass methodsFor:'accessing - classes'!
+
+compilerClass
+    "Answer a class suitable for compiling a source code in 'my' language"
+
+    ^ self realClass isNil ifTrue: [
+        "Return Smalltalk compiler, because we do not have multiple programming
+        support in this class (yet)"
+        self class compilerClass
+    ] ifFalse: [ 
+        self realClass compilerClass
+    ]
+
+    "Created: / 15-11-2014 / 16:58:35 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
 !RBAbstractClass methodsFor:'queries'!
 
 inheritsFrom: aClass
@@ -132,6 +195,17 @@
     "Created: / 30-09-2014 / 19:30:58 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
+!RBAbstractClass methodsFor:'autoload check'!
+
+isLoaded
+    "Returns true when the class is auto-loaded.
+    see Metaclass >> isLoaded"
+
+    ^ self class isLoaded
+
+    "Created: / 15-11-2014 / 17:11:11 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
 !RBAbstractClass methodsFor:'accessing'!
 
 isModelClass
@@ -253,6 +327,38 @@
 
 !RBAbstractClass methodsFor:'accessing'!
 
+privateClassesAt:aClassNameStringOrSymbol
+    "see Class >> privateClassesAt:"
+
+    | myName privateClassName |
+
+    myName := self name.
+    myName isNil ifTrue:[
+        "/ no name - there cannot be a corresponding private class
+        ^ nil
+    ].
+
+    privateClassName := (myName, '::' ,aClassNameStringOrSymbol) asSymbol.
+
+    ^ model classNamed: privateClassName.
+
+    "Created: / 15-11-2014 / 17:15:19 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 11:49:08 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!RBAbstractClass methodsFor:'accessing'!
+
+realSharedPoolNames
+    "see Behavior >> realSharedPoolNames"
+
+    ^ #()
+
+    "Created: / 15-11-2014 / 17:19:50 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 16:37:08 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!RBAbstractClass methodsFor:'accessing'!
+
 superclassName: aName
     "Assign superclass by its name"
 
@@ -281,6 +387,17 @@
     "Created: / 26-09-2014 / 16:36:22 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
+!RBAbstractClass methodsFor:'queries'!
+
+topNameSpace
+    "see ClassDescription >> topNameSpace"
+
+    ^ self model
+
+    "Created: / 15-11-2014 / 17:26:50 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified (comment): / 16-11-2014 / 16:58:00 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
 !RBAbstractClass methodsFor:'enumerating'!
 
 withAllSuperclassesDo:aBlock
--- a/jn_refactoring_custom.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/jn_refactoring_custom.st	Sun Nov 16 18:06:36 2014 +0100
@@ -65,6 +65,9 @@
     ^ #(
         #'stx:libbasic3'    "Change - referenced by CustomCodeGeneratorOrRefactoringTestCase>>assertSource:sameAs:"
         #'stx:libcomp'    "Parser - referenced by CustomNamespace>>createMethodImmediate:protocol:source:package:"
+        #'stx:libjava'    "JavaClass - referenced by CustomRBAbstractClassTests>>test_compiler_class_with_filled_real_class"
+        #'stx:libjava/tools'    "JavaCompiler - referenced by CustomRBAbstractClassTests>>test_compiler_class_java"
+        #'stx:libjavascript'    "JavaScriptCompiler - referenced by CustomRBAbstractClassTests>>test_compiler_class_javascript"
         #'stx:libview'    "WindowGroup - referenced by CustomCodeGeneratorOrRefactoring>>executeInContextWithWaitCursor:"
         #'stx:libwidg'    "DialogBox - referenced by CustomUserDialog>>initialize"
         #'stx:libwidg2'    "CheckBox - referenced by CustomDialog>>addCheckBoxOn:labeled:"
@@ -143,6 +146,7 @@
         (CustomCodeGeneratorUserPreferencesTests autoload)
         (CustomCodeSelectionToResourceTranslationTests autoload)
         (CustomDefaultGetterMethodsCodeGeneratorTests autoload)
+        (CustomIsAbstractCodeGeneratorTests autoload)
         (CustomLazyInitializationAccessMethodsCodeGeneratorTests autoload)
         (CustomLazyInitializationGetterMethodsCodeGeneratorTests autoload)
         CustomLocalChangeManager
@@ -173,7 +177,7 @@
         (CustomVisitorCodeGeneratorAcceptVisitorTests autoload)
         (CustomVisitorCodeGeneratorTests autoload)
         CustomAccessMethodsCodeGenerator
-        CustomCodeSelectionToResourceTranslation
+        CustomCodeSelectionRefactoring
         CustomIsAbstractCodeGenerator
         CustomNewClassGenerator
         CustomReplaceIfNilWithIfTrueRefactoring
@@ -188,10 +192,12 @@
         CustomChangeNotificationSetterMethodsCodeGenerator
         CustomCodeGeneratorClassGenerator
         CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator
+        CustomCodeSelectionToResourceTranslation
         CustomDefaultGetterMethodsCodeGenerator
         CustomLazyInitializationAccessMethodsCodeGenerator
         CustomLazyInitializationGetterMethodsCodeGenerator
         CustomMultiSetterMethodsCodeGenerator
+        CustomPrintCodeSelectionRefactoring
         CustomRefactoringClassGenerator
         CustomSimpleAccessMethodsCodeGenerator
         CustomSimpleGetterMethodsCodeGenerator
@@ -260,6 +266,14 @@
         RefactoryChange model
         RefactoryChange model:
         #'Tools::NewSystemBrowser' classMenuExtensionCustomRefactorings:
+        AddClassChange argumensBySelectorPartsFromMessage:
+        AddClassChange privateInClassName
+        AddClassChange privateInClassName:
+        RBAbstractClass compilerClass
+        RBAbstractClass isLoaded
+        RBAbstractClass privateClassesAt:
+        RBAbstractClass realSharedPoolNames
+        RBAbstractClass topNameSpace
     )
 ! !
 
--- a/libInit.cc	Sat Nov 15 15:45:07 2014 +0100
+++ b/libInit.cc	Sun Nov 16 18:06:36 2014 +0100
@@ -57,7 +57,7 @@
 _CustomSubContext_Init(pass,__pRT__,snd);
 _CustomUserDialog_Init(pass,__pRT__,snd);
 _CustomAccessMethodsCodeGenerator_Init(pass,__pRT__,snd);
-_CustomCodeSelectionToResourceTranslation_Init(pass,__pRT__,snd);
+_CustomCodeSelectionRefactoring_Init(pass,__pRT__,snd);
 _CustomIsAbstractCodeGenerator_Init(pass,__pRT__,snd);
 _CustomNewClassGenerator_Init(pass,__pRT__,snd);
 _CustomReplaceIfNilWithIfTrueRefactoring_Init(pass,__pRT__,snd);
@@ -72,10 +72,12 @@
 _CustomChangeNotificationSetterMethodsCodeGenerator_Init(pass,__pRT__,snd);
 _CustomCodeGeneratorClassGenerator_Init(pass,__pRT__,snd);
 _CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator_Init(pass,__pRT__,snd);
+_CustomCodeSelectionToResourceTranslation_Init(pass,__pRT__,snd);
 _CustomDefaultGetterMethodsCodeGenerator_Init(pass,__pRT__,snd);
 _CustomLazyInitializationAccessMethodsCodeGenerator_Init(pass,__pRT__,snd);
 _CustomLazyInitializationGetterMethodsCodeGenerator_Init(pass,__pRT__,snd);
 _CustomMultiSetterMethodsCodeGenerator_Init(pass,__pRT__,snd);
+_CustomPrintCodeSelectionRefactoring_Init(pass,__pRT__,snd);
 _CustomRefactoringClassGenerator_Init(pass,__pRT__,snd);
 _CustomSimpleAccessMethodsCodeGenerator_Init(pass,__pRT__,snd);
 _CustomSimpleGetterMethodsCodeGenerator_Init(pass,__pRT__,snd);
--- a/patches/Make.proto	Sat Nov 15 15:45:07 2014 +0100
+++ b/patches/Make.proto	Sun Nov 16 18:06:36 2014 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/browser -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/changes -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/helpers -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libcomp
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/browser -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/changes -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/helpers -I$(INCLUDE_TOP)/stx/goodies/refactoryBrowser/parser -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libcomp
 
 
 # if you need any additional defines for embedded C code,
--- a/patches/bc.mak	Sat Nov 15 15:45:07 2014 +0100
+++ b/patches/bc.mak	Sun Nov 16 18:06:36 2014 +0100
@@ -34,7 +34,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\browser -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\changes -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\helpers -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libcomp
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\browser -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\changes -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\helpers -I$(INCLUDE_TOP)\stx\goodies\refactoryBrowser\parser -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libcomp
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
--- a/patches/extensions.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/patches/extensions.st	Sun Nov 16 18:06:36 2014 +0100
@@ -2,6 +2,89 @@
 
 !AddClassChange methodsFor:'private'!
 
+fillOutDefinition
+        | parseTree receiver arguments argumensBySelectorParts |
+        parseTree := RBParser parseExpression: definition
+                                onError: [:str :pos | ^self parseDefinitionError].
+        parseTree isMessage ifFalse: [^self parseDefinitionError].
+        (self isValidSubclassCreationMessage: parseTree) 
+                ifFalse: [^self parseDefinitionError].
+        receiver := parseTree receiver.
+        superclassName := receiver isVariable 
+                                ifTrue: [receiver name asSymbol]
+                                ifFalse: [receiver value].
+        arguments := parseTree arguments.
+        className := arguments first value.
+        instanceVariableNames := self namesIn: (arguments at: 2) value.
+        classVariableNames := self namesIn: (arguments at: 3) value.
+        poolDictionaryNames := self namesIn: (arguments at: 4) value.
+
+        argumensBySelectorParts := self argumensBySelectorPartsFromMessage: parseTree.
+        (argumensBySelectorParts includesKey: #privateIn:) ifTrue: [
+            | argument |
+
+            argument := argumensBySelectorParts at: #privateIn:.
+            argument isVariable ifTrue: [ 
+                self privateInClassName: argument name asSymbol
+            ] ifFalse: [ 
+                self privateInClassName: argument value asSymbol
+            ].
+            className := (self privateInClassName, '::', className) asSymbol.
+            category := #''. "Inherited by owner - privateInClassName"
+        ] ifFalse: [ 
+            category := arguments size < 5 
+                                ifTrue: [#Unknown]
+                                ifFalse: [(arguments at: 5) value asSymbol]
+        ].
+
+    "Modified: / 16-11-2014 / 16:04:15 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!AddClassChange methodsFor:'testing'!
+
+isValidMessageName: aMessageNode 
+
+    ^ #(
+        #subclass:instanceVariableNames:classVariableNames:poolDictionaries: 
+        #subclass:instanceVariableNames:classVariableNames:poolDictionaries:category: 
+        #subclass:instanceVariableNames:classVariableNames:poolDictionaries:privateIn:
+        #variableByteSubclass:classVariableNames:poolDictionaries: 
+        #variableByteSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category: 
+        #variableSubclass:instanceVariableNames:classVariableNames:poolDictionaries: 
+        #variableSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:
+    ) 
+    includes: aMessageNode selector
+
+    "Modified (format): / 16-11-2014 / 12:35:29 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!AddClassChange methodsFor:'testing'!
+
+isValidSubclassCreationMessage: aMessageNode
+        | argumensBySelectorParts |
+
+        (aMessageNode receiver isVariable or: [aMessageNode receiver isLiteral]) 
+                ifFalse: [^false].
+
+        (self isValidMessageName: aMessageNode) ifFalse: [^false].
+
+        "Each argument should be literal except for privateIn:"
+        argumensBySelectorParts := self argumensBySelectorPartsFromMessage: aMessageNode.
+        argumensBySelectorParts keysAndValuesDo: [ :name :value |
+            value isLiteral ifFalse: [
+                name = #privateIn: ifFalse: [ 
+                    ^ false
+                ]
+            ]
+        ].
+
+        ^ true.
+
+    "Modified: / 16-11-2014 / 15:32:47 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!AddClassChange methodsFor:'private'!
+
 primitiveExecute
 
     package notNil ifTrue:[
@@ -41,8 +124,7 @@
                                 yourself]
                 ifFalse: [RemoveMethodChange remove: selector from: self changeClass]
 
-    "Modified: / 17-10-2014 / 10:22:09 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
-    "Modified (format): / 17-10-2014 / 22:09:45 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 16-11-2014 / 17:13:09 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
 !BrowserEnvironment methodsFor:'accessing'!
--- a/patches/jn_refactoring_custom_patches.st	Sat Nov 15 15:45:07 2014 +0100
+++ b/patches/jn_refactoring_custom_patches.st	Sun Nov 16 18:06:36 2014 +0100
@@ -52,6 +52,7 @@
 
     ^ #(
         #'stx:goodies/refactoryBrowser/browser'    "RefactoryBrowserPlatformSupport - referenced by BrowserEnvironment>>whichCategoryIncludes:"
+        #'stx:goodies/refactoryBrowser/parser'    "RBParser - referenced by AddClassChange>>fillOutDefinition"
         #'stx:libcomp'    "Parser - referenced by RBMethod>>info"
     )
 !
@@ -96,6 +97,9 @@
         AddMethodChange asUndoOperation
         BrowserEnvironment whichCategoryIncludes:
         RefactoryClassChange changeClass
+        AddClassChange fillOutDefinition
+        AddClassChange isValidMessageName:
+        AddClassChange isValidSubclassCreationMessage:
     )
 ! !
 
--- a/patches/patches.rc	Sat Nov 15 15:45:07 2014 +0100
+++ b/patches/patches.rc	Sun Nov 16 18:06:36 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "LibraryName\0"
       VALUE "ProductVersion", "6.2.4.1420\0"
-      VALUE "ProductDate", "Sat, 15 Nov 2014 14:42:58 GMT\0"
+      VALUE "ProductDate", "Sun, 16 Nov 2014 16:58:06 GMT\0"
     END
 
   END
--- a/refactoring_custom.rc	Sat Nov 15 15:45:07 2014 +0100
+++ b/refactoring_custom.rc	Sun Nov 16 18:06:36 2014 +0100
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "ProductName\0"
       VALUE "ProductVersion", "6.2.4.1420\0"
-      VALUE "ProductDate", "Sat, 15 Nov 2014 14:42:55 GMT\0"
+      VALUE "ProductDate", "Sun, 16 Nov 2014 16:58:03 GMT\0"
     END
 
   END