MCStWriter.st
author Claus Gittinger <cg@exept.de>
Thu, 08 Mar 2018 00:48:11 +0100
changeset 1039 88f5b1106042
parent 1034 3f7053d7564e
permissions -rw-r--r--
#BUGFIX by cg class: MCSnapshot changed: #asChangeSet don't loose comment changes

"{ Encoding: utf8 }"

"{ Package: 'stx:goodies/monticello' }"

"{ NameSpace: Smalltalk }"

MCWriter subclass:#MCStWriter
	instanceVariableNames:'initStream'
	classVariableNames:''
	poolDictionaries:''
	category:'SCM-Monticello-Chunk Format'
!

!MCStWriter class methodsFor:'documentation'!

documentation
"
    I write Category/Classes/Methods/.... definitions into Monticello source.st file format found in .mcz packages.    

    See also MCStReader

    Example:

    String streamContents: [:aStream| |writer|
        writer := MCStWriter on: aStream.
        writer writeDefinitions: {True asClassDefinition. False asClassDefinition}.
    ]
"
! !

!MCStWriter class methodsFor:'as yet unclassified'!

readerClass
	^ MCStReader
! !

!MCStWriter methodsFor:'visiting'!

visitClassDefinition: definition
	self writeClassDefinition: definition.
	definition hasClassInstanceVariables ifTrue: [self writeMetaclassDefinition: definition].
	definition hasComment ifTrue: [self writeClassComment: definition].
!

visitClassTraitDefinition: definition
	self chunkContents: [:s | s
		nextPutAll: definition baseTrait;
		nextPutAll: ' classTrait';
		cr; tab;
		nextPutAll: 'uses: ';
		nextPutAll: (definition classTraitComposition ifNil: ['{}'])]

!

visitMetaclassDefinition: definition
	self writeMetaclassDefinition: definition
!

visitMethodDefinition: definition
	self writeMethodPreamble: definition.
	self writeMethodSource: definition.
	self writeMethodPostscript.
	self writeMethodInitializer: definition.
!

visitOrganizationDefinition: defintion
	defintion categories do: [:cat | self writeCategory: cat].

!

visitTraitDefinition: definition
	self writeClassDefinition: definition.
	definition hasComment ifTrue: [self writeClassComment: definition].
! !

!MCStWriter methodsFor:'writing'!

chunkContents: aBlock
	stream cr; nextChunkPut: (String streamContents: aBlock); cr
!

writeCategory: categoryName
        stream
                nextChunkPut: 'SystemOrganization addCategory: ', categoryName storeString;
                cr

    "Modified: / 12-09-2010 / 15:36:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

writeClassComment: definition
        stream
                cr;
                nextPut: $!!;
                nextPutAll: definition className;
                nextPutAll: ' commentStamp: ';
                store: definition commentStamp;
                nextPutAll: ' prior: 0!!';
                cr;
                nextChunkPut: (definition comment ? '');
                cr.

    "Modified: / 12-09-2010 / 17:05:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

writeClassDefinition: definition
        self chunkContents: [:s | definition printDefinitionOn: stream]
!

writeDefinitions: aCollection
	"initStream is an ugly hack until we have proper init defs"
	initStream := String new writeStream.

	(MCDependencySorter sortItems: aCollection)
		do: [:ea | ea accept: self]
		displayingProgress: 'Writing definitions...'.
	
	stream nextPutAll: initStream contents.
!

writeMetaclassDefinition: definition
        self chunkContents: [:str |
                str     nextPutAll: definition className;
                        nextPutAll: ' class';
                        cr; tab.
                        definition hasClassTraitComposition ifTrue: [
                                str     nextPutAll: 'uses: ';
                                        nextPutAll: definition classTraitCompositionString;
                                        cr; tab].
                        str     nextPutAll: 'instanceVariableNames:''';
                                nextPutAll: definition classInstanceVariablesString;
                                nextPut: $']
!

writeMethodInitializer: aMethodDefinition
	aMethodDefinition isInitializer ifTrue:
		[initStream nextChunkPut: aMethodDefinition className, ' initialize'; cr]
!

writeMethodPostscript
	stream
		space;
		nextPut: $!!;
		cr
!

writeMethodPreamble: definition
        stream
                cr;
                nextPut: $!!;
                nextPutAll: definition fullClassName;
                nextPutAll: ' methodsFor: ';
                nextPutAll: definition category asString storeString;
                nextPutAll: ' stamp: ';
                nextPutAll: definition timeStamp asString storeString;
                nextPutAll: '!!';
                cr

    "Modified: / 12-09-2010 / 15:39:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

writeMethodSource: definition
	stream nextChunkPut: definition source
!

writeSnapshot: aSnapshot
	self writeDefinitions: aSnapshot definitions
! !

!MCStWriter class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
!

version_SVN
    ^ '$Id$'
! !