A new version of SystemEditor was added to project SystemEditor: http://www.squeaksource.com/SystemEditor/SystemEditor-mtf.150.mcz
==================== Summary ====================
Name: SystemEditor-mtf.150 Author: mtf Time: 29 October 2008, 10:42:16 pm UUID: 4ecd5671-b3c8-43e3-892b-067d830f25fc Ancestors: SystemEditor-mtf.149, SystemEditor-mtf.147
- added edPostLoad hook to editors and decorators - stubbed out the hooks available to ClassDecorators - moved subclass list maintainance out of ClassExporter and into a decorator, where it won't bother traits - made subclass list maintainance a part of editor expansion stage - gave SystemEditor>>edExpandEditors true recursion detection
=============== Diff against SystemEditor-mtf.149 ===============
Item was added: + ----- Method: SubclassListDecorator>>for: (in category 'initialize-release') ----- + for: aClassEditor + parent := aClassEditor. + additions := IdentitySet new. + removals := IdentitySet new.!
Item was changed: ----- Method: SystemEditor>>commit (in category 'building') ----- commit | migration export | showProgress ifNil: [showProgress := false]. self validate.
self edExpandEditors.
migration := MigrationTransaction new. self edPrepareMigration: migration.
export := ClassExporter on: subject. self edPrepareExport: export.
showProgress ifTrue: [(1 to: 2) do: [:ea | ] displayingProgress: 'Committing...']. [migration commit. export commit. + self edPostLoad. self edCommitRemovals. self edRecategorize.] valueUnpreemptively. ^ true!
Item was added: + ----- Method: SystemEditor>>edPostLoad (in category 'building') ----- + edPostLoad + additions do: [:ea | ea edPostLoad]!
Item was added: + ----- Method: ClassEditor>>edExpandSubclasses (in category 'building') ----- + edExpandSubclasses + "Make sure my subclasses get recompiled if my bindings have changed" + | subclasses | + self edRequiresSubclassRebuild ifFalse: [^ #()]. + subclasses := self subclasses. + subclasses do: [:ea | ea edInvalidateSuperclass]. + ^ subclasses!
Item was added: + ----- Method: ClassEditor>>edExpandSuperclass (in category 'building') ----- + edExpandSuperclass + "Fix up subclass references to myself in my old and new superclasses" + + | newSuperclass oldSuperclass newSupereditor oldSupereditor | + newSuperclass := self superclassOrEditor. + newSuperclass edIsEditor ifTrue: [newSuperclass := newSuperclass subject]. + oldSuperclass := self subject ifNotNil: [self subject superclass]. + oldSuperclass == newSuperclass ifTrue: [^ #()]. + + newSupereditor := self environment edEditorFor: newSuperclass. + newSupereditor addSubclass: self. + oldSuperclass ifNil: [^ Array with: newSupereditor]. + + oldSupereditor := self environment edEditorFor: oldSuperclass. + oldSupereditor removeSubclass: self. + ^ Array with: oldSupereditor with: newSupereditor!
Item was added: + ----- Method: ClassDecorator>>validate (in category 'validating') ----- + validate + "Raise an error if the build should not proceed"!
Item was added: + ClassDecorator subclass: #SubclassListDecorator + instanceVariableNames: 'parent additions removals' + classVariableNames: '' + poolDictionaries: '' + category: 'SystemEditor-Editors'! + + !SubclassListDecorator commentStamp: 'mtf 10/29/2008 13:56' prior: 0! + I remember what subclasses were added to or removed from my parent. Since the subclass list can be nil at times, I cannot migrate it, so I work in edPostLoad!
Item was added: + ----- Method: ClassEditor>>removeSubclass: (in category 'reflecting') ----- + removeSubclass: aClassEditor + (self decorateWith: SubclassListDecorator) removeSubclass: aClassEditor!
Item was added: + ----- Method: SubclassListDecorator>>edPostLoad (in category 'building') ----- + edPostLoad + | product | + product := parent product. + removals do: [:ea | product removeSubclass: ea product]. + additions do: [:ea | product addSubclass: ea product].!
Item was added: + ----- Method: ClassDecorator>>edRequiresRecompile (in category 'building') ----- + edRequiresRecompile + "Answer true if I require my client and all subclasses to be recompiled" + ^ false!
Item was changed: ----- Method: SystemEditor>>edExpandEditors (in category 'building') ----- edExpandEditors + | queue editor remembered | + remembered := IdentitySet new. - | queue editor | queue := additions values asOrderedCollection. + [queue isEmpty] whileFalse: [editor := queue removeFirst. + (remembered includes: editor) ifFalse: [ + remembered add: editor. + queue addAll: editor edExpand]] - [queue isEmpty] whileFalse: - [editor := queue removeFirst. - editor subject ifNotNil: [ - queue addAll: editor edExpand]] !
Item was added: + ----- Method: SubclassListDecorator>>removeSubclass: (in category 'accessing') ----- + removeSubclass: aClassEditor + removals add: aClassEditor. + additions remove: aClassEditor ifAbsent: [].!
Item was added: + ----- Method: ClassDecorator>>edBuild (in category 'building') ----- + edBuild + "Build what needs to be built into my client's product"!
Item was added: + ----- Method: ClassDecorator>>edPostLoad (in category 'building') ----- + edPostLoad + "Do something after the migration is finished"!
Item was added: + ----- Method: ClassEditor>>addSubclass: (in category 'reflecting') ----- + addSubclass: aClassEditor + (self decorateWith: SubclassListDecorator) addSubclass: aClassEditor!
Item was added: + ----- Method: ClassDecorator>>edRequiresBuild (in category 'building') ----- + edRequiresBuild + "Answer true if I need my client to be built afresh" + ^ false!
Item was changed: ----- Method: ClassEditor>>edExpand (in category 'building') ----- edExpand + ^ self edExpandSubclasses, self edExpandSuperclass! - | subclasses | - self edRequiresSubclassRebuild ifFalse: [^ #()]. - subclasses := self subclasses. - subclasses do: [:ea | ea edInvalidateSuperclass]. - ^ subclasses!
Item was changed: ----- Method: ClassEditor>>edBuild (in category 'building') ----- edBuild | meta | meta := self class edBuild. product := subject ifNil: [meta new] ifNotNil: [meta adoptInstance: subject from: subject class]. product superclass: self edSuperclass; setFormat: self format; setName: self name; setInstVarNames: self instVarNames; classPoolFrom: self; instVarNamed: #sharedPools put: self sharedPools; organization: self organization edBuild. "Create a temporary MethodDictionary to catch code written by SyntaxError dialogs. MethodDictionaryEditor will overwrite this. See MethodEditor>>compileFor:" product methodDictionary: MethodDictionary new. + self decoratorsDo: [:ea | ea edBuild]. - self name == #NSByteStream ifTrue: [self halt]. - self decoratorsDo: [:ea | self halt. ea edBuild].
"Class methods should be compiled before instance methods, since #compilerClass may be among the class methods. Class methods should be compiled after installing class and pool variables" product class methodDictionary: (self class methods buildFor: self class). product methodDictionary: (self methods buildFor: self). ^product!
Item was changed: ----- Method: ClassExporter>>export: (in category 'private') ----- export: aClass - ((aClass isBehavior) and: [aClass superclass notNil] - "Don't add aClass as subclass if a subclass exists that will become: aClass. - This can be checked by comparing the names. Otherwise, redundent - subclass entries appear, which makes - SystemNavigation>>allBehaviorsDo: find classes twice" - and: [aClass superclass subclasses noneSatisfy: [:ea | ea name = aClass name]]) - ifTrue: [aClass superclass addSubclass: aClass]. (environment includesKey: aClass name) ifTrue: [self replace: aClass] ifFalse: [environment at: aClass name put: aClass]!
Item was added: + ----- Method: SubclassListDecorator>>addSubclass: (in category 'accessing') ----- + addSubclass: aClassEditor + additions add: aClassEditor. + removals remove: aClassEditor ifAbsent: [].!
Item was added: + ----- Method: ClassEditor>>edPostLoad (in category 'building') ----- + edPostLoad + self decoratorsDo: [:ea | ea edPostLoad]!
Item was added: + ----- Method: ClassDecorator>>edPrepareMigration: (in category 'building') ----- + edPrepareMigration: txn + "Prepare a migration, if necessary"!
Item was changed: Object subclass: #ClassExporter instanceVariableNames: 'environment classes oldClasses newClasses' classVariableNames: '' poolDictionaries: '' category: 'SystemEditor-Editors'! + + !ClassExporter commentStamp: 'mtf 10/28/2008 18:55' prior: 0! + This class does a few things. + - The second step (becomeForward:)of ClassBuilder>>update:to: + - add each class to its superclass's subclasses list + - add each class to the SystemDictionary Smalltalk!
Item was removed: - ----- Method: ClassDecorator class>>decoratorsFor: (in category 'as yet unclassified') ----- - decoratorsFor: anEditor - ^ self allSubclasses - collect: [:class | class for: anEditor] - thenSelect: [:ea | ea notNil]!
packages@lists.squeakfoundation.org