new changeSet reading mechanism (extensible);
authorClaus Gittinger <cg@exept.de>
Fri, 08 Nov 2002 17:20:14 +0100
changeset 1174 f4794940b620
parent 1173 af10a55696ca
child 1175 d4d0a2cc711a
new changeSet reading mechanism (extensible); req'd to read in dolphin-soapopera...
ChangeSet.st
--- a/ChangeSet.st	Tue Nov 05 16:11:48 2002 +0100
+++ b/ChangeSet.st	Fri Nov 08 17:20:14 2002 +0100
@@ -19,6 +19,15 @@
 	category:'System-Changes'
 !
 
+Object subclass:#ChangeFileReader
+	instanceVariableNames:'inputStream parseTree changeAction changeSet selector receiver
+		arguments receiverSelector receiverReceiver lineNumber position
+		className methodSelector'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:ChangeSet
+!
+
 Object subclass:#DiffSet
 	instanceVariableNames:'changed onlyInReceiver onlyInArg'
 	classVariableNames:''
@@ -53,330 +62,44 @@
 
 !ChangeSet class methodsFor:'instance creation'!
 
-changesFromParseTree:aTree andStream:aStream lineNumber:initialLineNumberOrNil position:initialPositionOrNil do:aBlock
-    "given a parse-tree (from parsing some changes source/chunk),
-     create changes and evaluate aBlock on each.
-     The block is invoked with the change and a lineNumberOrNil as
-     arg; the lineNumber is only valid, if the underlying stream 
-     provides line-numbers; otherwise, nil is passed."
-
-    |changes sel className categoryName 
-     methodSource methodSelector change parser
-     oldName newName priv receiver receiverVarName
-     receiverSelector receiverReceiver primSource
-     nameSpace lineNumberOrNil posOrNil|
-
-     lineNumberOrNil := initialLineNumberOrNil.
-     posOrNil := initialPositionOrNil.
-
-"/    nameSpace := Class nameSpaceQuerySignal query.
-"/    nameSpace isNil ifTrue:[nameSpace := Smalltalk].
-
-    sel := aTree selector.
-    receiver := aTree receiver.
-    receiver isMessage ifTrue:[
-        receiverSelector := receiver selector.
-        receiverReceiver := receiver receiver.
-    ] ifFalse:[
-        receiver isVariable ifTrue:[
-            receiverVarName := receiver name
-        ]
-    ].
-
-    (sel == #'methods'
-    or:[(sel == #'methodsFor:')
-    or:[(sel == #'publicMethodsFor:')
-    or:[(sel == #'privateMethodsFor:')
-    or:[(sel == #'methodsFor:stamp:')
-    or:[(sel == #'ignoredMethodsFor:')]]]]]) ifTrue:[
-        (sel == #'ignoredMethodsFor:') ifTrue:[
-            priv := #ignored.
-        ] ifFalse:[
-            priv := nil
-        ].
-        (receiver isUnaryMessage 
-        and:[receiverSelector == #class]) ifTrue:[
-            className := (receiverReceiver name) , ' class'.
-        ] ifFalse:[
-            className := (receiver name).
-        ].
-"/        nameSpace ~~ Smalltalk ifTrue:[
-"/            className := nameSpace name , '::' , className
-"/        ].
-        sel == #'methods' ifTrue:[
-            categoryName := 'uncategorized'
-        ] ifFalse:[
-            categoryName := (aTree arguments at:1) evaluate.
-        ].
-        aStream skipSeparators.
-        lineNumberOrNil := aStream lineNumber.
-        posOrNil := aStream position.
-        methodSource := aStream nextChunk.
-        changes := OrderedCollection new.
-
-        [methodSource notEmpty] whileTrue:[
-            parser := Parser
-                        parseMethodArgAndVarSpecification:methodSource 
-                        in:nil 
-                        ignoreErrors:true 
-                        ignoreWarnings:true
-                        parseBody:false.
-
-            parser isNil ifTrue:[
-                "/ something wierd ...
-                methodSelector := '????'.
-            ] ifFalse:[
-                methodSelector := parser selector.
-            ].
-
-            change := MethodChange new.
-            change 
-                className:className
-                selector:methodSelector
-                source:methodSource
-                category:categoryName
-                privacy:priv.
-            aBlock value:change value:lineNumberOrNil value:posOrNil.
-
-            aStream skipSeparators.
-            lineNumberOrNil := aStream lineNumber.
-            posOrNil := aStream position.
-            methodSource := aStream nextChunk.
-        ].
-        ^ true
-    ].
-
-    sel == #'removeSelector:' ifTrue:[
-        (receiver isUnaryMessage 
-        and:[receiverSelector == #class]) ifTrue:[
-            className := (receiverReceiver name) , ' class'.
-        ] ifFalse:[
-            className := (receiver name).
-        ].
-"/        nameSpace ~~ Smalltalk ifTrue:[
-"/            className := nameSpace name , '::' , className
-"/        ].
-        methodSelector := (aTree arguments at:1) evaluate.
-        change := MethodRemoveChange new.
-        change 
-            className:className
-            selector:methodSelector.
-        aBlock value:change value:lineNumberOrNil value:posOrNil.
-        ^ true
-    ].
-
-    "/ any subclass definiton selector ?
-    (Behavior definitionSelectors includes:sel)
-    ifTrue:[
-        className := (aTree arguments at:1) evaluate.
-"/        nameSpace ~~ Smalltalk ifTrue:[
-"/            className := nameSpace name , '::' , className
-"/        ].
-        nameSpace := Class nameSpaceQuerySignal query.
-        nameSpace ~~ Smalltalk ifTrue:[
-            className := nameSpace name , '::' , className
-        ].
-
-        change := ClassDefinitionChange new.
-        change 
-            className:className;
-            source:(aTree printString).
-        change package:(Class packageQuerySignal query).
-"/        nameSpace ~~ Smalltalk ifTrue:[
-"/            change nameSpaceName:(nameSpace name).
-"/        ].
-"/
-        aBlock value:change value:lineNumberOrNil value:posOrNil.
-        ^ true
-    ].
-
-    sel == #'renameCategory:to:' ifTrue:[
-        (receiver isUnaryMessage 
-        and:[receiverSelector == #class]) ifTrue:[
-            className := (receiverReceiver name) , ' class'.
-        ] ifFalse:[
-            className := (receiver name).
-        ].
-"/        nameSpace ~~ Smalltalk ifTrue:[
-"/            className := nameSpace name , '::' , className
-"/        ].
-        change := MethodCategoryRenameChange new.
-        change 
-            className:className;
-            oldCategoryName:(aTree arguments at:1) evaluate
-            newCategoryName:(aTree arguments at:2) evaluate.
-        aBlock value:change value:lineNumberOrNil value:posOrNil.
-        ^ true
-    ].
-
-    (sel == #'category:' 
-    or:[sel == #'privacy:']) ifTrue:[
-        (receiver isMessage
-        and:[receiverSelector == #'compiledMethodAt:']) ifTrue:[
-            (receiverReceiver isUnaryMessage 
-            and:[receiverReceiver selector == #class]) ifTrue:[
-                className := (receiverReceiver receiver name) , ' class'.
-            ] ifFalse:[
-                className := (receiverReceiver name).
-            ].
-"/            nameSpace ~~ Smalltalk ifTrue:[
-"/                className := nameSpace name , '::' , className
-"/            ].
-            methodSelector := (receiver arguments at:1) evaluate.
-
-            sel == #'category:' ifTrue:[
-                change := MethodCategoryChange new.
-                change 
-                    className:className
-                    selector:methodSelector
-                    category:(aTree arguments at:1) evaluate.
-            ] ifFalse:[
-                change := MethodPrivacyChange new.
-                change 
-                    className:className
-                    selector:methodSelector
-                    privacy:(aTree arguments at:1) evaluate.
-            ].
-
-            aBlock value:change value:lineNumberOrNil value:posOrNil.
-            ^ true
-        ] ifFalse:[
-            self error:'unexpected change' mayProceed:true
-        ].
-    ].
-
-    sel == #'comment:' ifTrue:[
-        (receiver isUnaryMessage 
-        and:[receiverSelector == #class]) ifTrue:[
-            className := (receiverReceiver name) , ' class'.
-        ] ifFalse:[
-            className := (receiver name).
-        ].
-"/        nameSpace ~~ Smalltalk ifTrue:[
-"/            className := nameSpace name , '::' , className
-"/        ].
-
-        change := ClassCommentChange new.
-        change 
-            className:className
-            comment:(aTree arguments at:1) evaluate.
-        change source:(aTree printString).
-        aBlock value:change value:lineNumberOrNil value:posOrNil.
-        ^ true
-    ].
-
-    sel == #'instanceVariableNames:' ifTrue:[
-        (receiver isUnaryMessage 
-        and:[receiverSelector == #class]) ifTrue:[
-            className := (receiverReceiver name) , ' class'.
-        ] ifFalse:[
-            className := (receiver name).
-        ].
-"/        nameSpace ~~ Smalltalk ifTrue:[
-"/            className := nameSpace name , '::' , className
-"/        ].
-        change := ClassInstVarDefinitionChange new.
-        change className:className.
-        change source:(aTree printString).
-        aBlock value:change value:lineNumberOrNil value:posOrNil.
-        ^ true
-    ].
-
-    sel == #'removeClass:' ifTrue:[
-        (receiverVarName == #Smalltalk) ifTrue:[
-            className := (aTree arguments at:1) name.
-"/            nameSpace ~~ Smalltalk ifTrue:[
-"/                className := nameSpace name , '::' , className
-"/            ].
-
-            change := ClassRemoveChange new.
-            change className:className.
-            aBlock value:change value:lineNumberOrNil value:posOrNil.
-            ^ true
-        ] ifFalse:[
-            self error:'unexpected receiver in #name: message' mayProceed:true
-        ].
-    ].
-
-    sel == #'renameClass:to:' ifTrue:[
-        (receiverVarName == #Smalltalk) ifTrue:[
-            oldName := (aTree arguments at:1) name.
-            newName := (aTree arguments at:2) evaluate.
-
-            change := ClassRenameChange new.
-            change oldName:oldName newName:newName.
-            aBlock value:change value:lineNumberOrNil value:posOrNil.
-            ^ true
-        ] ifFalse:[
-            self error:'unexpected receiver in #name: message' mayProceed:true
-        ].
-    ].
-
-    sel == #'name:' ifTrue:[
-        ((receiverVarName == #Namespace) 
-        or:[receiverVarName == #NameSpace]) ifTrue:[
-            className := (aTree arguments at:1) evaluate.
-
-            change := NameSpaceCreationChange new.
-            change name:className.
-            aBlock value:change value:lineNumberOrNil value:posOrNil.
-            ^ true
-        ] ifFalse:[
-            self error:'unexpected receiver in #name: message' mayProceed:true
-        ].
-    ].
-
-    (sel == #'primitiveDefinitions'
-    or:[sel == #'primitiveFunctions'
-    or:[sel == #'primitiveVariables']]) ifTrue:[
-        (receiver isUnaryMessage 
-        and:[receiverSelector == #class]) ifTrue:[
-            className := (receiverReceiver name) , ' class'.
-        ] ifFalse:[
-            className := (receiver name).
-        ].
-"/        nameSpace ~~ Smalltalk ifTrue:[
-"/            className := nameSpace name , '::' , className
-"/        ].
-
-        aStream skipSeparators.
-        primSource := aStream nextChunk.
-
-        sel == #'primitiveDefinitions' ifTrue:[
-            change := ClassPrimitiveDefinitionsChange new
-        ] ifFalse:[
-            sel == #'primitiveFunctions' ifTrue:[
-                change := ClassPrimitiveFunctionsChange new
-            ] ifFalse:[
-                change := ClassPrimitiveVariablesChange new
-            ]
-        ].
-        change class:className source:primSource.
-        aBlock value:change value:lineNumberOrNil value:posOrNil.
-        ^ true
-    ].
-
-    ^ false
-
-    "Created: / 16.2.1998 / 13:42:40 / cg"
-    "Modified: / 15.12.1999 / 00:29:06 / cg"
-!
-
 changesFromStream:aStream do:aBlock
     "enumerate changes from a stream and invoke aBlock on each.
      The block is invoked with the change and a lineNumberOrNil as
      arg; the lineNumber is only valid, if the underlying stream 
      provides line-numbers; otherwise, nil is passed."
 
+    ^ self changesFromStream:aStream format:#chunk do:aBlock
+
+    "
+     ChangeSet fromStream:('changes' asFilename readStream)
+     ChangeSet fromStream:('patches' asFilename readStream)
+     ChangeSet fromStream:(Object source asString readStream)
+    "
+
+    "Created: / 16.2.1998 / 12:19:34 / cg"
+    "Modified: / 14.12.1999 / 15:23:16 / cg"
+!
+
+changesFromStream:aStream format:format do:aBlock
+    "enumerate changes from a stream and invoke aBlock on each.
+     The block is invoked with the change and a lineNumberOrNil as
+     arg; the lineNumber is only valid, if the underlying stream 
+     provides line-numbers; otherwise, nil is passed."
+
     |chunk sawExcla lastTimeStamp s change nameSpace package
-     lineNumber pos|
+     lineNumber pos reader|
 
     nameSpace := Smalltalk.
     package := Class packageQuerySignal query.
+    reader := ChangeFileReader new changeSet:self.
+    reader changeAction:aBlock.
+    reader inputStream:aStream.
 
     [aStream atEnd] whileFalse:[
-        aStream skipSeparators.
-        sawExcla := aStream peekFor:$!!.
+        format == #chunk ifTrue:[
+            aStream skipSeparators.
+            sawExcla := aStream peekFor:$!!.
+        ].
         lineNumber := aStream lineNumber.
         pos := aStream position.
         chunk := aStream nextChunk.
@@ -392,12 +115,12 @@
                             ignoreWarnings:true 
                             inNameSpace:nameSpace.
 
-                tree == #Error ifTrue:[
-                    change := DoItChange new.
-                    change source:chunk.
-                    aBlock value:change value:lineNumber value:pos.
-                ] ifFalse:[    
-                    (tree notNil and:[tree ~~ #Error]) ifTrue:[
+                tree notNil ifTrue:[
+                    tree == #Error ifTrue:[
+                        change := DoItChange new.
+                        change source:chunk.
+                        aBlock value:change value:lineNumber value:pos.
+                    ] ifFalse:[    
                         "/ if there is any nameSpace directive in there, extract it.
                         ((ns := parser currentNameSpace) notNil 
                         and:[ns ~~ nameSpace]) ifTrue:[
@@ -423,18 +146,17 @@
                                     ]
                                 ] ifFalse:[
                                     tree isMessage ifTrue:[
-                                        (self 
-                                                changesFromParseTree:tree 
-                                                andStream:aStream
-                                                lineNumber:lineNumber
-                                                position:pos
-                                                do:aBlock) ifFalse:[
+                                        (reader 
+                                            changesFromParseTree:tree 
+                                            lineNumber:lineNumber
+                                            position:pos
+                                        ) ifFalse:[
                                             change := DoItChange new.
                                             change source:chunk.
                                             aBlock value:change value:lineNumber value:pos.
                                         ]
                                     ] ifFalse:[
-                                        self error:'unexpected change-chunk' mayProceed:true
+                                        self error:'unexpected change-chunk' mayProceed:true.
                                     ]
                                 ]
                             ]
@@ -504,6 +226,30 @@
     "Modified: / 14.12.1999 / 15:23:16 / cg"
 !
 
+fromSIFStream:aStream
+    "build a changeSet from a SIF stream, containing chunks
+     in smalltalk interchange format.
+     Return the changeSet."
+
+    ^ self fromSIFStream:aStream while:[:thisChange | true]
+!
+
+fromSIFStream:aStream while:aConditionBlock
+    "build a changeSet from a SIF stream, containing chunks
+     in smalltalk interchange format.
+     Return the changeSet."
+
+    |changeSet|
+
+    changeSet := self new.
+    self changesFromStream:aStream format:#sif do:[:aChange :lineNumberOrNil :posOrNil |
+        changeSet add:aChange.
+        (aConditionBlock value:aChange) ifFalse:[^ changeSet].
+    ].
+
+    ^ changeSet
+!
+
 fromStream:aStream
     "build a changeSet from a stream, containing chunks.
      (i.e. either a classes sourceFile or a change-file).
@@ -1222,6 +968,410 @@
     ^ret
 ! !
 
+!ChangeSet::ChangeFileReader methodsFor:'accessing'!
+
+changeAction:aBlock
+    changeAction := aBlock.
+!
+
+changeSet:something
+    "set the value of the instance variable 'changeSet' (automatically generated)"
+
+    changeSet := something.
+!
+
+inputStream:aStream
+    inputStream := aStream.
+! !
+
+!ChangeSet::ChangeFileReader methodsFor:'helpers'!
+
+classNameOf:aReceiver
+    (aReceiver isUnaryMessage 
+    and:[aReceiver selector == #class]) ifTrue:[
+        ^ (aReceiver receiver name) , ' class'.
+    ].
+    ^ aReceiver name
+!
+
+receiversClassName
+    ^ self classNameOf:receiver
+! !
+
+!ChangeSet::ChangeFileReader methodsFor:'reading'!
+
+changesFromParseTree:aTree lineNumber:initialLineNumberOrNil position:initialPositionOrNil
+    "given a parse-tree (from parsing some changes source/chunk),
+     create changes and evaluate changeAction on each.
+     The chnageAction-block is invoked with the change and a lineNumberOrNil as
+     arg; the lineNumber is only valid, if the underlying inputStream 
+     provides line-numbers; otherwise, nil is passed."
+
+    lineNumber := initialLineNumberOrNil.
+    position := initialPositionOrNil.
+    parseTree := aTree.
+
+    selector := aTree selector.
+    receiver := aTree receiver.
+    arguments := aTree arguments.
+
+    receiver isMessage ifTrue:[
+        receiverSelector := receiver selector.
+        receiverReceiver := receiver receiver.
+    ].
+
+    ^ self processChange
+! !
+
+!ChangeSet::ChangeFileReader methodsFor:'reading-private'!
+
+handleClassCommentChange
+    |change|
+
+    className := self receiversClassName.
+"/        nameSpace ~~ Smalltalk ifTrue:[
+"/            className := nameSpace name , '::' , className
+"/        ].
+
+    change := ClassCommentChange new.
+    change className:className comment:(arguments at:1) evaluate.
+    change source:(parseTree printString).
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleClassDefinitionChange
+    |nameSpace change|
+
+    className := (arguments at:1) evaluate.
+"/        nameSpace ~~ Smalltalk ifTrue:[
+"/            className := nameSpace name , '::' , className
+"/        ].
+    nameSpace := Class nameSpaceQuerySignal query.
+    nameSpace ~~ Smalltalk ifTrue:[
+        className := nameSpace name , '::' , className
+    ].
+
+    change := ClassDefinitionChange new.
+    change className:className; source:(parseTree printString).
+
+    change package:(Class packageQuerySignal query).
+"/        nameSpace ~~ Smalltalk ifTrue:[
+"/            change nameSpaceName:(nameSpace name).
+"/        ].
+"/
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleClassInstanceVariableDefinitionChange
+    |change|
+
+    className := self receiversClassName.
+
+"/        nameSpace ~~ Smalltalk ifTrue:[
+"/            className := nameSpace name , '::' , className
+"/        ].
+    change := ClassInstVarDefinitionChange new.
+    change className:className.
+    change source:(parseTree printString).
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleMethodCategoryChange
+    |change|
+
+    (receiver isMessage
+    and:[receiverSelector == #'compiledMethodAt:']) ifFalse:[
+        self error:'unexpected change' mayProceed:true.
+        ^ false.
+    ].
+    className := self classNameOf:receiverReceiver.
+
+"/            nameSpace ~~ Smalltalk ifTrue:[
+"/                className := nameSpace name , '::' , className
+"/            ].
+    methodSelector := (receiver arguments at:1) evaluate.
+
+    change := MethodCategoryChange new.
+    change 
+        className:className
+        selector:methodSelector
+        category:(arguments at:1) evaluate.
+
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleMethodCategoryRenameChange
+    |change|
+
+    className := self receiversClassName.
+"/        nameSpace ~~ Smalltalk ifTrue:[
+"/            className := nameSpace name , '::' , className
+"/        ].
+
+    change := MethodCategoryRenameChange new.
+    change 
+        className:className;
+        oldCategoryName:(arguments at:1) evaluate
+        newCategoryName:(arguments at:2) evaluate.
+
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleMethodChange
+    |priv categoryName methodSource changes change parser |
+
+    (selector == #'ignoredMethodsFor:') ifTrue:[
+        priv := #ignored.
+    ] ifFalse:[
+        priv := nil
+    ].
+    className := self receiversClassName.
+"/        nameSpace ~~ Smalltalk ifTrue:[
+"/            className := nameSpace name , '::' , className
+"/        ].
+    selector == #'methods' ifTrue:[
+        categoryName := 'uncategorized'
+    ] ifFalse:[
+        categoryName := (arguments at:1) evaluate.
+    ].
+    inputStream skipSeparators.
+    lineNumber := inputStream lineNumber.
+    position := inputStream position.
+    methodSource := inputStream nextChunk.
+    changes := OrderedCollection new.
+
+    [methodSource notEmpty] whileTrue:[
+        parser := Parser
+                    parseMethodArgAndVarSpecification:methodSource 
+                    in:nil 
+                    ignoreErrors:true 
+                    ignoreWarnings:true
+                    parseBody:false.
+
+        parser isNil ifTrue:[
+            "/ something wierd ...
+            methodSelector := '????'.
+        ] ifFalse:[
+            methodSelector := parser selector.
+        ].
+
+        change := MethodChange new.
+        change 
+            className:className
+            selector:methodSelector
+            source:methodSource
+            category:categoryName
+            privacy:priv.
+
+        changeAction value:change value:lineNumber value:position.
+
+        inputStream skipSeparators.
+        lineNumber := inputStream lineNumber.
+        position := inputStream position.
+        methodSource := inputStream nextChunk.
+    ].
+    ^ true
+!
+
+handleMethodPrivacyChange
+    |change|
+
+    (receiver isMessage
+    and:[receiverSelector == #'compiledMethodAt:']) ifFalse:[
+        self error:'unexpected change' mayProceed:true.
+        ^ false.
+    ].
+
+    className := self classNameOf:receiverReceiver.
+"/            nameSpace ~~ Smalltalk ifTrue:[
+"/                className := nameSpace name , '::' , className
+"/            ].
+    methodSelector := (receiver arguments at:1) evaluate.
+
+    change := MethodPrivacyChange new.
+    change 
+        className:className
+        selector:methodSelector
+        privacy:(arguments at:1) evaluate.
+
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleNameSpaceCreationChange
+    |receiverVarName change|
+
+    ((receiverVarName == #Namespace) 
+    or:[receiverVarName == #NameSpace]) ifFalse:[
+        self error:'unexpected receiver in #name: message' mayProceed:true.
+        ^ false
+    ].
+
+    className := (arguments at:1) evaluate.
+
+    change := NameSpaceCreationChange new.
+    change name:className.
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handlePrimitiveChange 
+    |change primSource|
+
+    className := self receiversClassName.
+"/        nameSpace ~~ Smalltalk ifTrue:[
+"/            className := nameSpace name , '::' , className
+"/        ].
+
+    inputStream skipSeparators.
+    primSource := inputStream nextChunk.
+
+    selector == #'primitiveDefinitions' ifTrue:[
+        change := ClassPrimitiveDefinitionsChange new
+    ] ifFalse:[
+        selector == #'primitiveFunctions' ifTrue:[
+            change := ClassPrimitiveFunctionsChange new
+        ] ifFalse:[
+            change := ClassPrimitiveVariablesChange new
+        ]
+    ].
+    change class:className source:primSource.
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleRemoveClassChange
+    |receiverVarName change|
+
+    receiver isVariable ifTrue:[
+        receiverVarName := receiver name
+    ].
+
+    (receiverVarName == #Smalltalk) ifFalse:[
+        self error:'unexpected receiver in remove-class message' mayProceed:true.
+        ^ false
+    ].
+
+    className := (arguments at:1) name.
+"/            nameSpace ~~ Smalltalk ifTrue:[
+"/                className := nameSpace name , '::' , className
+"/            ].
+
+    change := ClassRemoveChange new.
+    change className:className.
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleRemoveMethodChange
+    |change|
+
+    className := self receiversClassName.
+"/        nameSpace ~~ Smalltalk ifTrue:[
+"/            className := nameSpace name , '::' , className
+"/        ].
+    methodSelector := (arguments at:1) evaluate.
+    change := MethodRemoveChange new.
+    change className:className selector:methodSelector.
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+handleRenameClassChange
+    |receiverVarName oldName newName change|
+
+    receiver isVariable ifTrue:[
+        receiverVarName := receiver name
+    ].
+
+    (receiverVarName == #Smalltalk) ifFalse:[
+        self error:'unexpected receiver in #name: message' mayProceed:true.
+        ^ false.
+    ].
+
+    oldName := (arguments at:1) name.
+    newName := (arguments at:2) evaluate.
+
+    change := ClassRenameChange new.
+    change oldName:oldName newName:newName.
+    changeAction value:change value:lineNumber value:position.
+    ^ true
+!
+
+processChange
+    "given a parse-tree (from parsing some changes source/chunk),
+     create changes and evaluate changeAction on each.
+     The block is invoked with the change and a lineNumberOrNil as
+     arg; the lineNumber is only valid, if the underlying stream 
+     provides line-numbers; otherwise, nil is passed."
+
+    (selector == #'methods'
+    or:[(selector == #'methodsFor:')
+    or:[(selector == #'publicMethodsFor:')
+    or:[(selector == #'privateMethodsFor:')
+    or:[(selector == #'methodsFor:stamp:')
+    or:[(selector == #'ignoredMethodsFor:')]]]]]) ifTrue:[
+        ^ self handleMethodChange.
+    ].
+
+    selector == #'removeSelector:' ifTrue:[
+        ^ self handleRemoveMethodChange.
+    ].
+
+    "/ any subclass definiton selector ?
+    (Behavior definitionSelectors includes:selector)
+    ifTrue:[
+        ^ self handleClassDefinitionChange.
+    ].
+
+    selector == #'renameCategory:to:' ifTrue:[
+        ^ self handleMethodCategoryRenameChange.
+    ].
+
+    (selector == #'category:') ifTrue:[
+        ^ self handleMethodCategoryChange.
+    ].
+    (selector == #'privacy:') ifTrue:[
+        ^ self handleMethodPrivacyChange.
+    ].
+
+    selector == #'comment:' ifTrue:[
+        ^ self handleClassCommentChange.
+    ].
+
+    selector == #'instanceVariableNames:' ifTrue:[
+        ^ self handleClassInstanceVariableDefinitionChange
+    ].
+
+    selector == #'removeClass:' ifTrue:[
+        ^ self handleRemoveClassChange.
+    ].
+
+    selector == #'renameClass:to:' ifTrue:[
+        ^ self handleRenameClassChange.
+    ].
+
+    selector == #'name:' ifTrue:[
+        ^ self handleNameSpaceCreationChange.
+    ].
+
+    (selector == #'primitiveDefinitions'
+    or:[selector == #'primitiveFunctions'
+    or:[selector == #'primitiveVariables']]) ifTrue:[
+        ^ self handlePrimitiveChange.
+    ].
+
+    ^ false
+
+    "Created: / 16.2.1998 / 13:42:40 / cg"
+    "Modified: / 15.12.1999 / 00:29:06 / cg"
+! !
+
 !ChangeSet::DiffSet methodsFor:'accessing'!
 
 changed
@@ -1266,5 +1416,5 @@
 !ChangeSet class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic3/ChangeSet.st,v 1.82 2002-10-15 13:19:26 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic3/ChangeSet.st,v 1.83 2002-11-08 16:20:14 cg Exp $'
 ! !