Skip to content

Instantly share code, notes, and snippets.

@mlamina
Created January 29, 2013 09:56
Show Gist options
  • Save mlamina/4663133 to your computer and use it in GitHub Desktop.
Save mlamina/4663133 to your computer and use it in GitHub Desktop.
Finding package dependencies for a package name
"Create a Dictionary mapping the selected package's classes to their dependencies. Code stolen from class DependencyBrowser#computePackageDependencies"
| pi classDeps packageDeps pkgName allPackages|
Transcript clear.
pkgName :='Violoncello-Core'.
classDeps := Dictionary new.
packageDeps := Dictionary new.
allPackages := OrderedCollection new.
pkgName ifNil:[^self error: 'No package specified'].
pi := PackageOrganizer default packageNamed: pkgName ifAbsent:[^self error: 'Package ',pkgName,' not loaded']. "unloaded"
"Alle Klassen in unserem Paket sammeln"
pi classes do:[:pkgClass|
(classDeps at: (pkgClass superclass ifNil:[ProtoObject]) name
ifAbsentPut:[OrderedCollection new]) add:
(MethodReference class: pkgClass selector: #Definition)].
"Methoden aller gefunden Klassen nach Referenzen auf andere klassen durchsuchen"
pi methods do:[:mref| | cm |
cm := mref compiledMethod.
1 to: cm numLiterals do:[:i| | lit |
((lit := cm literalAt: i) isVariableBinding and:[lit value isBehavior]) ifTrue:[
(classDeps at: lit value name ifAbsentPut:[OrderedCollection new])
add: (MethodReference class: cm methodClass selector: cm selector)]]].
"Packages von benutzten Klassen finden"
classDeps keys do:[:className| | aClass pkg |
aClass := Smalltalk classNamed: className.
pkg := PackageOrganizer default packageOfClass: aClass ifNone:[nil].
allPackages add: pkg.
].
allPackages inspect .
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment