more stuff for autoloaded classes
authorClaus Gittinger <cg@exept.de>
Tue, 12 Dec 1995 14:35:03 +0100
changeset 276 017219e571e4
parent 275 604a906c0eb7
child 277 b4b2782bc733
more stuff for autoloaded classes
CBrowser.st
ChangesBrowser.st
--- a/CBrowser.st	Tue Dec 12 14:17:13 1995 +0100
+++ b/CBrowser.st	Tue Dec 12 14:35:03 1995 +0100
@@ -937,17 +937,17 @@
      and a list of chunk-positions (changePositions).
      Starting with 2.10.3, the entries are multi-col entries;
      the cols are:
-	1   delta (only if comparing)
-		'+' -> new method (w.r.t. current state)
-		'-' -> removed method (w.r.t. current state)
-		'?' -> class does not exist currently
-		'=' -> change is same as current methods source
-	2   class/selector
-	3   type of change
-		doit
-		method
-		category change
-	4   timestamp
+        1   delta (only if comparing)
+                '+' -> new method (w.r.t. current state)
+                '-' -> removed method (w.r.t. current state)
+                '?' -> class does not exist currently
+                '=' -> change is same as current methods source
+        2   class/selector
+        3   type of change
+                doit
+                method
+                category change
+        4   timestamp
 
      since comparing slows down startup time, it is now disabled by
      default and can be enabled via a toggle."
@@ -966,295 +966,303 @@
     changeFileTimestamp := f info at:#modified.
 
     self withCursor:(Cursor read) do:[
-	|myProcess myPriority|
+        |myProcess myPriority|
 
-	"
-	 this is a time consuming operation (especially, if reading an
-	 NFS-mounted directory; therefore lower my priority ...
-	"
-	inBackground ifTrue:[
-	    myProcess := Processor activeProcess.
-	    myPriority := myProcess priority.
-	    myProcess priority:(Processor userBackgroundPriority).
-	].
+        "
+         this is a time consuming operation (especially, if reading an
+         NFS-mounted directory; therefore lower my priority ...
+        "
+        inBackground ifTrue:[
+            myProcess := Processor activeProcess.
+            myPriority := myProcess priority.
+            myProcess priority:(Processor userBackgroundPriority).
+        ].
 
-	[
-	    |excla timeStampInfo|
+        [
+            |excla timeStampInfo|
 
-	    changeChunks := OrderedCollection new.
-	    changeHeaderLines := OrderedCollection new.
-	    changePositions := OrderedCollection new.
-	    changeTimeStamps := OrderedCollection new.
-	    excla := aStream class chunkSeparator.
+            changeChunks := OrderedCollection new.
+            changeHeaderLines := OrderedCollection new.
+            changePositions := OrderedCollection new.
+            changeTimeStamps := OrderedCollection new.
+            excla := aStream class chunkSeparator.
 
-	    [aStream atEnd] whileFalse:[
-		|entry changeDelta changeString changeType 
-		 line s l changeClass sawExcla category 
-		 chunkText chunkPos sel|
+            [aStream atEnd] whileFalse:[
+                |entry changeDelta changeString changeType 
+                 line s l changeClass sawExcla category 
+                 chunkText chunkPos sel|
 
-		"
-		 get a chunk (separated by excla)
-		"
-		aStream skipSeparators.
-		chunkPos := aStream position.
+                "
+                 get a chunk (separated by excla)
+                "
+                aStream skipSeparators.
+                chunkPos := aStream position.
 
 
-		sawExcla := aStream peekFor:excla.
-		chunkText := aStream nextChunk.
-		chunkText notNil ifTrue:[
-		    |index headerLine|
+                sawExcla := aStream peekFor:excla.
+                chunkText := aStream nextChunk.
+                chunkText notNil ifTrue:[
+                    |index headerLine cls|
 
-		    (chunkText startsWith:'''---- timestamp ') ifTrue:[
-			timeStampInfo := (chunkText copyFrom:16 to:(chunkText size - 6)) withoutSpaces.
-		    ] ifFalse:[
+                    (chunkText startsWith:'''---- timestamp ') ifTrue:[
+                        timeStampInfo := (chunkText copyFrom:16 to:(chunkText size - 6)) withoutSpaces.
+                    ] ifFalse:[
 
-			"
-			 only first line is saved in changeChunks ...
-			"
-			index := chunkText indexOf:(Character cr).
-			(index ~~ 0) ifTrue:[
-			    chunkText := chunkText copyTo:(index - 1).
+                        "
+                         only first line is saved in changeChunks ...
+                        "
+                        index := chunkText indexOf:(Character cr).
+                        (index ~~ 0) ifTrue:[
+                            chunkText := chunkText copyTo:(index - 1).
 
-			    "take care for comment changes - must still be a
-			     valid expression for classNameOfChange: to work"
+                            "take care for comment changes - must still be a
+                             valid expression for classNameOfChange: to work"
 
-			    (chunkText endsWith:'comment:''') ifTrue:[
-				chunkText := chunkText , '...'''
-			    ].
-			    (chunkText endsWith:'primitiveDefinitions:''') ifTrue:[
-				sel := 'primitiveDefinitions:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			    (chunkText endsWith:'primitiveVariables:''') ifTrue:[
-				sel := 'primitiveVariables:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			    (chunkText endsWith:'primitiveFunctions:''') ifTrue:[
-				sel := 'primitiveFunctions:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			].
+                            (chunkText endsWith:'comment:''') ifTrue:[
+                                chunkText := chunkText , '...'''
+                            ].
+                            (chunkText endsWith:'primitiveDefinitions:''') ifTrue:[
+                                sel := 'primitiveDefinitions:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                            (chunkText endsWith:'primitiveVariables:''') ifTrue:[
+                                sel := 'primitiveVariables:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                            (chunkText endsWith:'primitiveFunctions:''') ifTrue:[
+                                sel := 'primitiveFunctions:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                        ].
 
-			changeChunks add:chunkText.
-			changePositions add:chunkPos.
-			changeTimeStamps add:timeStampInfo.
+                        changeChunks add:chunkText.
+                        changePositions add:chunkPos.
+                        changeTimeStamps add:timeStampInfo.
 
-			headerLine := nil.
-			changeDelta := ' '.
+                        headerLine := nil.
+                        changeDelta := ' '.
 
-			sawExcla ifFalse:[
-			    (chunkText startsWith:'''---- snap') ifTrue:[
-				changeType := ''.
-				headerLine := chunkText.
-				changeString := (chunkText contractTo:maxLen).
-			    ] ifFalse:[
+                        sawExcla ifFalse:[
+                            (chunkText startsWith:'''---- snap') ifTrue:[
+                                changeType := ''.
+                                headerLine := chunkText.
+                                changeString := (chunkText contractTo:maxLen).
+                            ] ifFalse:[
 
-				|p cls|
+                                |p cls|
 
-				headerLine := chunkText , ' (doIt)'.
+                                headerLine := chunkText , ' (doIt)'.
 
-				"
-				 first, assume doIt - then lets have a more detailed look ...
-				"
-				(chunkText startsWith:'''---- file') ifTrue:[
-				    changeType := ''.
-				] ifFalse:[
-				    changeType := '(doIt)'.
-				].    
-				changeString := (chunkText contractTo:maxLen).
+                                "
+                                 first, assume doIt - then lets have a more detailed look ...
+                                "
+                                (chunkText startsWith:'''---- file') ifTrue:[
+                                    changeType := ''.
+                                ] ifFalse:[
+                                    changeType := '(doIt)'.
+                                ].    
+                                changeString := (chunkText contractTo:maxLen).
 
-				p := Parser parseExpression:chunkText.
-				(p notNil 
-				 and:[p ~~ #Error
-				 and:[p isMessage]]) ifTrue:[
-				    sel := p selector.
-				].
-				(sel == #removeSelector:) ifTrue:[
-				    p receiver isUnaryMessage ifTrue:[
-					cls := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls) class.
-					cls := cls , ' class'.
-				    ] ifFalse:[
-					cls := p receiver name.
-					changeClass := (Smalltalk classNamed:cls)
-				    ].
-				    sel := (p args at:1) evaluate.
+                                p := Parser parseExpression:chunkText.
+                                (p notNil 
+                                 and:[p ~~ #Error
+                                 and:[p isMessage]]) ifTrue:[
+                                    sel := p selector.
+                                ].
+                                (sel == #removeSelector:) ifTrue:[
+                                    p receiver isUnaryMessage ifTrue:[
+                                        cls := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls) class.
+                                        cls := cls , ' class'.
+                                    ] ifFalse:[
+                                        cls := p receiver name.
+                                        changeClass := (Smalltalk classNamed:cls)
+                                    ].
+                                    sel := (p args at:1) evaluate.
 
-				    compareChanges ifTrue:[
-					(changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
-					    changeDelta := '?'
-					] ifFalse:[
-					    (changeClass implements:sel asSymbol) ifTrue:[
-						changeDelta := '-'.
-					    ]
-					]
-				    ].
-				    changeType := '(remove)'.
-				    changeString := self contractClass:cls selector:sel to:maxLen.
-				].
-				(p ~~ #Error
-				and:[p isMessage 
-				and:[p receiver isMessage
-				and:[p receiver selector == #compiledMethodAt:]]]) ifTrue:[
-				    p receiver receiver isUnaryMessage ifTrue:[
-					cls := p receiver receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls) class.
-					cls := cls , ' class'.
-				    ] ifFalse:[
-					cls := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls)
-				    ].
-				    (sel == #category:) ifTrue:[
-					sel := (p receiver args at:1) evaluate.
-					changeType := '(category change)'.
-					changeString := self contractClass:cls selector:sel to:maxLen.
-				    ].
-				    (sel == #privacy:) ifTrue:[
-					sel := (p receiver args at:1) evaluate.
-					changeType := '(privacy change)'.
-					changeString := self contractClass:cls selector:sel to:maxLen.
-				    ].
-				].
-				(#(#'subclass:'
-				  #'variableSubclass:'
-				  #'variableByteSubclass:'
-				  #'variableWordSubclass:'
-				  #'variableLongSubclass:'
-				  #'variableFloatSubclass:'
-				  #'variableDoubleSubclass:'
-				  #'primitiveDefinitions:'
-				  #'primitiveFunctions:'
-				  #'primitiveVariables:'
-				 ) includes:sel) ifTrue:[
-				    changeType := '(class definition)'.
-				].
-			    ]
-			] ifTrue:[ "sawExcla"
-			    |done first p cls text|
+                                    compareChanges ifTrue:[
+                                        (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
+                                            changeDelta := '?'
+                                        ] ifFalse:[
+                                            (changeClass implements:sel asSymbol) ifTrue:[
+                                                changeDelta := '-'.
+                                            ]
+                                        ]
+                                    ].
+                                    changeType := '(remove)'.
+                                    changeString := self contractClass:cls selector:sel to:maxLen.
+                                ].
+                                (p ~~ #Error
+                                and:[p isMessage 
+                                and:[p receiver isMessage
+                                and:[p receiver selector == #compiledMethodAt:]]]) ifTrue:[
+                                    p receiver receiver isUnaryMessage ifTrue:[
+                                        cls := p receiver receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls) class.
+                                        cls := cls , ' class'.
+                                    ] ifFalse:[
+                                        cls := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls)
+                                    ].
+                                    (sel == #category:) ifTrue:[
+                                        sel := (p receiver args at:1) evaluate.
+                                        changeType := '(category change)'.
+                                        changeString := self contractClass:cls selector:sel to:maxLen.
+                                    ].
+                                    (sel == #privacy:) ifTrue:[
+                                        sel := (p receiver args at:1) evaluate.
+                                        changeType := '(privacy change)'.
+                                        changeString := self contractClass:cls selector:sel to:maxLen.
+                                    ].
+                                ].
+                                (#(#'subclass:'
+                                  #'variableSubclass:'
+                                  #'variableByteSubclass:'
+                                  #'variableWordSubclass:'
+                                  #'variableLongSubclass:'
+                                  #'variableFloatSubclass:'
+                                  #'variableDoubleSubclass:'
+                                  #'primitiveDefinitions:'
+                                  #'primitiveFunctions:'
+                                  #'primitiveVariables:'
+                                 ) includes:sel) ifTrue:[
+                                    changeType := '(class definition)'.
+                                ].
+                            ]
+                        ] ifTrue:[ "sawExcla"
+                            |done first p cls text|
 
-			    "
-			     method definitions actually consist of
-			     two (or more) chunks; skip next chunk(s)
-			     up to an empty one.
-			     The system only writes one chunk,
-			     and we cannot handle more in this ChangesBrowser ....
-			    "
-			    cls := nil.
-			    p := Parser parseExpression:chunkText.
+                            "
+                             method definitions actually consist of
+                             two (or more) chunks; skip next chunk(s)
+                             up to an empty one.
+                             The system only writes one chunk,
+                             and we cannot handle more in this ChangesBrowser ....
+                            "
+                            cls := nil.
+                            p := Parser parseExpression:chunkText.
 
-			    (p notNil and:[p ~~ #Error]) ifTrue:[
-				sel := p selector.
-				(sel == #methodsFor:) ifTrue:[
-				    p receiver isUnaryMessage ifTrue:[
-					cls := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls) class.
-					cls := cls , ' class'.
-				    ] ifFalse:[
-					cls := p receiver name.
-					changeClass := Smalltalk classNamed:cls
-				    ].
-				    category := (p args at:1) evaluate.
-				].
-			    ].
-			    done := false.
-			    first := true.
-			    [done] whileFalse:[
-				text := aStream nextChunk.
-				text isNil ifTrue:[
-				    done := true
-				] ifFalse:[
-				    done := text isEmpty
-				].
-				done ifFalse:[
-				    first ifFalse:[
-					Transcript showCr:'only one method per ''methodsFor:'' handled'.
-				    ] ifTrue:[
-					first := false.
-					"
-					 try to find the selector
-					"
-					sel := nil.
-					cls notNil ifTrue:[
-					    p := Parser 
-						     parseMethodSpecification:text
-						     in:nil
-						     ignoreErrors:true
-						     ignoreWarnings:true.
-					    (p notNil and:[p ~~ #Error]) ifTrue:[
-						sel := p selector.
-					    ]
-					].
+                            (p notNil and:[p ~~ #Error]) ifTrue:[
+                                sel := p selector.
+                                (sel == #methodsFor:) ifTrue:[
+                                    p receiver isUnaryMessage ifTrue:[
+                                        cls := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls) class.
+                                        cls := cls , ' class'.
+                                    ] ifFalse:[
+                                        cls := p receiver name.
+                                        changeClass := Smalltalk classNamed:cls
+                                    ].
+                                    category := (p args at:1) evaluate.
+                                ].
+                            ].
+                            done := false.
+                            first := true.
+                            [done] whileFalse:[
+                                text := aStream nextChunk.
+                                text isNil ifTrue:[
+                                    done := true
+                                ] ifFalse:[
+                                    done := text isEmpty
+                                ].
+                                done ifFalse:[
+                                    first ifFalse:[
+                                        Transcript showCr:'only one method per ''methodsFor:'' handled'.
+                                    ] ifTrue:[
+                                        first := false.
+                                        "
+                                         try to find the selector
+                                        "
+                                        sel := nil.
+                                        cls notNil ifTrue:[
+                                            p := Parser 
+                                                     parseMethodSpecification:text
+                                                     in:nil
+                                                     ignoreErrors:true
+                                                     ignoreWarnings:true.
+                                            (p notNil and:[p ~~ #Error]) ifTrue:[
+                                                sel := p selector.
+                                            ]
+                                        ].
+
+                                        sel isNil ifTrue:[
+                                            changeString := (chunkText contractTo:maxLen).
+                                            changeType := '(change)'.
+                                        ] ifFalse:[
+                                            changeString :=  self contractClass:cls selector:sel to:maxLen.
+                                            changeType := '(method in: ''' , category , ''')'.
+                                        ].
+                                        sel isNil ifTrue:[
+                                            headerLine := chunkText , ' (change)'.
+                                        ] ifFalse:[
+                                            headerLine := cls , ' ' , sel , ' ' , '(change category: ''' , category , ''')'.
+                                        ].
 
-					sel isNil ifTrue:[
-					    changeString := (chunkText contractTo:maxLen).
-					    changeType := '(change)'.
-					] ifFalse:[
-					    changeString :=  self contractClass:cls selector:sel to:maxLen.
-					    changeType := '(method in: ''' , category , ''')'.
-					].
-					sel isNil ifTrue:[
-					    headerLine := chunkText , ' (change)'.
-					] ifFalse:[
-					    headerLine := cls , ' ' , sel , ' ' , '(change category: ''' , category , ''')'.
-					].
+                                        compareChanges ifTrue:[ 
+                                            changeClass isNil ifFalse:[
+                                                changeClass isMeta ifTrue:[
+                                                    cls := changeClass soleInstance
+                                                ] ifFalse:[
+                                                    cls := changeClass
+                                                ].
+                                            ].
 
-					compareChanges ifTrue:[    
-					    (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
-						changeDelta := '?'
-					    ] ifFalse:[
-						(changeClass implements:sel asSymbol) ifFalse:[
-						    changeDelta := '+'.
-						] ifTrue:[
-						    |m currentText t1 t2|
+                                            (changeClass isNil or:[cls isLoaded not]) ifTrue:[
+                                                changeDelta := '?'
+                                            ] ifFalse:[
+                                                (changeClass implements:sel asSymbol) ifFalse:[
+                                                    changeDelta := '+'.
+                                                ] ifTrue:[
+                                                    |m currentText t1 t2|
 
-						    m := changeClass compiledMethodAt:sel asSymbol.
-						    currentText := m source.
-						    currentText notNil ifTrue:[
-							text asString = currentText asString ifTrue:[
-							    changeDelta := '='
-							] ifFalse:[
-							    t1 := currentText asCollectionOfLines collect:[:s | s withTabsExpanded].
-							    t2 := text asCollectionOfLines collect:[:s | s withTabsExpanded].
-							    t1 = t2 ifTrue:[
-								changeDelta := '='
-							    ]
-							]
-						    ]
-						]
-					    ]
-					]
-				    ]
-				]
-			    ]
-			].
-			changeString notNil ifTrue:[
-			    entry := MultiColListEntry new.
-			    entry tabulatorSpecification:tabSpec.
-			    entry colAt:1 put:changeDelta.
-			    entry colAt:2 put:changeString.
-			    entry colAt:3 put:changeType.
-			    entry colAt:4 put:timeStampInfo.
-			    changeHeaderLines add:entry
-			] ifFalse:[
-			    headerLine notNil ifTrue:[
-				changeHeaderLines add:headerLine
-			    ]
-			]
-		    ]
-		]
-	    ].
-	    changeClassNames := OrderedCollection new grow:(changeChunks size).
-	    aStream close.
-	    anyChanges := false
-	] valueNowOrOnUnwindDo:[
-	    inBackground ifTrue:[myProcess priority:myPriority].
-	].
+                                                    m := changeClass compiledMethodAt:sel asSymbol.
+                                                    currentText := m source.
+                                                    currentText notNil ifTrue:[
+                                                        text asString = currentText asString ifTrue:[
+                                                            changeDelta := '='
+                                                        ] ifFalse:[
+                                                            t1 := currentText asCollectionOfLines collect:[:s | s withTabsExpanded].
+                                                            t2 := text asCollectionOfLines collect:[:s | s withTabsExpanded].
+                                                            t1 = t2 ifTrue:[
+                                                                changeDelta := '='
+                                                            ]
+                                                        ]
+                                                    ]
+                                                ]
+                                            ]
+                                        ]
+                                    ]
+                                ]
+                            ]
+                        ].
+                        changeString notNil ifTrue:[
+                            entry := MultiColListEntry new.
+                            entry tabulatorSpecification:tabSpec.
+                            entry colAt:1 put:changeDelta.
+                            entry colAt:2 put:changeString.
+                            entry colAt:3 put:changeType.
+                            entry colAt:4 put:timeStampInfo.
+                            changeHeaderLines add:entry
+                        ] ifFalse:[
+                            headerLine notNil ifTrue:[
+                                changeHeaderLines add:headerLine
+                            ]
+                        ]
+                    ]
+                ]
+            ].
+            changeClassNames := OrderedCollection new grow:(changeChunks size).
+            aStream close.
+            anyChanges := false
+        ] valueNowOrOnUnwindDo:[
+            inBackground ifTrue:[myProcess priority:myPriority].
+        ].
     ].
 
     self checkIfFileHasChanged
 
     "Modified: 27.8.1995 / 23:06:55 / claus"
-    "Modified: 3.12.1995 / 18:52:34 / cg"
+    "Modified: 12.12.1995 / 14:34:03 / cg"
 !
 
 selectorOfMethodChange:changeNr
@@ -2022,4 +2030,5 @@
 !ChangesBrowser class methodsFor:'documentation'!
 
 version
-^ '$Header: /cvs/stx/stx/libtool/Attic/CBrowser.st,v 1.60 1995-12-12 13:17:13 cg Exp $'! !
+    ^ '$Header: /cvs/stx/stx/libtool/Attic/CBrowser.st,v 1.61 1995-12-12 13:35:03 cg Exp $'
+! !
--- a/ChangesBrowser.st	Tue Dec 12 14:17:13 1995 +0100
+++ b/ChangesBrowser.st	Tue Dec 12 14:35:03 1995 +0100
@@ -937,17 +937,17 @@
      and a list of chunk-positions (changePositions).
      Starting with 2.10.3, the entries are multi-col entries;
      the cols are:
-	1   delta (only if comparing)
-		'+' -> new method (w.r.t. current state)
-		'-' -> removed method (w.r.t. current state)
-		'?' -> class does not exist currently
-		'=' -> change is same as current methods source
-	2   class/selector
-	3   type of change
-		doit
-		method
-		category change
-	4   timestamp
+        1   delta (only if comparing)
+                '+' -> new method (w.r.t. current state)
+                '-' -> removed method (w.r.t. current state)
+                '?' -> class does not exist currently
+                '=' -> change is same as current methods source
+        2   class/selector
+        3   type of change
+                doit
+                method
+                category change
+        4   timestamp
 
      since comparing slows down startup time, it is now disabled by
      default and can be enabled via a toggle."
@@ -966,295 +966,303 @@
     changeFileTimestamp := f info at:#modified.
 
     self withCursor:(Cursor read) do:[
-	|myProcess myPriority|
+        |myProcess myPriority|
 
-	"
-	 this is a time consuming operation (especially, if reading an
-	 NFS-mounted directory; therefore lower my priority ...
-	"
-	inBackground ifTrue:[
-	    myProcess := Processor activeProcess.
-	    myPriority := myProcess priority.
-	    myProcess priority:(Processor userBackgroundPriority).
-	].
+        "
+         this is a time consuming operation (especially, if reading an
+         NFS-mounted directory; therefore lower my priority ...
+        "
+        inBackground ifTrue:[
+            myProcess := Processor activeProcess.
+            myPriority := myProcess priority.
+            myProcess priority:(Processor userBackgroundPriority).
+        ].
 
-	[
-	    |excla timeStampInfo|
+        [
+            |excla timeStampInfo|
 
-	    changeChunks := OrderedCollection new.
-	    changeHeaderLines := OrderedCollection new.
-	    changePositions := OrderedCollection new.
-	    changeTimeStamps := OrderedCollection new.
-	    excla := aStream class chunkSeparator.
+            changeChunks := OrderedCollection new.
+            changeHeaderLines := OrderedCollection new.
+            changePositions := OrderedCollection new.
+            changeTimeStamps := OrderedCollection new.
+            excla := aStream class chunkSeparator.
 
-	    [aStream atEnd] whileFalse:[
-		|entry changeDelta changeString changeType 
-		 line s l changeClass sawExcla category 
-		 chunkText chunkPos sel|
+            [aStream atEnd] whileFalse:[
+                |entry changeDelta changeString changeType 
+                 line s l changeClass sawExcla category 
+                 chunkText chunkPos sel|
 
-		"
-		 get a chunk (separated by excla)
-		"
-		aStream skipSeparators.
-		chunkPos := aStream position.
+                "
+                 get a chunk (separated by excla)
+                "
+                aStream skipSeparators.
+                chunkPos := aStream position.
 
 
-		sawExcla := aStream peekFor:excla.
-		chunkText := aStream nextChunk.
-		chunkText notNil ifTrue:[
-		    |index headerLine|
+                sawExcla := aStream peekFor:excla.
+                chunkText := aStream nextChunk.
+                chunkText notNil ifTrue:[
+                    |index headerLine cls|
 
-		    (chunkText startsWith:'''---- timestamp ') ifTrue:[
-			timeStampInfo := (chunkText copyFrom:16 to:(chunkText size - 6)) withoutSpaces.
-		    ] ifFalse:[
+                    (chunkText startsWith:'''---- timestamp ') ifTrue:[
+                        timeStampInfo := (chunkText copyFrom:16 to:(chunkText size - 6)) withoutSpaces.
+                    ] ifFalse:[
 
-			"
-			 only first line is saved in changeChunks ...
-			"
-			index := chunkText indexOf:(Character cr).
-			(index ~~ 0) ifTrue:[
-			    chunkText := chunkText copyTo:(index - 1).
+                        "
+                         only first line is saved in changeChunks ...
+                        "
+                        index := chunkText indexOf:(Character cr).
+                        (index ~~ 0) ifTrue:[
+                            chunkText := chunkText copyTo:(index - 1).
 
-			    "take care for comment changes - must still be a
-			     valid expression for classNameOfChange: to work"
+                            "take care for comment changes - must still be a
+                             valid expression for classNameOfChange: to work"
 
-			    (chunkText endsWith:'comment:''') ifTrue:[
-				chunkText := chunkText , '...'''
-			    ].
-			    (chunkText endsWith:'primitiveDefinitions:''') ifTrue:[
-				sel := 'primitiveDefinitions:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			    (chunkText endsWith:'primitiveVariables:''') ifTrue:[
-				sel := 'primitiveVariables:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			    (chunkText endsWith:'primitiveFunctions:''') ifTrue:[
-				sel := 'primitiveFunctions:'.
-				chunkText := chunkText copyWithoutLast:1
-			    ].
-			].
+                            (chunkText endsWith:'comment:''') ifTrue:[
+                                chunkText := chunkText , '...'''
+                            ].
+                            (chunkText endsWith:'primitiveDefinitions:''') ifTrue:[
+                                sel := 'primitiveDefinitions:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                            (chunkText endsWith:'primitiveVariables:''') ifTrue:[
+                                sel := 'primitiveVariables:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                            (chunkText endsWith:'primitiveFunctions:''') ifTrue:[
+                                sel := 'primitiveFunctions:'.
+                                chunkText := chunkText copyWithoutLast:1
+                            ].
+                        ].
 
-			changeChunks add:chunkText.
-			changePositions add:chunkPos.
-			changeTimeStamps add:timeStampInfo.
+                        changeChunks add:chunkText.
+                        changePositions add:chunkPos.
+                        changeTimeStamps add:timeStampInfo.
 
-			headerLine := nil.
-			changeDelta := ' '.
+                        headerLine := nil.
+                        changeDelta := ' '.
 
-			sawExcla ifFalse:[
-			    (chunkText startsWith:'''---- snap') ifTrue:[
-				changeType := ''.
-				headerLine := chunkText.
-				changeString := (chunkText contractTo:maxLen).
-			    ] ifFalse:[
+                        sawExcla ifFalse:[
+                            (chunkText startsWith:'''---- snap') ifTrue:[
+                                changeType := ''.
+                                headerLine := chunkText.
+                                changeString := (chunkText contractTo:maxLen).
+                            ] ifFalse:[
 
-				|p cls|
+                                |p cls|
 
-				headerLine := chunkText , ' (doIt)'.
+                                headerLine := chunkText , ' (doIt)'.
 
-				"
-				 first, assume doIt - then lets have a more detailed look ...
-				"
-				(chunkText startsWith:'''---- file') ifTrue:[
-				    changeType := ''.
-				] ifFalse:[
-				    changeType := '(doIt)'.
-				].    
-				changeString := (chunkText contractTo:maxLen).
+                                "
+                                 first, assume doIt - then lets have a more detailed look ...
+                                "
+                                (chunkText startsWith:'''---- file') ifTrue:[
+                                    changeType := ''.
+                                ] ifFalse:[
+                                    changeType := '(doIt)'.
+                                ].    
+                                changeString := (chunkText contractTo:maxLen).
 
-				p := Parser parseExpression:chunkText.
-				(p notNil 
-				 and:[p ~~ #Error
-				 and:[p isMessage]]) ifTrue:[
-				    sel := p selector.
-				].
-				(sel == #removeSelector:) ifTrue:[
-				    p receiver isUnaryMessage ifTrue:[
-					cls := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls) class.
-					cls := cls , ' class'.
-				    ] ifFalse:[
-					cls := p receiver name.
-					changeClass := (Smalltalk classNamed:cls)
-				    ].
-				    sel := (p args at:1) evaluate.
+                                p := Parser parseExpression:chunkText.
+                                (p notNil 
+                                 and:[p ~~ #Error
+                                 and:[p isMessage]]) ifTrue:[
+                                    sel := p selector.
+                                ].
+                                (sel == #removeSelector:) ifTrue:[
+                                    p receiver isUnaryMessage ifTrue:[
+                                        cls := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls) class.
+                                        cls := cls , ' class'.
+                                    ] ifFalse:[
+                                        cls := p receiver name.
+                                        changeClass := (Smalltalk classNamed:cls)
+                                    ].
+                                    sel := (p args at:1) evaluate.
 
-				    compareChanges ifTrue:[
-					(changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
-					    changeDelta := '?'
-					] ifFalse:[
-					    (changeClass implements:sel asSymbol) ifTrue:[
-						changeDelta := '-'.
-					    ]
-					]
-				    ].
-				    changeType := '(remove)'.
-				    changeString := self contractClass:cls selector:sel to:maxLen.
-				].
-				(p ~~ #Error
-				and:[p isMessage 
-				and:[p receiver isMessage
-				and:[p receiver selector == #compiledMethodAt:]]]) ifTrue:[
-				    p receiver receiver isUnaryMessage ifTrue:[
-					cls := p receiver receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls) class.
-					cls := cls , ' class'.
-				    ] ifFalse:[
-					cls := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls)
-				    ].
-				    (sel == #category:) ifTrue:[
-					sel := (p receiver args at:1) evaluate.
-					changeType := '(category change)'.
-					changeString := self contractClass:cls selector:sel to:maxLen.
-				    ].
-				    (sel == #privacy:) ifTrue:[
-					sel := (p receiver args at:1) evaluate.
-					changeType := '(privacy change)'.
-					changeString := self contractClass:cls selector:sel to:maxLen.
-				    ].
-				].
-				(#(#'subclass:'
-				  #'variableSubclass:'
-				  #'variableByteSubclass:'
-				  #'variableWordSubclass:'
-				  #'variableLongSubclass:'
-				  #'variableFloatSubclass:'
-				  #'variableDoubleSubclass:'
-				  #'primitiveDefinitions:'
-				  #'primitiveFunctions:'
-				  #'primitiveVariables:'
-				 ) includes:sel) ifTrue:[
-				    changeType := '(class definition)'.
-				].
-			    ]
-			] ifTrue:[ "sawExcla"
-			    |done first p cls text|
+                                    compareChanges ifTrue:[
+                                        (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
+                                            changeDelta := '?'
+                                        ] ifFalse:[
+                                            (changeClass implements:sel asSymbol) ifTrue:[
+                                                changeDelta := '-'.
+                                            ]
+                                        ]
+                                    ].
+                                    changeType := '(remove)'.
+                                    changeString := self contractClass:cls selector:sel to:maxLen.
+                                ].
+                                (p ~~ #Error
+                                and:[p isMessage 
+                                and:[p receiver isMessage
+                                and:[p receiver selector == #compiledMethodAt:]]]) ifTrue:[
+                                    p receiver receiver isUnaryMessage ifTrue:[
+                                        cls := p receiver receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls) class.
+                                        cls := cls , ' class'.
+                                    ] ifFalse:[
+                                        cls := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls)
+                                    ].
+                                    (sel == #category:) ifTrue:[
+                                        sel := (p receiver args at:1) evaluate.
+                                        changeType := '(category change)'.
+                                        changeString := self contractClass:cls selector:sel to:maxLen.
+                                    ].
+                                    (sel == #privacy:) ifTrue:[
+                                        sel := (p receiver args at:1) evaluate.
+                                        changeType := '(privacy change)'.
+                                        changeString := self contractClass:cls selector:sel to:maxLen.
+                                    ].
+                                ].
+                                (#(#'subclass:'
+                                  #'variableSubclass:'
+                                  #'variableByteSubclass:'
+                                  #'variableWordSubclass:'
+                                  #'variableLongSubclass:'
+                                  #'variableFloatSubclass:'
+                                  #'variableDoubleSubclass:'
+                                  #'primitiveDefinitions:'
+                                  #'primitiveFunctions:'
+                                  #'primitiveVariables:'
+                                 ) includes:sel) ifTrue:[
+                                    changeType := '(class definition)'.
+                                ].
+                            ]
+                        ] ifTrue:[ "sawExcla"
+                            |done first p cls text|
 
-			    "
-			     method definitions actually consist of
-			     two (or more) chunks; skip next chunk(s)
-			     up to an empty one.
-			     The system only writes one chunk,
-			     and we cannot handle more in this ChangesBrowser ....
-			    "
-			    cls := nil.
-			    p := Parser parseExpression:chunkText.
+                            "
+                             method definitions actually consist of
+                             two (or more) chunks; skip next chunk(s)
+                             up to an empty one.
+                             The system only writes one chunk,
+                             and we cannot handle more in this ChangesBrowser ....
+                            "
+                            cls := nil.
+                            p := Parser parseExpression:chunkText.
 
-			    (p notNil and:[p ~~ #Error]) ifTrue:[
-				sel := p selector.
-				(sel == #methodsFor:) ifTrue:[
-				    p receiver isUnaryMessage ifTrue:[
-					cls := p receiver receiver name.
-					changeClass := (Smalltalk classNamed:cls) class.
-					cls := cls , ' class'.
-				    ] ifFalse:[
-					cls := p receiver name.
-					changeClass := Smalltalk classNamed:cls
-				    ].
-				    category := (p args at:1) evaluate.
-				].
-			    ].
-			    done := false.
-			    first := true.
-			    [done] whileFalse:[
-				text := aStream nextChunk.
-				text isNil ifTrue:[
-				    done := true
-				] ifFalse:[
-				    done := text isEmpty
-				].
-				done ifFalse:[
-				    first ifFalse:[
-					Transcript showCr:'only one method per ''methodsFor:'' handled'.
-				    ] ifTrue:[
-					first := false.
-					"
-					 try to find the selector
-					"
-					sel := nil.
-					cls notNil ifTrue:[
-					    p := Parser 
-						     parseMethodSpecification:text
-						     in:nil
-						     ignoreErrors:true
-						     ignoreWarnings:true.
-					    (p notNil and:[p ~~ #Error]) ifTrue:[
-						sel := p selector.
-					    ]
-					].
+                            (p notNil and:[p ~~ #Error]) ifTrue:[
+                                sel := p selector.
+                                (sel == #methodsFor:) ifTrue:[
+                                    p receiver isUnaryMessage ifTrue:[
+                                        cls := p receiver receiver name.
+                                        changeClass := (Smalltalk classNamed:cls) class.
+                                        cls := cls , ' class'.
+                                    ] ifFalse:[
+                                        cls := p receiver name.
+                                        changeClass := Smalltalk classNamed:cls
+                                    ].
+                                    category := (p args at:1) evaluate.
+                                ].
+                            ].
+                            done := false.
+                            first := true.
+                            [done] whileFalse:[
+                                text := aStream nextChunk.
+                                text isNil ifTrue:[
+                                    done := true
+                                ] ifFalse:[
+                                    done := text isEmpty
+                                ].
+                                done ifFalse:[
+                                    first ifFalse:[
+                                        Transcript showCr:'only one method per ''methodsFor:'' handled'.
+                                    ] ifTrue:[
+                                        first := false.
+                                        "
+                                         try to find the selector
+                                        "
+                                        sel := nil.
+                                        cls notNil ifTrue:[
+                                            p := Parser 
+                                                     parseMethodSpecification:text
+                                                     in:nil
+                                                     ignoreErrors:true
+                                                     ignoreWarnings:true.
+                                            (p notNil and:[p ~~ #Error]) ifTrue:[
+                                                sel := p selector.
+                                            ]
+                                        ].
+
+                                        sel isNil ifTrue:[
+                                            changeString := (chunkText contractTo:maxLen).
+                                            changeType := '(change)'.
+                                        ] ifFalse:[
+                                            changeString :=  self contractClass:cls selector:sel to:maxLen.
+                                            changeType := '(method in: ''' , category , ''')'.
+                                        ].
+                                        sel isNil ifTrue:[
+                                            headerLine := chunkText , ' (change)'.
+                                        ] ifFalse:[
+                                            headerLine := cls , ' ' , sel , ' ' , '(change category: ''' , category , ''')'.
+                                        ].
 
-					sel isNil ifTrue:[
-					    changeString := (chunkText contractTo:maxLen).
-					    changeType := '(change)'.
-					] ifFalse:[
-					    changeString :=  self contractClass:cls selector:sel to:maxLen.
-					    changeType := '(method in: ''' , category , ''')'.
-					].
-					sel isNil ifTrue:[
-					    headerLine := chunkText , ' (change)'.
-					] ifFalse:[
-					    headerLine := cls , ' ' , sel , ' ' , '(change category: ''' , category , ''')'.
-					].
+                                        compareChanges ifTrue:[ 
+                                            changeClass isNil ifFalse:[
+                                                changeClass isMeta ifTrue:[
+                                                    cls := changeClass soleInstance
+                                                ] ifFalse:[
+                                                    cls := changeClass
+                                                ].
+                                            ].
 
-					compareChanges ifTrue:[    
-					    (changeClass isNil or:[changeClass isLoaded not]) ifTrue:[
-						changeDelta := '?'
-					    ] ifFalse:[
-						(changeClass implements:sel asSymbol) ifFalse:[
-						    changeDelta := '+'.
-						] ifTrue:[
-						    |m currentText t1 t2|
+                                            (changeClass isNil or:[cls isLoaded not]) ifTrue:[
+                                                changeDelta := '?'
+                                            ] ifFalse:[
+                                                (changeClass implements:sel asSymbol) ifFalse:[
+                                                    changeDelta := '+'.
+                                                ] ifTrue:[
+                                                    |m currentText t1 t2|
 
-						    m := changeClass compiledMethodAt:sel asSymbol.
-						    currentText := m source.
-						    currentText notNil ifTrue:[
-							text asString = currentText asString ifTrue:[
-							    changeDelta := '='
-							] ifFalse:[
-							    t1 := currentText asCollectionOfLines collect:[:s | s withTabsExpanded].
-							    t2 := text asCollectionOfLines collect:[:s | s withTabsExpanded].
-							    t1 = t2 ifTrue:[
-								changeDelta := '='
-							    ]
-							]
-						    ]
-						]
-					    ]
-					]
-				    ]
-				]
-			    ]
-			].
-			changeString notNil ifTrue:[
-			    entry := MultiColListEntry new.
-			    entry tabulatorSpecification:tabSpec.
-			    entry colAt:1 put:changeDelta.
-			    entry colAt:2 put:changeString.
-			    entry colAt:3 put:changeType.
-			    entry colAt:4 put:timeStampInfo.
-			    changeHeaderLines add:entry
-			] ifFalse:[
-			    headerLine notNil ifTrue:[
-				changeHeaderLines add:headerLine
-			    ]
-			]
-		    ]
-		]
-	    ].
-	    changeClassNames := OrderedCollection new grow:(changeChunks size).
-	    aStream close.
-	    anyChanges := false
-	] valueNowOrOnUnwindDo:[
-	    inBackground ifTrue:[myProcess priority:myPriority].
-	].
+                                                    m := changeClass compiledMethodAt:sel asSymbol.
+                                                    currentText := m source.
+                                                    currentText notNil ifTrue:[
+                                                        text asString = currentText asString ifTrue:[
+                                                            changeDelta := '='
+                                                        ] ifFalse:[
+                                                            t1 := currentText asCollectionOfLines collect:[:s | s withTabsExpanded].
+                                                            t2 := text asCollectionOfLines collect:[:s | s withTabsExpanded].
+                                                            t1 = t2 ifTrue:[
+                                                                changeDelta := '='
+                                                            ]
+                                                        ]
+                                                    ]
+                                                ]
+                                            ]
+                                        ]
+                                    ]
+                                ]
+                            ]
+                        ].
+                        changeString notNil ifTrue:[
+                            entry := MultiColListEntry new.
+                            entry tabulatorSpecification:tabSpec.
+                            entry colAt:1 put:changeDelta.
+                            entry colAt:2 put:changeString.
+                            entry colAt:3 put:changeType.
+                            entry colAt:4 put:timeStampInfo.
+                            changeHeaderLines add:entry
+                        ] ifFalse:[
+                            headerLine notNil ifTrue:[
+                                changeHeaderLines add:headerLine
+                            ]
+                        ]
+                    ]
+                ]
+            ].
+            changeClassNames := OrderedCollection new grow:(changeChunks size).
+            aStream close.
+            anyChanges := false
+        ] valueNowOrOnUnwindDo:[
+            inBackground ifTrue:[myProcess priority:myPriority].
+        ].
     ].
 
     self checkIfFileHasChanged
 
     "Modified: 27.8.1995 / 23:06:55 / claus"
-    "Modified: 3.12.1995 / 18:52:34 / cg"
+    "Modified: 12.12.1995 / 14:34:03 / cg"
 !
 
 selectorOfMethodChange:changeNr
@@ -2022,4 +2030,5 @@
 !ChangesBrowser class methodsFor:'documentation'!
 
 version
-^ '$Header: /cvs/stx/stx/libtool/ChangesBrowser.st,v 1.60 1995-12-12 13:17:13 cg Exp $'! !
+    ^ '$Header: /cvs/stx/stx/libtool/ChangesBrowser.st,v 1.61 1995-12-12 13:35:03 cg Exp $'
+! !