[squeak-dev] The Trunk: Traits-ar.271.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Dec 31 14:45:22 UTC 2009

Andreas Raab uploaded a new version of Traits to project The Trunk:

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

Name: Traits-ar.271
Author: ar
Time: 31 December 2009, 3:45:08 am
UUID: c7f78cfa-a551-ee4d-a4a5-f4f6da2bbad6
Ancestors: Traits-ar.270

Fix a few issues where we should operate on the elements of the trait transform instead of the transform itself.

=============== Diff against Traits-ar.270 ===============

Item was changed:
  ----- Method: ClassDescription>>installTraitsFrom: (in category '*Traits-NanoKernel') -----
  installTraitsFrom: aTraitComposition
+ 	"Install the traits from the given composition. This method implements
+ 	the core composition method - all others are just optimizations for
+ 	particular cases. Consequently, the optimized versions can always fall
+ 	back to this method when things get too hairy."
- 	"Install the traits from the given composition"
  	| allTraits methods oldMethod removals oldCategories |
  	(self traitComposition isEmpty and: [aTraitComposition isEmpty]) ifTrue: [^self].
  	"Check for cycles"
  	allTraits := aTraitComposition gather: [:t | t allTraits copyWith: t].
  	(allTraits includes: self) ifTrue:[^self error: 'Cyclic trait definition detected'].
  	"XXXX: addUser/removeUser should be part of setter, but subclass 
  	override prevents it until we've got rid of Traits mess."
+ 	self traitComposition do:[:tc|  tc removeTraitUser: self].
- 	self traitComposition removeTraitUser: self.
  	self traitComposition: aTraitComposition.
+ 	aTraitComposition do:[:tc| tc addTraitUser: self].
- 	aTraitComposition addTraitUser: self.
  	"Assemble the methods in a new dictionary first.
  	Uses a Dictionary instead of a MethodDictionary for speed (MDs grow by #become:)"
  	methods := Dictionary new.
  	"Stick in the local methods first, since this avoids generating conflict methods unnecessarily"
  	self selectorsAndMethodsDo:[:sel :newMethod|
  		(self isLocalMethod: newMethod)
  			ifTrue:[methods at: sel put:newMethod]].
  	"Now assemble the traits methods"
  	aTraitComposition do:[:trait|
  		trait selectorsAndMethodsDo:[:sel :newMethod|
  			oldMethod := methods at: sel ifAbsentPut:[newMethod].
  			newMethod == oldMethod ifFalse:["a conflict"
  				(self isLocalMethod: oldMethod) ifFalse:[
  					methods at: sel put: (self resolveTraitsConflict: sel from: oldMethod to: newMethod).
  	"Apply the changes. We first add the new or changed methods."
  	oldCategories := Set new.
  	methods keysAndValuesDo:[:sel :newMethod|
  		oldMethod := self compiledMethodAt: sel ifAbsent:[nil].
  		oldMethod == newMethod ifFalse:[
  			self traitAddSelector: sel withMethod: newMethod.
  			(self organization categoryOfElement: sel) ifNotNil:[:cat| oldCategories add: cat].
  			self organization classify: sel under: 
  				(newMethod methodHome organization categoryOfElement: newMethod selector).
  	"Now remove the old or obsoleted ones"
  	removals := OrderedCollection new.
  	self selectorsDo:[:sel| (methods includesKey: sel) ifFalse:[removals add: sel]].
  	removals do:[:sel| self traitRemoveSelector: sel].
  	"Clean out empty categories"
  	oldCategories do:[:cat|
  		(self organization isEmptyCategoryNamed: cat)
  			ifTrue:[self organization removeCategory: cat]].
  	self isMeta ifFalse:[self classSide updateTraitsFrom: aTraitComposition].!

Item was changed:
  ----- Method: ClassDescription>>includesTrait: (in category '*Traits-NanoKernel') -----
  includesTrait: aTrait
+ 	^self traitComposition anySatisfy:[:each| each includesTrait: aTrait]!
- 	^self traitComposition includesTrait: aTrait!

Item was removed:
- ----- Method: TraitComposition>>includesTrait: (in category 'testing') -----
- includesTrait: aTrait
- 	^self anySatisfy:[:each| each includesTrait: aTrait]!

Item was removed:
- ----- Method: TraitComposition>>addTraitUser: (in category 'accessing') -----
- addTraitUser: aUser
- 	self do:[:each| each addTraitUser: aUser]!

Item was removed:
- ----- Method: TraitComposition>>removeTraitUser: (in category 'accessing') -----
- removeTraitUser: aUser
- 	self do:[:each| each removeTraitUser: aUser]!

More information about the Squeak-dev mailing list