/* * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.generators.builtins.generateBuiltIns import org.jetbrains.kotlin.generators.builtins.arrayIterators.GenerateArrayIterators import org.jetbrains.kotlin.generators.builtins.arrays.GenerateArrays import org.jetbrains.kotlin.generators.builtins.functions.GenerateFunctions import org.jetbrains.kotlin.generators.builtins.iterators.GenerateIterators import org.jetbrains.kotlin.generators.builtins.numbers.GenerateFloorDivMod import org.jetbrains.kotlin.generators.builtins.numbers.primitives.* import org.jetbrains.kotlin.generators.builtins.progressionIterators.GenerateProgressionIterators import org.jetbrains.kotlin.generators.builtins.progressions.GenerateProgressions import org.jetbrains.kotlin.generators.builtins.ranges.GenerateRanges import org.jetbrains.kotlin.generators.builtins.unsigned.generateUnsignedTypes import java.io.File import java.io.PrintWriter fun assertExists(file: File) { if (!file.exists()) error("Output dir does not exist: ${file.absolutePath}") } val BUILT_INS_NATIVE_DIR_JVM = File("core/builtins/native/") val BUILT_INS_NATIVE_DIR_JS = File("libraries/stdlib/js/builtins/") val BUILT_INS_NATIVE_DIR_WASM = File("libraries/stdlib/wasm/builtins/") val BUILT_INS_NATIVE_DIR_NATIVE = File("kotlin-native/runtime/src/main/kotlin/") val BUILT_INS_SRC_DIR = File("core/builtins/src/") val RUNTIME_JVM_DIR = File("libraries/stdlib/jvm/runtime/") val UNSIGNED_TYPES_DIR = File("libraries/stdlib/unsigned/src") val STDLIB_DIR = File("libraries/stdlib/src") interface BuiltInsGenerator { fun generate() } abstract class BuiltInsSourceGenerator(val out: PrintWriter) : BuiltInsGenerator { protected abstract fun generateBody(): Unit protected open fun getPackage(): String = "kotlin" protected open fun getMultifileClassName(): String? = null override fun generate() { out.println(File("license/COPYRIGHT_HEADER.txt").readText()) out.println() // Don't include generator class name in the message: these are built-in sources, // and we don't want to scare users with any internal information about our project out.println("// Auto-generated file. DO NOT EDIT!") out.println("// Generated by: ${this::class.qualifiedName}") out.println() getMultifileClassName()?.let { name -> out.println("@file:kotlin.jvm.JvmName(\"$name\")") out.println("@file:kotlin.jvm.JvmMultifileClass") } out.print("package ${getPackage()}") out.println() out.println() generateBody() } } fun generateBuiltIns(generate: (File, (PrintWriter) -> BuiltInsGenerator) -> Unit) { assertExists(BUILT_INS_NATIVE_DIR_JVM) assertExists(BUILT_INS_NATIVE_DIR_JS) assertExists(BUILT_INS_NATIVE_DIR_WASM) assertExists(BUILT_INS_NATIVE_DIR_NATIVE) assertExists(BUILT_INS_SRC_DIR) assertExists(RUNTIME_JVM_DIR) assertExists(UNSIGNED_TYPES_DIR) generate(File(BUILT_INS_NATIVE_DIR_JVM, "kotlin/Primitives.kt")) { JvmPrimitivesGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_JS, "Primitives.kt")) { JsPrimitivesGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_WASM, "kotlin/Primitives.kt")) { WasmPrimitivesGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_NATIVE, "kotlin/Primitives.kt")) { NativePrimitivesGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_JVM, "kotlin/Boolean.kt")) { JvmBooleanGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_JS, "Boolean.kt")) { JsBooleanGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_WASM, "kotlin/Boolean.kt")) { WasmBooleanGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_NATIVE, "kotlin/Boolean.kt")) { NativeBooleanGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_JVM, "kotlin/Char.kt")) { JvmCharGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_JS, "Char.kt")) { JsCharGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_WASM, "kotlin/Char.kt")) { WasmCharGenerator(it) } generate(File(BUILT_INS_NATIVE_DIR_NATIVE, "kotlin/Char.kt")) { NativeCharGenerator(it) } generate(File(RUNTIME_JVM_DIR, "kotlin/jvm/functions/Functions.kt")) { GenerateFunctions(it) } generate(File(BUILT_INS_NATIVE_DIR_JVM, "kotlin/Arrays.kt")) { GenerateArrays(it) } generate(File(STDLIB_DIR, "kotlin/collections/PrimitiveIterators.kt")) { GenerateIterators(it) } generate(File(RUNTIME_JVM_DIR, "kotlin/jvm/internal/ArrayIterators.kt")) { GenerateArrayIterators(it) } generate(File(STDLIB_DIR, "kotlin/ranges/ProgressionIterators.kt")) { GenerateProgressionIterators(it) } generate(File(STDLIB_DIR, "kotlin/ranges/Progressions.kt")) { GenerateProgressions(it) } generate(File(STDLIB_DIR, "kotlin/ranges/PrimitiveRanges.kt")) { GenerateRanges(it) } generate(File(STDLIB_DIR, "kotlin/util/FloorDivMod.kt")) { GenerateFloorDivMod(it) } generateUnsignedTypes(UNSIGNED_TYPES_DIR, generate) } fun main() { generateBuiltIns { file, generator -> println("generating $file") file.parentFile?.mkdirs() PrintWriter(file).use { generator(it).generate() } } }