gitHub/GitHubSmalltalkClassReader.st
author Claus Gittinger <cg@exept.de>
Mon, 15 Jul 2019 15:37:27 +0200
branchcvs_MAIN
changeset 880 bd52c31956df
parent 819 2b69985cec1b
permissions -rw-r--r--
#OTHER by cg unneeded subProjects method removed (already inherited)

"{ Package: 'stx:libscm/gitHub' }"

"{ NameSpace: Smalltalk }"

Object subclass:#GitHubSmalltalkClassReader
	instanceVariableNames:'changeSet classDirectory className'
	classVariableNames:''
	poolDictionaries:''
	category:'SCM-GitHub-Package-Reader'
!

!GitHubSmalltalkClassReader class methodsFor:'documentation'!

documentation
"
    a q&d hack, to read packages/classes from github

    read a .class definition as stored by Pharo/Squeak in gitHub.

    [author:]
        Claus Gittinger

    [instance variables:]

    [class variables:]

    [see also:]

"
! !

!GitHubSmalltalkClassReader class methodsFor:'reading'!

readClassFrom:aClassDirectory
    "read a .class folder; return a changeSet for that class"
    
     ^ self new 
        classDirectory:aClassDirectory;
        readClass;
        changeSet.

    "Created: / 30-06-2018 / 18:14:12 / Claus Gittinger"
! !

!GitHubSmalltalkClassReader methodsFor:'accessing'!

changeSet
    ^ changeSet

    "Created: / 30-06-2018 / 17:56:18 / Claus Gittinger"
!

changeSet:aChangeSet
    changeSet := aChangeSet

    "Created: / 30-06-2018 / 18:17:27 / Claus Gittinger"
!

classDirectory:aFilenameOrString
    classDirectory := aFilenameOrString asFilename

    "Created: / 30-06-2018 / 17:46:01 / Claus Gittinger"
! !

!GitHubSmalltalkClassReader methodsFor:'private'!

addChange:aChange
    changeSet isNil ifTrue:[
        changeSet := ChangeSet new.
    ].    
    changeSet add:aChange

    "Created: / 30-06-2018 / 17:53:44 / Claus Gittinger"
!

addClassDefinitionChange:classChange
    self addChange:classChange

    "Created: / 30-06-2018 / 17:53:19 / Claus Gittinger"
! !

!GitHubSmalltalkClassReader methodsFor:'reading'!

readClass
    |props classChange|

    props := JSONReader fromJSON:(classDirectory / 'properties.json') contentsOfEntireFile.
    classChange := ClassDefinitionChange new.
    classChange category:(props at:'category').
    classChange instanceVariableNames:(props at:'instvars').
    classChange classInstanceVariableNames:(props at:'classinstvars').
    classChange classVariableNames:(props at:'classvars').
    classChange className:(className := props at:'name').
    classChange superClassName:(props at:'super').
    classChange poolDictionaries:((props at:'pools') asStringWith:' ').
    (props at:'type') = 'normal' ifFalse:[ 
self halt.
    ].
    self addClassDefinitionChange:classChange.

    self readClassMethods.
    self readInstanceMethods.
    
    "
     |changes|

     changes := self new 
        classDirectory:'/Users/cg/work/stx/goodies/smaCC/SmaCC-master/SmaCC-Cucumber.package/CucumberParserTests.class';
        readClass;
        changeSet.
     ChangeSetBrowser openOn:changes    
    "

    "Created: / 30-06-2018 / 17:47:48 / Claus Gittinger"
!

readClassMethods
    |change classDir|

    (classDir := (classDirectory / 'class')) exists ifTrue:[
        classDir filesDo:[:eachFile |
            change := self readMethodFrom:eachFile forClassNamed:(className,' class').
            self addChange:change.
        ].
    ].
    
    "
     |changes|

     changes := self new 
        classDirectory:'/Users/cg/work/stx/goodies/smaCC/SmaCC-master/SmaCC-Cucumber.package/CucumberParserTests.class';
        readClass;
        changeSet.
     ChangeSetBrowser openOn:changes    
    "

    "Created: / 30-06-2018 / 17:58:06 / Claus Gittinger"
!

readInstanceMethods
    |change instanceDir|

    (instanceDir := (classDirectory / 'instance')) exists ifTrue:[
        instanceDir filesDo:[:eachFile |
            change := self readMethodFrom:eachFile forClassNamed:className.
            self addChange:change.
        ].
    ].
    
    "
     |changes|

     changes := self new 
        classDirectory:'/Users/cg/work/stx/goodies/smaCC/SmaCC-master/SmaCC-Cucumber.package/CucumberParserTests.class';
        readClass;
        changeSet.
     ChangeSetBrowser openOn:changes    
    "

    "Created: / 30-06-2018 / 17:58:16 / Claus Gittinger"
!

readMethodFrom:aFilename forClassNamed:className
    |category source change selector|

    aFilename readingFileDo:[:in |
        category := in nextLine withoutSeparators.
        source := in upToEnd.
    ].
    selector := Parser new parseSelector:source.
    change := MethodChange 
                className:className 
                selector:selector
                source:source 
                category:category.
    ^ change            

    "
     |changes|

     changes := self new 
        classDirectory:'/Users/cg/work/stx/goodies/smaCC/SmaCC-master/SmaCC-Cucumber.package/CucumberParserTests.class';
        readClass;
        changeSet.
     ChangeSetBrowser openOn:changes    
    "

    "Created: / 30-06-2018 / 18:10:13 / Claus Gittinger"
! !

!GitHubSmalltalkClassReader class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !