work in progress - create selection replace API in CustomRefactoryBuilder and CustomCodeSelectionToResourceTranslation
authorJakub Nesveda <jakubnesveda@seznam.cz>
Mon, 25 Aug 2014 23:45:19 +0200
changeset 645 38a38c28ddb1
parent 644 6dda0e1a5a72
child 646 8338755e1088
child 650 7514c13d6dd8
work in progress - create selection replace API in CustomRefactoryBuilder and CustomCodeSelectionToResourceTranslation
CustomCodeSelectionToResourceTranslation.st
CustomCodeSelectionToResourceTranslationTests.st
CustomRefactoryBuilder.st
CustomRefactoryBuilderTests.st
Make.proto
Make.spec
abbrev.stc
bc.mak
jn_refactoring_custom.st
libInit.cc
refactoring_custom.rc
--- a/CustomCodeSelectionToResourceTranslation.st	Sun Aug 24 23:12:39 2014 +0200
+++ b/CustomCodeSelectionToResourceTranslation.st	Mon Aug 25 23:45:19 2014 +0200
@@ -72,11 +72,18 @@
 buildInContext:aCustomContext
     "Performs a refactoring within given context scope"
 
-    refactoryBuilder
-        replace: '``@expression'
-        with: '(resources string: (``@expression))'
-        inCodes: aCustomContext selectedCodes
+    refactoryBuilder 
+          replace:'``@expression'
+          with:'(resources string: (``@expression))'
+          inCodeSelections:aCustomContext selectedCodes
 
     "Created: / 23-08-2014 / 00:16:58 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
+!CustomCodeSelectionToResourceTranslation class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomCodeSelectionToResourceTranslationTests.st	Mon Aug 25 23:45:19 2014 +0200
@@ -0,0 +1,48 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomCodeGeneratorOrRefactoringTestCase subclass:#CustomCodeSelectionToResourceTranslationTests
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Refactoring-Custom-Tests'
+!
+
+!CustomCodeSelectionToResourceTranslationTests methodsFor:'accessing'!
+
+generatorOrRefactoring
+    ^ CustomCodeSelectionToResourceTranslation new
+! !
+
+!CustomCodeSelectionToResourceTranslationTests methodsFor:'tests'!
+
+test_code_selection_replaced_by_resource_translation_01
+    | expectedSource originalSource codeSelection class |
+
+    originalSource := 'selector
+    self information: ''Translate this''.
+    ^ self.'.
+
+    class := codeBuilder createClassImmediate: 'DummyClassForTestCase01' instanceVariableNames: 'resources'.
+    codeBuilder createMethodImmediate: class source: originalSource.
+
+    codeSelection := CustomSourceCodeSelection new.
+    codeSelection
+        currentSourceCode: originalSource;
+        selectedClass: class;
+        selectedInterval: (32 to: 48);
+        selectedMethod: (class compiledMethodAt: #selector);
+        selectedSelector: #selector.
+
+    context selectedCodes: (Array with: codeSelection).  
+    generatorOrRefactoring executeInContext: context.  
+
+    expectedSource := 'selector
+    self information: (resources string: (''Translate this'')).
+    ^ self.'.
+
+    self assertMethodSource:expectedSource atSelector:#selector
+
+    "Created: / 23-08-2014 / 20:09:06 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 24-08-2014 / 09:52:39 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
--- a/CustomRefactoryBuilder.st	Sun Aug 24 23:12:39 2014 +0200
+++ b/CustomRefactoryBuilder.st	Mon Aug 25 23:45:19 2014 +0200
@@ -51,6 +51,13 @@
     changeManager := something.
 !
 
+parser
+
+    ^ RBParser
+
+    "Created: / 24-08-2014 / 23:36:55 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 searcher
 
     ^ ParseTreeSearcher new
@@ -91,8 +98,61 @@
     "Created: / 15-08-2014 / 00:42:39 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 ! !
 
+!CustomRefactoryBuilder methodsFor:'parsing'!
+
+parseExpression: aSourceCode
+
+    ^ self parser parseExpression: aSourceCode onError: [ :string :pos |
+        self parser parseMethod: aSourceCode onError: [ :string :pos |
+            self error: 'Could not parse ', string, ' at pos ', pos asString
+        ]
+    ]
+
+    "Created: / 25-08-2014 / 22:34:49 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+parseMethod: aSourceCode
+
+    ^ self parser parseMethod: aSourceCode onError: [ :string :pos |
+        self parser parseExpression: aSourceCode onError: [ :string :pos |
+            self error: 'Could not parse ', string, ' at pos ', pos asString
+        ]
+    ]
+
+    "Created: / 25-08-2014 / 22:35:32 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
 !CustomRefactoryBuilder methodsFor:'refactory-changes'!
 
+executeReplace: searchPattern with: rewritePattern inCodeSelection: aCodeSelection
+
+    | newTree change parseTree selectedParseTree newSelectedParseTree |
+
+    selectedParseTree := (self parseExpression: aCodeSelection selectedSourceCode) formattedCode.
+
+    newSelectedParseTree := (CustomParseTreeRewriter new)
+        replace: searchPattern with: rewritePattern;
+        executeTree: selectedParseTree;
+        tree.
+
+    parseTree := self parseMethod: aCodeSelection currentSourceCode.
+    newTree := CustomParseTreeRewriter 
+        replace: aCodeSelection selectedSourceCode
+        with: newSelectedParseTree formattedCode
+        in: parseTree
+        onInterval: aCodeSelection selectedInterval.
+
+    change := InteractiveAddMethodChange
+        compile: newTree newSource 
+        in: aCodeSelection selectedMethod mclass 
+        classified: aCodeSelection selectedMethod category.
+
+    changes add: change
+
+    "Created: / 24-08-2014 / 10:24:52 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 25-08-2014 / 23:33:15 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 executeReplace: searchPattern with: rewritePattern inMethod: aMethod
     "Executes replace in a method source and then creates a method change"
 
@@ -113,6 +173,22 @@
     "Created: / 17-08-2014 / 18:45:20 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
+replace:searchPattern with:rewritePattern inCodeSelections:aCustomContext 
+    "Searches for given pattern in methods source code and if source code matches then executes replacement"
+    
+    self 
+        search:searchPattern
+        inCodeSelections:aCustomContext selectedCodes
+        withResultDo:[:codeSelection | 
+            self 
+                executeReplace:searchPattern
+                with:rewritePattern
+                inCodeSelection:codeSelection
+        ]
+
+    "Created: / 24-08-2014 / 10:10:40 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
 replace: searchPattern with: rewritePattern inContext: aCustomContext
     "Searches for given pattern in methods source code and if source code matches then executes replacement"
 
@@ -159,11 +235,23 @@
     "Created: / 17-08-2014 / 16:21:22 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
-search: searchPattern inCodes: aCodeSelectionCollection withResultDo: aBlock
+search:searchPattern inCodeSelections:aCodeSelectionCollection withResultDo:aBlock 
+
+    aCodeSelectionCollection do:[ :codeSelection | 
+        | parseTree selectedCode |
 
-    "To be implemented"
+        selectedCode := codeSelection selectedSourceCode.
+        parseTree := self parseExpression: selectedCode.
+        "/ Transcript showCR: 'PP', parseTree asString.  
+        (self searcher)
+            matches: searchPattern do: [ :aNode :answer |
+                aBlock value: codeSelection  
+            ];
+            executeTree: parseTree
+    ].
 
     "Created: / 21-08-2014 / 21:22:13 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 25-08-2014 / 22:36:07 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
 !
 
 search: searchPattern inContext: aCustomContext withResultDo: aBlock
@@ -171,9 +259,9 @@
 
     aCustomContext selectedCodes notNil ifTrue: [ 
         self 
-            search: searchPattern 
-            inCodes: aCustomContext selectedCodes
-            withResultDo: aBlock
+              search:searchPattern
+              inCodeSelections:aCustomContext selectedCodes
+              withResultDo:aBlock
     ].
 
     aCustomContext selectedMethods notNil ifTrue: [ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CustomRefactoryBuilderTests.st	Mon Aug 25 23:45:19 2014 +0200
@@ -0,0 +1,180 @@
+"{ Package: 'jn:refactoring_custom' }"
+
+CustomCodeGeneratorOrRefactoringTestCase subclass:#CustomRefactoryBuilderTests
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-Refactoring-Custom-Tests'
+!
+
+!CustomRefactoryBuilderTests methodsFor:'accessing'!
+
+generatorOrRefactoring
+
+    ^ nil
+
+    "Created: / 24-08-2014 / 21:35:05 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
+!CustomRefactoryBuilderTests methodsFor:'tests'!
+
+test_execute_replace_with_in_code_selection_01
+    
+    |originalSource expectedSource actualSource codeSelection|
+
+    originalSource := 'selector
+    self information: ''Translate this''.
+    ^ self.'.
+
+    expectedSource := 'selector
+    self information: (resources string: ''Translate this'').
+    ^ self.'.
+
+    codeSelection := CustomSourceCodeSelection new.
+    codeSelection
+        currentSourceCode: originalSource;
+        selectedInterval: (32 to: 47);
+        selectedMethod: (self class compiledMethodAt: #generatorOrRefactoring). "/ just some method
+
+    refactoryBuilder executeReplace: '`@code' 
+        with: '(resources string: `@code)'
+        inCodeSelection: codeSelection.
+
+    actualSource := refactoryBuilder changes last source.
+
+    self assertSource: expectedSource sameAs: actualSource.
+
+    "Created: / 25-08-2014 / 21:53:39 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_search_in_code_selections_with_result_do_01
+
+    |source codeSelection resultsFoundCount |
+
+    source := 'selector
+    self information: ''Translate this''.
+    ^ self.'.
+
+    codeSelection := CustomSourceCodeSelection new.
+    codeSelection
+        currentSourceCode: source;
+        selectedInterval: (32 to: 47).
+
+    resultsFoundCount := 0.
+
+    refactoryBuilder search: '`@code' 
+        inCodeSelections: (Array with: codeSelection) 
+        withResultDo: [ :codeSelection |
+            resultsFoundCount := resultsFoundCount + 1
+        ].
+
+    self assert: resultsFoundCount = 1.
+
+    "Created: / 24-08-2014 / 21:10:01 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+    "Modified: / 25-08-2014 / 10:07:45 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_search_in_code_selections_with_result_do_02
+
+    |source codeSelection resultsFoundCount |
+
+    source := 'selector
+    self information: ''Translate this''.
+    ^ self.'.
+
+    codeSelection := CustomSourceCodeSelection new.
+    codeSelection
+        currentSourceCode: source;
+        selectedInterval: (32 to: 47).
+
+    resultsFoundCount := 0.
+
+    refactoryBuilder search: '`#literal' 
+        inCodeSelections: (Array with: codeSelection) 
+        withResultDo: [ :codeSelection |
+            resultsFoundCount := resultsFoundCount + 1
+        ].
+
+    self assert: resultsFoundCount = 1.
+
+    "Created: / 25-08-2014 / 17:00:02 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_search_in_code_selections_with_result_do_03
+
+    |source codeSelection resultsFoundCount |
+
+    source := 'selector
+    self information: ''Translate this''.
+    ^ self.'.
+
+    codeSelection := CustomSourceCodeSelection new.
+    codeSelection
+        currentSourceCode: source;
+        selectedInterval: (1 to: source size).
+
+    resultsFoundCount := 0.
+
+    refactoryBuilder search: '`#literal' 
+        inCodeSelections: (Array with: codeSelection) 
+        withResultDo: [ :codeSelection |
+            resultsFoundCount := resultsFoundCount + 1
+        ].
+
+    self assert: resultsFoundCount = 1.
+
+    "Created: / 25-08-2014 / 17:01:37 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_search_in_code_selections_with_result_do_04
+
+    |source codeSelection resultsFoundCount |
+
+    source := 'selector
+    self information: ''Translate this''.
+    ^ self.'.
+
+    codeSelection := CustomSourceCodeSelection new.
+    codeSelection
+        currentSourceCode: source;
+        selectedInterval: (14 to: 51).
+
+    resultsFoundCount := 0.
+
+    refactoryBuilder search: '`@code' 
+        inCodeSelections: (Array with: codeSelection) 
+        withResultDo: [ :codeSelection |
+            resultsFoundCount := resultsFoundCount + 1
+        ].
+
+    self assert: resultsFoundCount = 1.
+
+    "Created: / 25-08-2014 / 17:02:43 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+!
+
+test_search_in_code_selections_with_result_do_05
+
+    |source codeSelection resultsFoundCount |
+
+    source := 'selector
+    self information: ''Translate this''.
+    ^ self.'.
+
+    codeSelection := CustomSourceCodeSelection new.
+    codeSelection
+        currentSourceCode: source;
+        selectedInterval: (30 to: 38).
+
+    resultsFoundCount := 0.
+
+    self should: [ 
+        refactoryBuilder search: '`@code' 
+            inCodeSelections: (Array with: codeSelection) 
+            withResultDo: [ :codeSelection |
+                resultsFoundCount := resultsFoundCount + 1
+            ].
+    ] raise: Error.
+
+    "Created: / 25-08-2014 / 17:03:58 / Jakub Nesveda <nesvejak@fit.cvut.cz>"
+! !
+
--- a/Make.proto	Sun Aug 24 23:12:39 2014 +0200
+++ b/Make.proto	Mon Aug 25 23:45:19 2014 +0200
@@ -165,6 +165,7 @@
 $(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) $(INCLUDE_TOP)/stx/libtool/CodeGeneratorTool.$(H) $(STCHDR)
 $(OUTDIR)CustomSubclassResponsibilityCodeGenerator.$(O) CustomSubclassResponsibilityCodeGenerator.$(H): CustomSubclassResponsibilityCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libtool/CodeGeneratorTool.$(H) $(STCHDR)
 $(OUTDIR)CustomTestCaseCodeGenerator.$(O) CustomTestCaseCodeGenerator.$(H): CustomTestCaseCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libtool/CodeGeneratorTool.$(H) $(STCHDR)
+$(OUTDIR)CustomTestCaseMethodCodeGenerator.$(O) CustomTestCaseMethodCodeGenerator.$(H): CustomTestCaseMethodCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libtool/CodeGeneratorTool.$(H) $(STCHDR)
 $(OUTDIR)CustomVisitorCodeGenerator.$(O) CustomVisitorCodeGenerator.$(H): CustomVisitorCodeGenerator.st $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGenerator.$(H) $(INCLUDE_TOP)/jn/refactoring_custom/CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libtool/CodeGeneratorTool.$(H) $(STCHDR)
 $(OUTDIR)CustomChangeNotificationAccessMethodsCodeGenerator.$(O) CustomChangeNotificationAccessMethodsCodeGenerator.$(H): CustomChangeNotificationAccessMethodsCodeGenerator.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) $(INCLUDE_TOP)/stx/libtool/CodeGeneratorTool.$(H) $(STCHDR)
 $(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) $(INCLUDE_TOP)/stx/libtool/CodeGeneratorTool.$(H) $(STCHDR)
--- a/Make.spec	Sun Aug 24 23:12:39 2014 +0200
+++ b/Make.spec	Mon Aug 25 23:45:19 2014 +0200
@@ -82,6 +82,7 @@
 	CustomReplaceIfNilWithIfTrueRefactoring \
 	CustomSubclassResponsibilityCodeGenerator \
 	CustomTestCaseCodeGenerator \
+	CustomTestCaseMethodCodeGenerator \
 	CustomVisitorCodeGenerator \
 	CustomChangeNotificationAccessMethodsCodeGenerator \
 	CustomChangeNotificationSetterMethodsCodeGenerator \
@@ -137,6 +138,7 @@
     $(OUTDIR_SLASH)CustomReplaceIfNilWithIfTrueRefactoring.$(O) \
     $(OUTDIR_SLASH)CustomSubclassResponsibilityCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomTestCaseCodeGenerator.$(O) \
+    $(OUTDIR_SLASH)CustomTestCaseMethodCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomVisitorCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomChangeNotificationAccessMethodsCodeGenerator.$(O) \
     $(OUTDIR_SLASH)CustomChangeNotificationSetterMethodsCodeGenerator.$(O) \
--- a/abbrev.stc	Sun Aug 24 23:12:39 2014 +0200
+++ b/abbrev.stc	Mon Aug 25 23:45:19 2014 +0200
@@ -20,6 +20,7 @@
 CustomRefactoryBuilder CustomRefactoryBuilder jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomSourceCodeBuilder CustomSourceCodeBuilder jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomSourceCodeSelection CustomSourceCodeSelection jn:refactoring_custom 'Interface-Refactoring-Custom' 0
+CustomSourceCodeSelectionTests CustomSourceCodeSelectionTests jn:refactoring_custom 'Interface-Refactoring-Custom-Tests' 1
 CustomSubclassResponsibilityCodeGeneratorTests CustomSubclassResponsibilityCodeGeneratorTests jn:refactoring_custom 'Interface-Refactoring-Custom-Tests' 1
 TestClass TestClass jn:refactoring_custom 'Interface-Refactoring-Custom' 1
 TestClass2 TestClass2 jn:refactoring_custom 'Interface-Refactoring-Custom' 0
@@ -39,6 +40,7 @@
 CustomLocalChangeManager CustomLocalChangeManager jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomMultiSetterMethodsCodeGeneratorTests CustomMultiSetterMethodsCodeGeneratorTests jn:refactoring_custom 'Interface-Refactoring-Custom-Tests' 1
 CustomRefactoring CustomRefactoring jn:refactoring_custom 'Interface-Refactoring-Custom' 0
+CustomRefactoryBuilderTests CustomRefactoryBuilderTests jn:refactoring_custom 'Interface-Refactoring-Custom-Tests' 1
 CustomReplaceIfNilWithIfTrueRefactoringTests CustomReplaceIfNilWithIfTrueRefactoringTests jn:refactoring_custom 'Interface-Refactoring-Custom-Tests' 1
 CustomSilentDialog CustomSilentDialog jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomSimpleAccessMethodsCodeGeneratorTests CustomSimpleAccessMethodsCodeGeneratorTests jn:refactoring_custom 'Interface-Refactoring-Custom-Tests' 1
@@ -62,6 +64,7 @@
 CustomReplaceIfNilWithIfTrueRefactoring CustomReplaceIfNilWithIfTrueRefactoring jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomSubclassResponsibilityCodeGenerator CustomSubclassResponsibilityCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomTestCaseCodeGenerator CustomTestCaseCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom' 0
+CustomTestCaseMethodCodeGenerator CustomTestCaseMethodCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomVisitorCodeGenerator CustomVisitorCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomChangeNotificationAccessMethodsCodeGenerator CustomChangeNotificationAccessMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom' 0
 CustomChangeNotificationSetterMethodsCodeGenerator CustomChangeNotificationSetterMethodsCodeGenerator jn:refactoring_custom 'Interface-Refactoring-Custom' 0
--- a/bc.mak	Sun Aug 24 23:12:39 2014 +0200
+++ b/bc.mak	Mon Aug 25 23:45:19 2014 +0200
@@ -111,6 +111,7 @@
 $(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) $(INCLUDE_TOP)\stx\libtool\CodeGeneratorTool.$(H) $(STCHDR)
 $(OUTDIR)CustomSubclassResponsibilityCodeGenerator.$(O) CustomSubclassResponsibilityCodeGenerator.$(H): CustomSubclassResponsibilityCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libtool\CodeGeneratorTool.$(H) $(STCHDR)
 $(OUTDIR)CustomTestCaseCodeGenerator.$(O) CustomTestCaseCodeGenerator.$(H): CustomTestCaseCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libtool\CodeGeneratorTool.$(H) $(STCHDR)
+$(OUTDIR)CustomTestCaseMethodCodeGenerator.$(O) CustomTestCaseMethodCodeGenerator.$(H): CustomTestCaseMethodCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libtool\CodeGeneratorTool.$(H) $(STCHDR)
 $(OUTDIR)CustomVisitorCodeGenerator.$(O) CustomVisitorCodeGenerator.$(H): CustomVisitorCodeGenerator.st $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGenerator.$(H) $(INCLUDE_TOP)\jn\refactoring_custom\CustomCodeGeneratorOrRefactoring.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libtool\CodeGeneratorTool.$(H) $(STCHDR)
 $(OUTDIR)CustomChangeNotificationAccessMethodsCodeGenerator.$(O) CustomChangeNotificationAccessMethodsCodeGenerator.$(H): CustomChangeNotificationAccessMethodsCodeGenerator.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) $(INCLUDE_TOP)\stx\libtool\CodeGeneratorTool.$(H) $(STCHDR)
 $(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) $(INCLUDE_TOP)\stx\libtool\CodeGeneratorTool.$(H) $(STCHDR)
--- a/jn_refactoring_custom.st	Sun Aug 24 23:12:39 2014 +0200
+++ b/jn_refactoring_custom.st	Mon Aug 25 23:45:19 2014 +0200
@@ -90,6 +90,7 @@
         CustomRefactoryBuilder
         CustomSourceCodeBuilder
         CustomSourceCodeSelection
+        (CustomSourceCodeSelectionTests autoload)
         (CustomSubclassResponsibilityCodeGeneratorTests autoload)
         TestClass
         TestClass2
@@ -102,12 +103,14 @@
         CustomCodeGenerator
         (CustomCodeGeneratorTests autoload)
         (CustomCodeGeneratorUserPreferencesTests autoload)
+        (CustomCodeSelectionToResourceTranslationTests autoload)
         (CustomDefaultGetterMethodsCodeGeneratorTests autoload)
         (CustomLazyInitializationAccessMethodsCodeGeneratorTests autoload)
         (CustomLazyInitializationGetterMethodsCodeGeneratorTests autoload)
         CustomLocalChangeManager
         (CustomMultiSetterMethodsCodeGeneratorTests autoload)
         CustomRefactoring
+        (CustomRefactoryBuilderTests autoload)
         (CustomReplaceIfNilWithIfTrueRefactoringTests autoload)
         CustomSilentDialog
         (CustomSimpleAccessMethodsCodeGeneratorTests autoload)
@@ -131,10 +134,11 @@
         CustomReplaceIfNilWithIfTrueRefactoring
         CustomSubclassResponsibilityCodeGenerator
         CustomTestCaseCodeGenerator
+        CustomTestCaseMethodCodeGenerator
         CustomVisitorCodeGenerator
         CustomChangeNotificationAccessMethodsCodeGenerator
         CustomChangeNotificationSetterMethodsCodeGenerator
-        CustomCodeGeneratorTestCaseCodeGenerator
+        CustomCodeGeneratorOrRefactoringTestCaseCodeGenerator
         CustomDefaultGetterMethodsCodeGenerator
         CustomLazyInitializationAccessMethodsCodeGenerator
         CustomLazyInitializationGetterMethodsCodeGenerator
@@ -158,6 +162,8 @@
 
     ^ #(
         #'Tools::NewSystemBrowser' classMenuExtensionCustomRefactorings:
+        #'Tools::NewSystemBrowser' selectorMenuExtensionCustomRefactorings:
+        #'Tools::NewSystemBrowser' selectorMenuExtensionCustomRefactoringsSubMenu
     )
 ! !
 
