# HG changeset patch # User Claus Gittinger # Date 1036772414 -3600 # Node ID f4794940b620bc1b19d48ccd7c8c1207e70d1e71 # Parent af10a55696caadc42ce96fb415585b10ace7ba1d new changeSet reading mechanism (extensible); req'd to read in dolphin-soapopera... diff -r af10a55696ca -r f4794940b620 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 $' ! !