diff --git a/src/Carp/CarpFile.class.st b/src/Carp/CarpFile.class.st index e35c706..1c07ecd 100644 --- a/src/Carp/CarpFile.class.st +++ b/src/Carp/CarpFile.class.st @@ -8,6 +8,46 @@ Class { #category : #'Carp-IDE' } +{ #category : #example } +CarpFile class >> coreLoadStatements [ + + + | loadStatements files carpFiles cFiles aDict nodes loadNodes s contents | + "the load statements in carp" + loadStatements := { 'load'. 'load-once'. 'system-include' }. + + "get all the carp and c files in the standard library (assumes that there is a carp directory in the home folder" + files := (FileLocator home / 'carp/core') children. + carpFiles := files select: [ :aFile | aFile extension = 'carp' ]. + cFiles := files select: [ :aFile | aFile extension = 'h' ]. + + "get a mapping from all files to all the files they load" + aDict := Dictionary new. + + carpFiles do: [ :aCarpFile | + contents := CarpParser parse: aCarpFile contents. + + nodes := OrderedCollection new. + contents allNodesOfType: CarpListNode do: [ :c | nodes add: c ]. + + loadNodes := nodes select: [ :aNode | + (aNode expressions size > 0 and: [ + aNode expressions first isKindOf: CarpVariableNode ]) + and: [ + loadStatements includes: + aNode expressions first value value ] ]. + + aDict at: aCarpFile basename put: (loadNodes collect: [ :aNode | + s := aNode expressions second value value. + s copyFrom: 2 to: s size - 1 ]) ]. + + cFiles do: [ :aCFile | + aDict at: aCFile basename put: OrderedCollection new ]. + + ^ aDict + +] + { #category : #'instance creation' } CarpFile class >> for: aFileName [ ^ self new for: aFileName