Skip to content

Instantly share code, notes, and snippets.

@chris-hatton
Last active January 25, 2022 22:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chris-hatton/474ae3fe09562822464fbc79d111e09f to your computer and use it in GitHub Desktop.
Save chris-hatton/474ae3fe09562822464fbc79d111e09f to your computer and use it in GitHub Desktop.
Render a simple GraphViz graph of Kotlin Multiplatform sourceSet dependencies
// Where Gradle 'project' object is the current receiver...
val dependencies: Map<KotlinSourceSet, Set<KotlinSourceSet>> =
kotlinExtension.sourceSets.associateWith { it.dependsOn }
val renderedDependencies = dependencies
.filterKeys { !it.name.endsWith("Test") } // Exclude test sourceSets
.filterValues { it.isNotEmpty() } // Exclude sourceSets with no relationship (e.g. meta)
if (renderedDependencies.isEmpty()) return@injectWriteSourceSetDotFile
val allRenderedSourceSets =
renderedDependencies.keys + renderedDependencies.values.flattenTo(mutableSetOf())
File("$projectDir/sourceSetDependencies.dot")
.bufferedWriter()
.use { writer ->
writer.write("digraph ${path.replace(':', '_').trim('_')} {\n")
allRenderedSourceSets.forEach { sourceSet ->
writer.write("\t${sourceSet.name}\n")
}
writer.write("\n")
renderedDependencies.forEach { (sourceSet, dependencies) ->
dependencies.forEach { dependencySourceSet ->
writer.write("\t${sourceSet.name} -> ${dependencySourceSet.name}\n")
}
}
writer.write("}\n")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment