[squeak-dev] The Inbox: Kernel-ct.1287.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Dec 13 18:01:08 UTC 2019


A new version of Kernel was added to project The Inbox:
http://source.squeak.org/inbox/Kernel-ct.1287.mcz

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

Name: Kernel-ct.1287
Author: ct
Time: 13 December 2019, 7:01:04.635029 pm
UUID: b748ffbb-527a-3c42-8669-654a28068319
Ancestors: Kernel-mt.1286

Fixes selector classification with special category names, such as the all category or the null category.

Reproduce this issue by moving a method from one class into another and dropping it over the all category.

This bug might probably be the reason why we Utilities >> #fixUpProblemsWithAllCategory was introduced.

=============== Diff against Kernel-mt.1286 ===============

Item was changed:
  ----- Method: Categorizer>>addCategory:before: (in category 'accessing') -----
  addCategory: catString before: nextCategory
  	"Add a new category named heading.
  	If default category exists and is empty, remove it.
  	If nextCategory is nil, then add the new one at the end,
  	otherwise, insert it before nextCategory."
  	| index newCategory |
  	newCategory := catString asSymbol.
  	(categoryArray indexOf: newCategory) > 0
  		ifTrue: [^self].	"heading already exists, so done"
+ 	(self isSpecialCategoryName: newCategory)
+ 		ifTrue: [^self inform: 'This category name is system reserved' translated].
  	index := categoryArray indexOf: nextCategory
  		ifAbsent: [categoryArray size + 1].
  	categoryArray := categoryArray
  		copyReplaceFrom: index
  		to: index-1
  		with: (Array with: newCategory).
  	categoryStops := categoryStops
  		copyReplaceFrom: index
  		to: index-1
  		with: (Array with: (index = 1
  				ifTrue: [0]
  				ifFalse: [categoryStops at: index-1])).
  	"remove empty default category"
  	(newCategory ~= Default
  			and: [(self listAtCategoryNamed: Default) isEmpty])
  		ifTrue: [self removeCategory: Default]!

Item was changed:
  ----- Method: Categorizer>>classify:under:suppressIfDefault: (in category 'classifying') -----
  classify: element under: heading suppressIfDefault: aBoolean
  	"Store the argument, element, in the category named heading.   If aBoolean is true, then invoke special logic such that the classification is NOT done if the new heading is the Default and the element already had a non-Default classification -- useful for filein"
  
  	| catName catIndex elemIndex realHeading |
+ 	realHeading := (heading isNil or: [self isSpecialCategoryName: heading])
+ 		ifTrue: [Default]
+ 		ifFalse: [heading asSymbol].
- 	((heading = NullCategory) or: [heading == nil])
- 		ifTrue: [realHeading := Default]
- 		ifFalse: [realHeading := heading asSymbol].
  	(catName := self categoryOfElement: element) = realHeading
  		ifTrue: [^ self].  "done if already under that category"
  
+ 	catName ifNotNil: [
+ 		(aBoolean and: [realHeading = Default])
- 	catName ~~ nil ifTrue: 
- 		[(aBoolean and: [realHeading = Default])
  				ifTrue: [^ self].	  "return if non-Default category already assigned in memory"
  		self basicRemoveElement: element].	"remove if in another category"
  
  	(categoryArray indexOf: realHeading) = 0 ifTrue: [self addCategory: realHeading].
  
  	catIndex := categoryArray indexOf: realHeading.
  	elemIndex := 
  		catIndex > 1
  			ifTrue: [categoryStops at: catIndex - 1]
  			ifFalse: [0].
  	[(elemIndex := elemIndex + 1) <= (categoryStops at: catIndex) 
  		and: [element >= (elementArray at: elemIndex)]] whileTrue.
  
  	"elemIndex is now the index for inserting the element. Do the insertion before it."
  	elementArray := elementArray copyReplaceFrom: elemIndex to: elemIndex-1
  						with: (Array with: element).
  
  	"add one to stops for this and later categories"
  	catIndex to: categoryArray size do: 
  		[:i | categoryStops at: i put: (categoryStops at: i) + 1].
  
  	((categoryArray includes: Default)
  		and: [(self listAtCategoryNamed: Default) size = 0]) ifTrue: [self removeCategory: Default].
  		
  	self assertInvariant.!

Item was added:
+ ----- Method: Categorizer>>isSpecialCategoryName: (in category 'testing') -----
+ isSpecialCategoryName: aName
+ 
+ 	^ {self class nullCategory. self class allCategory}
+ 		includes: aName asSymbol!



More information about the Squeak-dev mailing list