[squeak-dev] The Trunk: Tools-ct.1088.mcz

Marcel Taeumel marcel.taeumel at hpi.de
Wed Dec 15 16:34:21 UTC 2021

Wohoo! Thanks Christoph :-)
Am 15.12.2021 17:33:16 schrieb commits at source.squeak.org <commits at source.squeak.org>:
Christoph Thiede uploaded a new version of Tools to project The Trunk:

==================== Summary ====================

Name: Tools-ct.1088
Author: ct
Time: 15 December 2021, 5:32:59.422981 pm
UUID: a9ceffaa-ef67-1b40-810a-10eb05924c75
Ancestors: Tools-mt.1087, Tools-ct.1057, Tools-ct.1086, Tools-ct.1067, Tools-ct.1063, Tools-ct.1066, Tools-ct.1062, Tools-ct.1044

Merges some recent fixes. Still a lot of open things to review, though. :-)

Fixes minor bugs and regressions in ChangeSorters (brittle selection, button decorations).

Revision: Update currentCompiledMethod in ChangeSorter >> #setContents.

Workaround for missing updates of forms in inspectors.

FileList: When adding a new file or directory that already exists, show a dialog intead of letting the primitive error passing.

Fixes TextLinks to the comment, definition, or hierarchy of a class (available from the 'change emphasis' dialog, Cmd + 6).

Updates well known processes in the process browser to make the changes from Tools-eem.1016 visible (see postscript).

Fixes a bug in process browser when canceling the "change priority" dialog.

Revision: Prefer Project uiManager over UIManager default also in sibling methods.

Fixes styling in MessageSets when prettyPrint is turned on.

Note: For each merged patch, you can read up the full message and diff in the original inbox version. :-)

=============== Diff against Tools-mt.1087 ===============

Item was changed:
----- Method: ChangeSorter>>currentSelector: (in category 'message list') -----
currentSelector: messageName

currentSelector := messageName.
self changed: #currentSelector.
self setContents.
+ self contentsChanged.
+ self decorateButtons.!
- self contentsChanged.!

Item was changed:
----- Method: ChangeSorter>>initialize (in category 'initialize') -----
super initialize.
+ self showChangeSet: ChangeSet current.!
- myChangeSet := ChangeSet current.!

Item was changed:
----- Method: ChangeSorter>>setContents (in category 'code pane') -----
"return the source code that shows in the bottom pane"