--- a/libInit.cc	Sun Aug 24 23:12:39 2014 +0200
+++ b/libInit.cc	Mon Aug 25 23:45:19 2014 +0200
@@ -59,6 +59,7 @@
 _CustomReplaceIfNilWithIfTrueRefactoring_Init(pass,__pRT__,snd);
 _CustomSubclassResponsibilityCodeGenerator_Init(pass,__pRT__,snd);
 _CustomTestCaseCodeGenerator_Init(pass,__pRT__,snd);
+_CustomTestCaseMethodCodeGenerator_Init(pass,__pRT__,snd);
 _CustomVisitorCodeGenerator_Init(pass,__pRT__,snd);
 _CustomChangeNotificationAccessMethodsCodeGenerator_Init(pass,__pRT__,snd);
 _CustomChangeNotificationSetterMethodsCodeGenerator_Init(pass,__pRT__,snd);
--- a/refactoring_custom.rc	Sun Aug 24 23:12:39 2014 +0200
+++ b/refactoring_custom.rc	Mon Aug 25 23:45:19 2014 +0200
@@ -25,7 +25,7 @@
       VALUE "LegalCopyright", "My CopyRight or CopyLeft\0"
       VALUE "ProductName", "ProductName\0"
       VALUE "ProductVersion", "6.2.4.1326\0"
-      VALUE "ProductDate", "Sat, 23 Aug 2014 18:03:01 GMT\0"
+      VALUE "ProductDate", "Mon, 25 Aug 2014 21:39:49 GMT\0"
     END
 
   END