fun generateRdModel()

in rd-kt/rd-gen/src/main/kotlin/com/jetbrains/rd/generator/nova/generate.kt [11:93]


fun generateRdModel(
    classLoader: ClassLoader,
    namespacePrefixes: Array<String>,
    verbose: Boolean = false,
    generatorsFilter: Regex? = null,
    clearOutputFolderIfExists: Boolean = false,
    generationSpecs: List<GenerationSpec> = emptyList()
): Set<File> {
    val startTime = System.currentTimeMillis()

    val genfilter = generatorsFilter ?: Regex(".*")

    if (verbose) {
        println()
        println("RdGen model generator started")
        println("Searching classes with namespace prefixes: '${namespacePrefixes.joinToString(", ")}'")
        println("Regex for filtering generators: '${genfilter.pattern}'")

        if (generationSpecs.isNotEmpty())
            println("Found ${generationSpecs.size} gradle generators")
    }


    val javaClasses = collectClasses(classLoader, namespacePrefixes, verbose)

    val toplevels = collectTopLevels(javaClasses, verbose)


    val validationErrors = ArrayList<String>()

    val roots = toplevels.map { it.root }.distinct()
    roots.forEach { root ->
        root.initialize()
        root.validate(validationErrors)
    }


    if (validationErrors.isNotEmpty())
        throw GeneratorException("Model validation fail:" +
            validationErrors.joinToString ("") {"\n\n>> $it"}
        )

    val generatorsToInvoke = collectSortedGeneratorsToInvoke(roots, javaClasses, genfilter, verbose, generationSpecs)

    if (verbose) {
        println()
        println("After filtering ${generatorsToInvoke.size} generator(s) to run")
    }

    val generatedFolders = HashSet<File>()
    for ((gen, root) in generatorsToInvoke) {
        val shouldClear = clearOutputFolderIfExists &&
            //whether we cleared this folder before or not?
            generatorsToInvoke
                .asSequence()
                .map { it.generator }
                .takeWhile { it != gen }
                .map {it.folder.canonicalPath}
                .none { gen.folder.canonicalPath.run { this == it || this.startsWith(it + File.separator)} }

        //Here is the real part
        if (verbose)
            println("Invoke $gen on $root, clearFolder=$shouldClear")

        ::settingCtx.usingValue(gen) {
            prepareGenerationFolder(gen.folder, shouldClear)

///         -----------------------
///             ACTUAL GENERATE
///         ----------------------
            gen.generate(toplevels.filter { it.root == root })


        }

        generatedFolders.add(gen.folder)
    }

    val endTime = System.currentTimeMillis()
    if (verbose) println("Generation finished in ${endTime - startTime} ms")

    return generatedFolders
}