Marcel Taeumel uploaded a new version of 51Deprecated to project The Trunk:
http://source.squeak.org/trunk/51Deprecated-mt.53.mcz
==================== Summary ====================
Name: 51Deprecated-mt.53
Author: mt
Time: 4 August 2019, 9:37:27.289314 am
UUID: 9267700e-7002-bb4d-be66-86284fa6449f
Ancestors: 51Deprecated-dtl.52
Updates DateAndTime protocol for backwards compatibility to match the recent refactorings in Chronology.
=============== Diff against 51Deprecated-dtl.52 ===============
Item was changed:
----- Method: DateAndTime class>>nowWithOffset: (in category '*51deprecated') -----
nowWithOffset: aDuration
+ "Answer time now as reported by #primitiveUtcWithOffset. If the primitive is not
+ available, answer the Posix epoch with time zone offset aDuration."
+ | timeArray |
+ self deprecated: 'This is just for backwards compatibility. Use DateAndTime class >> #now, which already contains correct offset information.'.
+ timeArray := Time posixMicrosecondClockWithOffset.
+ ^ self utcMicroseconds: timeArray first offset: aDuration asSeconds
+ !
- | clockValue nanos |
- self deprecated: 'use (... now offset: ...) instead'.
- clockValue := Time utcMicrosecondClock.
- "Ensure that consecutive sends of this method return increasing values, by adding small values to the nanosecond part of the created object. The next few lines are assumed to be executed atomically - having no suspension points."
- ((LastClockValue ifNil: [ 0 ]) digitCompare: clockValue) = 0
- ifTrue: [ NanoOffset := NanoOffset + 1 ]
- ifFalse: [ NanoOffset := 0 ].
- LastClockValue := clockValue.
- nanos := clockValue \\ 1000000 * 1000 + NanoOffset.
- clockValue := clockValue // 1000000.
- ^self basicNew
- setJdn: clockValue // SecondsInDay + SqueakEpoch
- seconds: clockValue \\ SecondsInDay
- nano: nanos
- offset: aDuration!
Marcel Taeumel uploaded a new version of Chronology-Core to project The Trunk:
http://source.squeak.org/trunk/Chronology-Core-mt.49.mcz
==================== Summary ====================
Name: Chronology-Core-mt.49
Author: mt
Time: 4 August 2019, 9:36:34.375314 am
UUID: 118bc15d-e640-1344-9342-a9b653675df8
Ancestors: Chronology-Core-dtl.48
Moves compatibility protocol back to 51Deprecated. I think it was moved here by accident.
=============== Diff against Chronology-Core-dtl.48 ===============
Item was removed:
- ----- Method: DateAndTime class>>nowWithOffset: (in category 'squeak protocol') -----
- nowWithOffset: aDuration
- "Answer time now as reported by #primitiveUtcWithOffset. If the primitive is not
- available, answer the Posix epoch with time zone offset aDuration."
-
- | timeArray |
- timeArray := Time posixMicrosecondClockWithOffset.
- ^ self utcMicroseconds: timeArray first offset: aDuration asSeconds
- !
Marcel Taeumel uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-mt.1078.mcz
==================== Summary ====================
Name: System-mt.1078
Author: mt
Time: 2 August 2019, 2:36:47.057946 pm
UUID: 7e1a1567-d617-dd42-aa20-a69264d0fea4
Ancestors: System-mt.1077
Adds missing returns of (constructed) tool windows to system navigation's browse*-calls. Many were already there. Note that there is the non-browse-interface in system navigation to just execute and return queries such as #allCallsOn: vs. #browseAllCallsOn:.
=============== Diff against System-mt.1077 ===============
Item was changed:
----- Method: SystemNavigation>>browseAllCallsOn: (in category 'browse') -----
browseAllCallsOn: aLiteral
"Create and schedule a message browser on each method that refers to aLiteral."
"self default browseAllCallsOn: #open:label:."
+ ^ self headingAndAutoselectForLiteral: aLiteral do: [ :label :autoSelect |
- self headingAndAutoselectForLiteral: aLiteral do: [ :label :autoSelect |
self
browseMessageList: [ self allCallsOn: aLiteral ]
name: label
autoSelect: autoSelect]!
Item was changed:
----- Method: SystemNavigation>>browseAllCallsOn:and:localToPackage: (in category 'browse') -----
browseAllCallsOn: literal1 and: literal2 localToPackage: packageNameOrInfo
"Create and schedule a message browser on each method in the given package that refers to both literal1 and literal2."
"self default browseAllCallsOn: #open:label: localToPackage: 'Tools'."
+ ^ self headingAndAutoselectForLiteral: literal1 do: [ :label :autoSelect |
- self headingAndAutoselectForLiteral: literal1 do: [ :label :autoSelect |
self
browseMessageList: [
self
allCallsOn: literal1
and: literal2
localToPackage: packageNameOrInfo ]
name: label, ' local to package ', (self packageInfoFor: packageNameOrInfo) name
autoSelect: autoSelect ]!
Item was changed:
----- Method: SystemNavigation>>browseAllCallsOn:localTo: (in category 'browse') -----
browseAllCallsOn: aLiteral localTo: aBehavior
"Create and schedule a message browser on each method in or below the given class that refers to aLiteral."
"self default browseAllCallsOn: #open:label: localTo: CodeHolder"
aBehavior ifNil: [ ^self inform: 'No behavior selected.' ].
+ ^ self headingAndAutoselectForLiteral: aLiteral do: [ :label :autoSelect |
- self headingAndAutoselectForLiteral: aLiteral do: [ :label :autoSelect |
self
browseMessageList: [ self allCallsOn: aLiteral from: aBehavior ]
name: label, ' local to ', aBehavior name
autoSelect: autoSelect ]!
Item was changed:
----- Method: SystemNavigation>>browseAllCallsOn:localToPackage: (in category 'browse') -----
browseAllCallsOn: aLiteral localToPackage: packageNameOrInfo
"Create and schedule a message browser on each method in the given package that refers to aLiteral."
"self default browseAllCallsOn: #open:label: localToPackage: 'Tools'."
+ ^ self headingAndAutoselectForLiteral: aLiteral do: [ :label :autoSelect |
- self headingAndAutoselectForLiteral: aLiteral do: [ :label :autoSelect |
self
browseMessageList: [
self
allCallsOn: aLiteral
localToPackage: packageNameOrInfo ]
name: label, ' local to package ', (self packageInfoFor: packageNameOrInfo) name
autoSelect: autoSelect ]!
Item was changed:
----- Method: SystemNavigation>>browseAllCallsOnClass: (in category 'browse') -----
browseAllCallsOnClass: aBehaviorOrBinding
"Create and schedule a message browser on each method that refers to aBehavior."
"self default browseAllCallsOnClass: Array"
| behaviorName |
behaviorName := aBehaviorOrBinding isBehavior
ifTrue: [aBehaviorOrBinding theNonMetaClass name]
ifFalse: [aBehaviorOrBinding key].
+ ^ self
- self
browseMessageList: [ self allCallsOnClass: aBehaviorOrBinding ]
name: 'Users of ', behaviorName
autoSelect: behaviorName!
Item was changed:
----- Method: SystemNavigation>>browseAllImplementorsOf:localToPackage: (in category 'browse') -----
browseAllImplementorsOf: selector localToPackage: packageNameOrInfo
"Create and schedule a message browser on each method in the given package
that implements the message whose selector is the argument, selector. For example,
SystemNavigation new browseAllImplementorsOf: #at:put: localToPackage: 'Collections'."
+ ^ self browseMessageList: (self
- self browseMessageList: (self
allImplementorsOf: selector
localToPackage: packageNameOrInfo)
name: 'Implementors of ' , selector,
' local to package ', (self packageInfoFor: packageNameOrInfo) name!
Item was changed:
----- Method: SystemNavigation>>browseAllImplementorsOfList: (in category 'browse') -----
browseAllImplementorsOfList: selectorList
"Create and schedule a message browser on each method that implements
the message whose selector is in the argument selectorList. For example,
Smalltalk browseAllImplementorsOf: #(at:put: size).
1/16/96 sw: defer to the titled version"
+ ^ self browseAllImplementorsOfList: selectorList title: 'Implementors of all'!
- self browseAllImplementorsOfList: selectorList title: 'Implementors of all'!
Item was changed:
----- Method: SystemNavigation>>browseAllObjectReferencesTo:except:ifNone: (in category 'browse') -----
browseAllObjectReferencesTo: anObject except: objectsToExclude ifNone: aBlock
"Bring up a list inspector on the objects that point to anObject.
If there are none, then evaluate aBlock on anObject. "
| aList shortName |
aList := Utilities pointersTo: anObject except: objectsToExclude.
aList size > 0 ifFalse: [^aBlock value: anObject].
shortName := (anObject name ifNil: [anObject printString]) contractTo: 20.
+ ^ aList inspectWithLabel: 'Objects pointing to ' , shortName!
- aList inspectWithLabel: 'Objects pointing to ' , shortName!
Item was changed:
----- Method: SystemNavigation>>browseAllReferencesToPool:from: (in category 'browse') -----
browseAllReferencesToPool: poolOrName from: aClass
"Open a message list on all messages referencing the given pool"
| pool list |
(poolOrName isString)
ifTrue:[pool := Smalltalk at: poolOrName asSymbol]
ifFalse:[pool := poolOrName].
list := self allReferencesToPool: pool from: aClass.
+ ^ self
- self
browseMessageList: list
+ name: 'users of ', poolOrName name!
- name: 'users of ', poolOrName name.
- ^list!
Item was changed:
----- Method: SystemNavigation>>browseAllUnSentMessages (in category 'browse') -----
browseAllUnSentMessages
"Create and schedule a message browser on each method whose message is not sent in any method in the system."
"self new browseAllUnSentMessages"
+ ^ self browseAllImplementorsOfList: self allUnSentMessages title: 'Messages implemented but not sent'!
- self browseAllImplementorsOfList: self allUnSentMessages title: 'Messages implemented but not sent'
- !
Item was changed:
----- Method: SystemNavigation>>browseAllUnimplementedCalls (in category 'browse') -----
browseAllUnimplementedCalls
"Create and schedule a message browser on each method that includes a
message that is not implemented in any object in the system."
+ ^self browseMessageList: self allUnimplementedCalls name: 'Unimplemented calls'!
- ^self browseMessageList: self allUnimplementedCalls name: 'Unimplemented calls'!
Item was changed:
----- Method: SystemNavigation>>browseClass: (in category 'browse') -----
browseClass: aBehavior
| targetClass |
targetClass := aBehavior isMeta
ifTrue: [aBehavior theNonMetaClass]
ifFalse: [aBehavior ].
+ ^ ToolSet browse: targetClass selector: nil!
- ToolSet browse: targetClass selector: nil!
Item was changed:
----- Method: SystemNavigation>>browseClassesWithNamesContaining:caseSensitive: (in category 'browse') -----
browseClassesWithNamesContaining: aString caseSensitive: caseSensitive
"SystemNavigation default browseClassesWithNamesContaining: 'eMorph' caseSensitive: true "
"Launch a class-list list browser on all classes whose names containg aString as a substring."
| suffix aList |
suffix := caseSensitive
ifTrue: [' (case-sensitive)']
ifFalse: [' (use shift for case-sensitive)'].
aList := OrderedCollection new.
Cursor wait
showWhile: [Smalltalk
allClassesDo: [:class | (class name includesSubstring: aString caseSensitive: caseSensitive)
ifTrue: [aList add: class name]]].
+ ^ ToolSet openClassListBrowser: aList asSet sorted title: 'Classes whose names contain ' , aString , suffix!
- aList size > 0
- ifTrue: [ToolSet openClassListBrowser: aList asSet sorted title: 'Classes whose names contain ' , aString , suffix]!
Item was changed:
----- Method: SystemNavigation>>browseHierarchy: (in category 'browse') -----
browseHierarchy: aBehavior
| targetClass |
targetClass := aBehavior isMeta
ifTrue: [aBehavior theNonMetaClass]
ifFalse: [aBehavior ].
+ ^ ToolSet browseHierarchy: targetClass selector: nil!
- ToolSet browseHierarchy: targetClass selector: nil.!
Item was changed:
----- Method: SystemNavigation>>browseMethodsWhoseNamesContain: (in category 'browse') -----
browseMethodsWhoseNamesContain: aString
"Launch a tool which shows all methods whose names contain the given string; case-insensitive.
· 1/16/1996 sw, at the dawn of Squeak: this was the classic implementation that provided the underpinning for the 'method names containing it' (cmd-shift-W) feature that has always been in Squeak -- the feature that later inspired the MethodFinder (aka SelectorBrowser).
· sw 7/27/2001: Switched to showing a MessageNames tool rather than a message-list browser, if in Morphic."
+ ^ Smalltalk isMorphic
+ ifTrue: [ToolSet browseMessageNames: aString]
+ ifFalse: [
+ self
+ browseAllImplementorsOfList: (Symbol selectorsContaining: aString)
+ title: 'Methods whose names contain ''', aString, '''']!
- | aList |
- Smalltalk isMorphic
- ifFalse:
- [aList := Symbol selectorsContaining: aString.
- aList size > 0 ifTrue:
- [self browseAllImplementorsOfList: aList title: 'Methods whose names contain ''', aString, '''']]
-
- ifTrue:
- [ToolSet browseMessageNames: aString]
- !
Item was changed:
----- Method: SystemNavigation>>browseMethodsWithLiteral: (in category 'browse') -----
browseMethodsWithLiteral: aString
"Launch a browser on all methods that contain string literals with aString as a substring. Make the search case-sensitive or insensitive as dictated by the caseSensitive boolean parameter"
+ ^ self browseAllSelect:
- self browseAllSelect:
[:method |
method hasLiteralSuchThat: [:lit |
(lit isString and: [lit isSymbol not]) and:
[lit = aString]]]
name: 'Methods with string ', aString printString
+ autoSelect: aString!
- autoSelect: aString.
- !
Item was changed:
----- Method: SystemNavigation>>browseMethodsWithString:matchCase: (in category 'browse') -----
browseMethodsWithString: aString matchCase: caseSensitive
"Launch a browser on all methods that contain string literals with aString as a substring. Make the search case-sensitive or insensitive as dictated by the caseSensitive boolean parameter"
+ ^ self
- self
browseMessageList: (self allMethodsWithString: aString matchCase: caseSensitive)
name: 'Methods with string ', aString printString, (caseSensitive ifTrue: [' (case-sensitive)'] ifFalse: [' (case-insensitive)'])
autoSelect: aString!
Item was changed:
----- Method: SystemNavigation>>browseMyChanges (in category 'browse') -----
browseMyChanges
"Browse only the changes (in the changes file) by the current author."
"SystemNavigation default browseMyChanges"
+ ^ self browseAllSelect: [ :method |
- self browseAllSelect: [ :method |
method fileIndex > 1 "only look at changes file"
and: [ method timeStamp beginsWith: Utilities authorInitials ]]!
Item was changed:
----- Method: SystemNavigation>>browseObsoleteMethodReferences (in category 'browse') -----
browseObsoleteMethodReferences
"Open a browser on all referenced behaviors that are obsolete"
"SystemNavigation default browseObsoleteMethodReferences"
| list |
list := self obsoleteMethodReferences.
+ ^ self
- self
browseMessageList: list
name: 'Method referencing obsoletes'
autoSelect: nil!
Item was changed:
----- Method: SystemNavigation>>browseObsoleteReferences (in category 'browse') -----
browseObsoleteReferences
"self new browseObsoleteReferences"
| references |
references := OrderedCollection new.
(LookupKey allSubInstances select:
[:x | ((x value isKindOf: Behavior) and: ['AnOb*' match: x value name]) or:
['AnOb*' match: x value class name]])
do: [:x | references addAll: (self allCallsOn: x)].
+ ^ self
- self
browseMessageList: references
name: 'References to Obsolete Classes'!
Item was changed:
----- Method: SystemNavigation>>browseUncommentedMethodsWithInitials: (in category 'browse') -----
browseUncommentedMethodsWithInitials: targetInitials
"Browse uncommented methods whose initials (in the time-stamp, as logged to disk) match the given initials. Present them in chronological order. CAUTION: It will take several seconds for this to complete."
"Time millisecondsToRun: [SystemNavigation default browseUncommentedMethodsWithInitials: 'jm']"
+ ^ self
- self
browseMessageList: [ self allUncommentedMethodsWithInitials: targetInitials ]
name: 'Uncommented methods with initials ', targetInitials
autoSelect: nil!
Marcel Taeumel uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-mt.1077.mcz
==================== Summary ====================
Name: System-mt.1077
Author: mt
Time: 2 August 2019, 9:41:45.097893 am
UUID: 17934490-ca26-3a43-8081-80f2add3bcd6
Ancestors: System-mt.1076
Extracts class/trait pattern-based lookup into system navigation. Was hidden in UIManager.
=============== Diff against System-mt.1076 ===============
Item was added:
+ ----- Method: SystemNavigation>>allClassesAndTraitsMatching: (in category 'query') -----
+ allClassesAndTraitsMatching: pattern
+ "Given a pattern and an environment, try to find a class or trait using several strategies:
+ - EXACT: If there is a class or trait whose name exactly given by pattern, return it.
+ - UPPER: If the pattern is upper-case only, find camel-case letters with that sequence.
+ - WILD: Try the pattern as-is for regular wild-card search.
+ - FEATURE: Split patterns at feature boundaries and insert wild cards between.
+ - FUZZY: Split patterns at feature boundaries BUT treat each feature as a full class name.
+ If there is only one class or trait in the given environment whose name matches pattern, return it. Otherwise, put up a menu offering the names of all classes that match pattern, and return the class chosen, else nil if nothing chosen.
+
+ !!!! In any case, separator characters in the pattern are ignored."
+
+ | toMatch potentialNames names |
+
+ "If there's a class or trait named as pattern, then return it."
+ (environment classOrTraitNamed: pattern) ifNotNil: [:classOrTrait | ^ {classOrTrait}].
+
+ "Validate pattern."
+ toMatch := pattern copyWithoutAll: Character separators.
+ toMatch := toMatch asLowercase copyWithout: $..
+ toMatch ifEmpty: [ ^ #() ].
+
+ "Fetch search space."
+ names := OrderedCollection new.
+ potentialNames := environment classAndTraitNames.
+
+ "Try uppercase-only patterns for patterns such as 'WKD' to find 'WeakIdentityKeyDictionary' etc."
+ (pattern allSatisfy: [:char | char isUppercase]) ifTrue: [
+ | patternSize |
+ patternSize := pattern size.
+ potentialNames do: [ :eachName |
+ | lookupIndex characterIndex |
+ lookupIndex := 0.
+ characterIndex := 1.
+ [ (lookupIndex := eachName
+ indexOf: (pattern at: characterIndex)
+ startingAt: lookupIndex + 1) > 0
+ and: [ (characterIndex := characterIndex + 1) <= patternSize ] ] whileTrue.
+ lookupIndex > 0 ifTrue: [ names add: eachName ] ] ].
+
+ "Try wildcard search for patterns such as 'Weak*Dict*' to find 'WeakIdentityKeyDictionary' etc."
+ names ifEmpty: [
+ potentialNames do: [ :each | (toMatch match: each) ifTrue: [ names add: each ] ].
+ "Try feature-based search for patterns such as 'WeakDict' to find 'WeakIdentityKeyDictionary' etc."
+ names ifEmpty: [
+ "1) Insert wildcards between features and at the end."
+ toMatch := ((pattern copyWithoutAll: '.*#') findFeatures joinSeparatedBy: '*'), '*'.
+ potentialNames do: [ :each | (toMatch match: each) ifTrue: [ names add: each ] ].
+ names ifEmpty: [
+ "2) Insert wildcards before, between, and after features."
+ toMatch := '*', toMatch.
+ potentialNames do: [ :each | (toMatch match: each) ifTrue: [ names add: each ] ] ] ] ].
+
+ "Try some fuzzy matching."
+ pattern suggestedTypeNames do: [ :each |
+ (potentialNames includes: each) ifTrue: [ names add: each ] ].
+
+ "Still no match?"
+ ^ names collect: [ :each | environment classOrTraitNamed: each ]
+ !
Marcel Taeumel uploaded a new version of Tests to project The Trunk:
http://source.squeak.org/trunk/Tests-mt.414.mcz
==================== Summary ====================
Name: Tests-mt.414
Author: mt
Time: 2 August 2019, 9:22:12.059774 am
UUID: 0be66466-bc31-9d4d-bfd4-0862b63bbfcc
Ancestors: Tests-ul.413
Updates tests for system navigation. Use TGriffle instead of Griffle because only TGriffle has a method with actual sends in it. Drop the #+ filter because it has no effect and there was no other reason stated in the (missing) comments.
=============== Diff against Tests-ul.413 ===============
Item was changed:
----- Method: SystemNavigationTest>>testAllSentMessagesWithout (in category 'tests') -----
testAllSentMessagesWithout
self
assert: (#(foo bar) asIdentitySet
addAll: Smalltalk presumedSentMessages;
addAll: Smalltalk specialSelectorNames;
yourself)
+ equals: (sysNav allSentMessagesWithout: {{}. {}}).
+
+ self
+ assert: (IdentitySet new
+ addAll: Smalltalk presumedSentMessages;
+ addAll: Smalltalk specialSelectorNames;
+ yourself)
+ equals: (sysNav allSentMessagesWithout: {{env at: #TGriffle}. {}}).!
- equals: (sysNav allSentMessagesWithout: {{env at: #Griffle}. {#+}}).!
Item was changed:
----- Method: SystemNavigationTest>>testAllUnusedClassesWithout (in category 'tests') -----
testAllUnusedClassesWithout
+
+ self
+ assert: (IdentitySet with: #Unused)
+ equals: ((SystemNavigation for: env) allUnusedClassesWithout: {{}. {}}).
+
+ "The classes passed to #allUnusedClassesWithout: are not filtered from the list. They're classes whose methods are not examined for global references."
+ self
+ deny: ((SystemNavigation for: env) allUnusedClassesWithout: {{#Unused}. {}}) isEmpty
+ description: 'Where did Unused go?'.!
- self assert: (IdentitySet with: #Unused) equals: ((SystemNavigation for: env) allUnusedClassesWithout: {{}. {}}).
- "The classes passed to #allUnusedClassesWithout: are not filtered from the list. They're classes whose methods are not examined for global references."
- self deny: ((SystemNavigation for: env) allUnusedClassesWithout: {{#Unused}. {}}) isEmpty description: 'Where did Unused go?'.!
Marcel Taeumel uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-mt.1076.mcz
==================== Summary ====================
Name: System-mt.1076
Author: mt
Time: 2 August 2019, 9:20:11.092774 am
UUID: fbc3d082-9bf6-9c4e-bbdc-68998f044637
Ancestors: System-mt.1075
Fixes sent-messages and global-refs lookup in system navigation.
=============== Diff against System-mt.1075 ===============
Item was changed:
----- Method: SystemNavigation>>allGlobalRefsWithout: (in category 'query') -----
allGlobalRefsWithout: classesAndMessagesPair
"Answer a set of symbols that may be refs to Global names. In some
sense we should only need the associations, but this will also catch, eg,
HTML tag types. This method computes its result in the absence of
specified classes and messages."
+
- "may be a problem if namespaces are introduced as for the moment
- only Smalltalk is queried. sd 29/4/03"
| globalRefs absentClasses absentSelectors |
globalRefs := IdentitySet new: CompiledMethod instanceCount.
absentClasses := classesAndMessagesPair first.
absentSelectors := classesAndMessagesPair second.
"sd 29/04/03"
Cursor execute
+ showWhile: [self environment allClassesAndTraitsDo:
+ [:cls | ((absentClasses includes: cls)
- showWhile: [self environment allClassesDo:
- [:cls | ((absentClasses includes: cls name)
ifTrue: [{}]
ifFalse: [{cls. cls class}])
do: [:cl | (absentSelectors isEmpty
ifTrue: [cl selectors]
ifFalse: [cl selectors copyWithoutAll: absentSelectors])
do: [:sel | "Include all capitalized symbols for good
measure"
(cl compiledMethodAt: sel) allLiteralsDo: [:m |
((m isSymbol)
and: [m size > 0
and: [m first canBeGlobalVarInitial]])
ifTrue: [globalRefs add: m].
]]]]].
^ globalRefs!
Item was changed:
----- Method: SystemNavigation>>allSentMessagesWithout: (in category 'query') -----
allSentMessagesWithout: classesAndMessagesPair
"Answer the set of selectors which are sent somewhere in the system,
computed in the absence of the supplied classes and messages."
| sent absentClasses absentSelectors |
sent := IdentitySet new: CompiledMethod instanceCount.
absentClasses := classesAndMessagesPair first.
absentSelectors := classesAndMessagesPair second.
"sd 29/04/03"
Cursor execute showWhile: [
self environment allClassesAndTraitsDo: [:cls |
+ ((absentClasses includes: cls)
- ((absentClasses includes: cls name)
ifTrue: [{}]
ifFalse: [{cls. cls classSide}])
do: [:each | (absentSelectors isEmpty
ifTrue: [each selectors]
ifFalse: [each selectors copyWithoutAll: absentSelectors])
do: [:sel | "Include all sels, but not if sent by self"
(each compiledMethodAt: sel) allLiteralsDo: [:m |
+ self flag: #dicuss. "mt: How to distinguish a symbol from a selector?"
+ (m isSymbol and: [m first isLowercase])
+ ifTrue: ["might be sent"
+ m == sel ifFalse: [sent add: m]].
- (m isSymbol)
- ifTrue: ["might be sent"
- m == sel
- ifFalse: [sent add: m]].
]]]]].
"The following may be sent without being in any literal frame"
Smalltalk specialSelectorNames do: [:sel | sent add: sel].
Smalltalk presumedSentMessages do: [:sel | sent add: sel].
^ sent.!
Levente Uzonyi uploaded a new version of Tests to project The Trunk:
http://source.squeak.org/trunk/Tests-ul.413.mcz
==================== Summary ====================
Name: Tests-ul.413
Author: ul
Time: 1 August 2019, 9:51:08.722178 pm
UUID: 1e029922-e849-4e3b-8cd0-f29666968f47
Ancestors: Tests-mt.412
ShoutCore depends on Files and Chronology-Core due to the new #benchmark method of SHParserST80.
=============== Diff against Tests-mt.412 ===============
Item was changed:
----- Method: PackageDependencyTest>>testShoutCore (in category 'tests') -----
testShoutCore
self testPackage: #ShoutCore dependsExactlyOn: #(
Collections
Environments
Graphics
Kernel
Monticello
System
Compiler
Tools
+ Files
+ #'Chronology-Core'
).!
Fabio Niephaus uploaded a new version of ToolBuilder-Morphic to project The Trunk:
http://source.squeak.org/trunk/ToolBuilder-Morphic-fn.231.mcz
==================== Summary ====================
Name: ToolBuilder-Morphic-fn.231
Author: fn
Time: 1 August 2019, 7:05:12.923263 pm
UUID: 8b938bad-eb6d-4af2-ac47-8699f2f1f6c7
Ancestors: ToolBuilder-Morphic-fn.230
Sort directory names in FileAbstractSelectionDialog>>subDirectoriesOf:. This makes it way easier to find things (e.g. run `UIManager default chooseDirectory`).
=============== Diff against ToolBuilder-Morphic-fn.230 ===============
Item was changed:
----- Method: FileAbstractSelectionDialog>>subDirectoriesOf: (in category 'directory tree') -----
subDirectoriesOf: aDirectory
+ ^aDirectory directoryNames sorted collect:[:each| aDirectory directoryNamed: each].!
-
- ^aDirectory directoryNames collect:[:each| aDirectory directoryNamed: each].!