| sel class strm changeType |
self clearUserEditFlag.
contentsAreStyleable := false.
+ currentCompiledMethod := nil.
myChangeSet ifNil: [^ contents := String empty]. "should not happen but can"
currentClassName ifNil: [^ contents := myChangeSet preambleString ifNil: [String empty]].
class := self selectedClassOrMetaClass.
(sel := self selectedMessageName) == nil
ifFalse: [changeType := (myChangeSet atSelector: (sel := sel asSymbol) class: class).
changeType == #remove
ifTrue: [^ contents := 'Method has been removed (see versions)'].
changeType == #addedThenRemoved
ifTrue: [^ contents := 'Added then removed (see versions)'].
class ifNil: [^ contents := 'Method was added, but cannot be found!!'].
(class includesSelector: sel)
ifFalse: [^ contents := 'Method was added, but cannot be found!!'].
contentsAreStyleable := true.
+ currentCompiledMethod := class compiledMethodAt: sel.
contents := class sourceCodeAt: sel.
(#(prettyPrint prettyDiffs) includes: contentsSymbol) ifTrue:
[contents := class prettyPrinterClass
format: contents in: class notifying: nil].
self showingAnyKindOfDiffs ifTrue: [
contentsAreStyleable := false.
contents := self diffFromPriorSourceFor: contents].
^ contents := contents asText makeSelectorBoldIn: class]
ifTrue: [strm := WriteStream on: (String new: 100).
(myChangeSet classChangeAt: (self withoutItemAnnotation: currentClassName)) do:
[:each |
each = #remove ifTrue: [strm nextPutAll: 'Entire class was removed.'; cr].
each = #addedThenRemoved ifTrue: [strm nextPutAll: 'Class was added then removed.'].
each = #rename ifTrue: [strm nextPutAll: 'Class name was changed.'; cr].
each = #add ifTrue: [strm nextPutAll: 'Class definition was added.'; cr].
each = #change ifTrue: [strm nextPutAll: 'Class definition was changed.'; cr].
each = #reorganize ifTrue: [strm nextPutAll: 'Class organization was changed.'; cr].
each = #comment ifTrue: [strm nextPutAll: 'New class comment.'; cr.
^ contents := strm contents].!

Item was changed:
----- Method: ChangeSorter>>updateIfNecessary (in category 'changeSet menu') -----
"Recompute all of my panes."

| newList |
self okToChange ifFalse: [^ self].
myChangeSet ifNil: [^ self]. "Has been known to happen though shouldn't"
(myChangeSet isMoribund) ifTrue:
[self changed: #changeSetList.
^ self showChangeSet: ChangeSet current].
newList := self changeSetList.
(priorChangeSetList == nil or: [priorChangeSetList ~= newList])
[priorChangeSetList := newList.
+ self changed: #changeSetList].!
- self changed: #changeSetList].
- self showChangeSet: myChangeSet!

Item was changed:
----- Method: FileList>>addNew:byEvaluating: (in category 'file menu action') -----
addNew: aString byEvaluating: aBlock
"A parameterization of earlier versions of #addNewDirectory and
#addNewFile. Fixes the bug in each that pushing the cancel button
in the FillInTheBlank dialog gave a walkback."

| response newName index ending |
self okToChange ifFalse: [^ self].
(response := UIManager default
request: ('New {1} Name?' translated format: {aString translated})
initialAnswer: ('{1}Name' translated format: {aString translated}))
isEmpty ifTrue: [^ self].
newName := response asFileName.
+ (Cursor wait showWhile: [
+ directory fileOrDirectoryExists: newName])
+ ifTrue: [^ self inform: ('''{1}'' already exists' translated format: {newName})].
Cursor wait showWhile: [
aBlock value: newName].
self updateFileList.
index := list indexOf: newName.
index = 0 ifTrue: [ending := ') ',newName.
index := list findFirst: [:line | line endsWith: ending]].
self fileListIndex: index.

Item was changed:
----- Method: FormInspector>>embedForm:inText: (in category 'support') -----
embedForm: aForm inText: stringOrText

+ ^ stringOrText asText
+ , ((' (hash: {1})' translated format: {aForm bits hash})
+ flag: #workaround "ct: Currently, text equality ignores attributes. Add a hash of the form's bits to the text to ensure that it will be re-rendered in Morphic inspectors. In the long term, we should redefine Text >> #= instead. See: http://lists.squeakfoundation.org/pipermail/squeak-dev/2020-September/211358.html";
+ yourself)
+ , String cr
+ , (Text string: ' ' attribute:
- ^ stringOrText asText, String cr,
- (Text string: ' ' attribute:
(TextFontReference toFont:
(FormSetFont new
fromFormArray: (Array with: (aForm copy offset: 0 at 0))
asciiStart: Character space asInteger
ascent: aForm height)))!

Item was changed:
----- Method: MessageSet>>aboutToStyle: (in category 'code pane') -----
aboutToStyle: aPluggableShoutMorphOrView
"This is a notification that aPluggableShoutMorphOrView is about to re-style its text.
Set the classOrMetaClass in aPluggableShoutMorphOrView, so that identifiers
will be resolved correctly.
Answer true to allow styling to proceed, or false to veto the styling"

| selectedMessageName showingMethod |
+ self isModeStyleable ifFalse: [^false].
- self showingSource ifFalse: [^false].
selectedMessageName := self selectedMessageName.
showingMethod := (#(Comment Definition Hierarchy) includes: selectedMessageName) not.
"Hack!! setting classOrMetaClass: to nil allows doit or class definition colouring."
aPluggableShoutMorphOrView classOrMetaClass: (showingMethod ifTrue: [self selectedClassOrMetaClass]).
^(#(Comment Hierarchy) includes: selectedMessageName) not!

Item was changed:
----- Method: Model>>addItem: (in category '*Tools') -----
addItem: classAndMethod
"Open a browser directly on the given class and method

Model new addItem: 'Model addItem:'
Model new addItem: 'Model>>addItem:'

self flag: #mref. "classAndMethod is a String"
parse: classAndMethod
toClassAndSelector: [ :class :sel |
class ifNil: [^self].
+ sel = #Comment ifTrue: [^ Browser fullOnClassComment: class].
+ sel = #Definition ifTrue: [^ Browser newOnClass: class].
+ sel = #Hierarchy ifTrue: [^ HierarchyBrowser fullOnClass: class].
Browser newOnClass: class selector: sel


Item was changed:
----- Method: ProcessBrowser>>changePriority (in category 'process actions') -----
| str newPriority nameAndRules |
nameAndRules := self nameAndRulesForSelectedProcess.
+ nameAndRules third ifFalse: [
+ ^ self inform: ('Nope, won''t change priority of {1}' translated format: {nameAndRules first})].
+ str := Project uiManager
+ request: 'New priority' translated
+ initialAnswer: selectedProcess priority asString.
+ str isEmptyOrNil ifTrue: [^ self].
- nameAndRules third
- ifFalse: [self inform: 'Nope, won''t change priority of ' , nameAndRules first.
- ^ self].
- str := UIManager default
- request: 'New priority'
- initialAnswer: selectedProcess priority asString.
newPriority := str asNumber asInteger.
+ newPriority ifNil: [^ self].
- newPriority
- ifNil: [^ self].
(newPriority < 1
or: [newPriority > Processor highestPriority])
+ ifTrue: [^ self inform: 'Bad priority' translated].
- ifTrue: [self inform: 'Bad priority'.
- ^ self].
self class setProcess: selectedProcess toPriority: newPriority.
+ self updateProcessList.!
- self updateProcessList!

Item was changed:
----- Method: ProcessBrowser>>findContext (in category 'process list') -----
| initialProcessIndex initialStackIndex found |
initialProcessIndex := self processListIndex.
initialStackIndex := self stackListIndex.
+ searchString := Project uiManager
+ request: 'Enter a string to search for in the process stack lists' translated
+ initialAnswer: searchString.
- searchString := UIManager default
- request: 'Enter a string to search for in the process stack lists'
- initialAnswer: searchString.
searchString isEmpty
ifTrue: [^ false].
self processListIndex: 1.
self stackListIndex: 1.
found := self nextContext.
ifFalse: [self processListIndex: initialProcessIndex.
self stackListIndex: initialStackIndex].
^ found!

Item was changed:
----- Method: ProcessBrowser>>messageTally (in category 'stack list') -----
| secString secs |
+ secString := Project uiManager request: 'Profile for how many seconds?' translated initialAnswer: '4'.
- secString := UIManager default request: 'Profile for how many seconds?' initialAnswer: '4'.
secString isEmptyOrNil ifTrue: [^ self].
secs := secString asNumber asInteger.
(secs isNil or: [secs isZero])
ifTrue: [^ self].
[ TimeProfileBrowser spyOnProcess: selectedProcess forMilliseconds: secs * 1000 ] forkAt: selectedProcess priority + 1.!

Item was changed:
(PackageInfo named: 'Tools') postscript: 'Workspace allInstances do: [:workspace |
(workspace instVarNamed: #bindings)
removeKey: #''_fileDirectory'' ifAbsent: nil;
removeKey: #''_windowTitle'' ifAbsent: nil;
+ removeKey: #''_fileLineConversion'' ifAbsent: nil].
+ ProcessBrowser registerWellKnownProcesses. "Tools-eem.1016"'!
- removeKey: #''_fileLineConversion'' ifAbsent: nil].'!

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20211215/e2639a2d/attachment.html>

More information about the Squeak-dev mailing list