# HG changeset patch # User Claus Gittinger # Date 818775303 -3600 # Node ID 017219e571e403f6b3ea139f258a306ec942706b # Parent 604a906c0eb789ee1953424c3b23c0bbfd56554b more stuff for autoloaded classes diff -r 604a906c0eb7 -r 017219e571e4 CBrowser.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 $' +! ! diff -r 604a906c0eb7 -r 017219e571e4 ChangesBrowser.st --- 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 $' +! !