[JS IR] Add a compiler option for generating name entries in sourcemaps

This commit is contained in:
Sergej Jaskiewicz
2022-10-04 11:17:32 +02:00
committed by Space Team
parent 8f237a60f7
commit 227864c6ec
15 changed files with 191 additions and 3 deletions
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.gradle.dsl.JsMainFunctionExecutionMode
import org.jetbrains.kotlin.gradle.dsl.JsModuleKind
import org.jetbrains.kotlin.gradle.dsl.JsSourceMapEmbedMode
import org.jetbrains.kotlin.gradle.dsl.JsSourceMapNamesPolicy
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion as KotlinVersionDsl
import org.jetbrains.kotlin.gradle.dsl.JvmTarget as JvmTargetDsl
import kotlin.reflect.KType
@@ -118,6 +119,23 @@ open class DefaultValues(
""".trimIndent()
)
object JsSourceMapNamesPolicies : DefaultValues(
"null",
typeOf<JsSourceMapNamesPolicy?>(),
typeOf<String?>(),
possibleValues = listOf(
K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_NO,
K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_SIMPLE_NAMES,
K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_FQ_NAMES,
).map { "\"$it\"" },
fromKotlinOptionConverterProp = """
this?.let { ${typeOf<JsSourceMapNamesPolicy>()}.fromPolicy(it) }
""".trimIndent(),
toKotlinOptionConverterProp = """
this?.policy
""".trimIndent()
)
object JsMain : DefaultValues(
"${typeOf<JsMainFunctionExecutionMode>()}.${JsMainFunctionExecutionMode.CALL.name}",
typeOf<JsMainFunctionExecutionMode>(),
@@ -96,6 +96,17 @@ class K2JSCompilerArguments : CommonCompilerArguments() {
)
var sourceMapEmbedSources: String? by NullableStringFreezableVar(null)
@GradleOption(
value = DefaultValues.JsSourceMapNamesPolicies::class,
gradleInputType = GradleInputTypes.INPUT
)
@Argument(
value = "-source-map-names-policy",
valueDescription = "{no|simple-names|fully-qualified-names}",
description = "How to map generated names to original names (IR backend only)"
)
var sourceMapNamesPolicy: String? by NullableStringFreezableVar(null)
@GradleOption(
value = DefaultValues.BooleanTrueDefault::class,
gradleInputType = GradleInputTypes.INPUT
@@ -30,6 +30,10 @@ public interface K2JsArgumentConstants {
String SOURCE_MAP_SOURCE_CONTENT_NEVER = "never";
String SOURCE_MAP_SOURCE_CONTENT_INLINING = "inlining";
String SOURCE_MAP_NAMES_POLICY_NO = "no";
String SOURCE_MAP_NAMES_POLICY_SIMPLE_NAMES = "simple-names";
String SOURCE_MAP_NAMES_POLICY_FQ_NAMES = "fully-qualified-names";
String RUNTIME_DIAGNOSTIC_LOG = "log";
String RUNTIME_DIAGNOSTIC_EXCEPTION = "exception";
}
@@ -576,9 +576,10 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
else
SourceMapSourceEmbedding.INLINING
if (sourceMapContentEmbedding == null) {
val message = "Unknown source map source embedding mode: " + sourceMapEmbedContentString + ". Valid values are: " +
StringUtil.join(sourceMapContentEmbeddingMap.keys, ", ")
messageCollector.report(ERROR, message, null)
messageCollector.report(
ERROR,
"Unknown source map source embedding mode: $sourceMapEmbedContentString. Valid values are: ${sourceMapContentEmbeddingMap.keys.joinToString()}"
)
sourceMapContentEmbedding = SourceMapSourceEmbedding.INLINING
}
configuration.put(JSConfigurationKeys.SOURCE_MAP_EMBED_SOURCES, sourceMapContentEmbedding)
@@ -587,6 +588,20 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
messageCollector.report(WARNING, "source-map-embed-sources argument has no effect without source map", null)
}
val sourceMapNamesPolicyString = arguments.sourceMapNamesPolicy
var sourceMapNamesPolicy: SourceMapNamesPolicy? = if (sourceMapNamesPolicyString != null)
sourceMapNamesPolicyMap[sourceMapNamesPolicyString]
else
SourceMapNamesPolicy.SIMPLE_NAMES
if (sourceMapNamesPolicy == null) {
messageCollector.report(
ERROR,
"Unknown source map names policy: $sourceMapNamesPolicyString. Valid values are: ${sourceMapNamesPolicyMap.keys.joinToString()}"
)
sourceMapNamesPolicy = SourceMapNamesPolicy.SIMPLE_NAMES
}
configuration.put(JSConfigurationKeys.SOURCEMAP_NAMES_POLICY, sourceMapNamesPolicy)
configuration.put(JSConfigurationKeys.PRINT_REACHABILITY_INFO, arguments.irDcePrintReachabilityInfo)
configuration.put(JSConfigurationKeys.FAKE_OVERRIDE_VALIDATOR, arguments.fakeOverrideValidator)
}
@@ -615,6 +630,12 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
K2JsArgumentConstants.SOURCE_MAP_SOURCE_CONTENT_INLINING to SourceMapSourceEmbedding.INLINING
)
private val sourceMapNamesPolicyMap = mapOf(
K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_NO to SourceMapNamesPolicy.NO,
K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_SIMPLE_NAMES to SourceMapNamesPolicy.SIMPLE_NAMES,
K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_FQ_NAMES to SourceMapNamesPolicy.FULLY_QUALIFIED_NAMES
)
@JvmStatic
fun main(args: Array<String>) {
doMain(K2JsIrCompiler(), args)
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.config.SourceMapNamesPolicy
import org.jetbrains.kotlin.js.config.SourceMapSourceEmbedding
import java.io.File
@@ -15,6 +16,7 @@ data class SourceMapsInfo(
val sourceRoots: List<String>,
val outputDir: File?,
val sourceMapContentEmbedding: SourceMapSourceEmbedding,
val namesPolicy: SourceMapNamesPolicy,
) {
companion object {
fun from(configuration: CompilerConfiguration): SourceMapsInfo? =
@@ -24,6 +26,7 @@ data class SourceMapsInfo(
configuration.get(JSConfigurationKeys.SOURCE_MAP_SOURCE_ROOTS, emptyList()),
configuration.get(JSConfigurationKeys.OUTPUT_DIR),
configuration.get(JSConfigurationKeys.SOURCE_MAP_EMBED_SOURCES, SourceMapSourceEmbedding.INLINING),
configuration.get(JSConfigurationKeys.SOURCEMAP_NAMES_POLICY, SourceMapNamesPolicy.SIMPLE_NAMES)
)
} else {
null
+2
View File
@@ -13,6 +13,8 @@ where possible options include:
-source-map-base-dirs <path> Base directories for calculating relative paths to source files in source map
-source-map-embed-sources {always|never|inlining}
Embed source files into source map
-source-map-names-policy {no|simple-names|fully-qualified-names}
How to map generated names to original names (IR backend only)
-source-map-prefix Add the specified prefix to paths in the source map
-target { v5 } Generate JS files for specific ECMA version
-Werror Report an error if there are any warnings
@@ -22,6 +22,7 @@ fun generateGradleCompilerTypes(withPrinterToFile: (targetFile: File, Printer.()
generateJsMainFunctionExecutionMode(destDir, withPrinterToFile)
generateJsModuleKind(destDir, withPrinterToFile)
generateJsSourceMapEmbedMode(destDir, withPrinterToFile)
generateJsSourceMapNamesPolicy(destDir, withPrinterToFile)
generateJsDiagnosticMode(destDir, withPrinterToFile)
}
@@ -101,6 +101,36 @@ internal fun generateJsSourceMapEmbedMode(
}
}
internal fun generateJsSourceMapNamesPolicy(
apiDir: File,
filePrinter: (targetFile: File, Printer.() -> Unit) -> Unit
) {
val jsSourceMapNamesPolicyFqName = FqName("org.jetbrains.kotlin.gradle.dsl.JsSourceMapNamesPolicy")
filePrinter(fileFromFqName(apiDir, jsSourceMapNamesPolicyFqName)) {
generateDeclaration("enum class", jsSourceMapNamesPolicyFqName, afterType = "(val policy: String)") {
val modes = hashMapOf(
K2JsArgumentConstants::SOURCE_MAP_NAMES_POLICY_NO.name to K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_NO,
K2JsArgumentConstants::SOURCE_MAP_NAMES_POLICY_SIMPLE_NAMES.name to K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_SIMPLE_NAMES,
K2JsArgumentConstants::SOURCE_MAP_NAMES_POLICY_FQ_NAMES.name to K2JsArgumentConstants.SOURCE_MAP_NAMES_POLICY_FQ_NAMES,
)
for ((key, value) in modes) {
println("$key(\"$value\"),")
}
println(";")
println()
println("companion object {")
withIndent {
println("fun fromPolicy(policy: String): JsSourceMapNamesPolicy =")
println(" JsSourceMapNamesPolicy.values().firstOrNull { it.policy == policy }")
println(" ?: throw IllegalArgumentException(\"Unknown JS source map names policy: ${'$'}policy\")")
}
println("}")
}
}
}
internal fun generateJsDiagnosticMode(
apiDir: File,
filePrinter: (targetFile: File, Printer.() -> Unit) -> Unit
@@ -38,6 +38,9 @@ public class JSConfigurationKeys {
public static final CompilerConfigurationKey<SourceMapSourceEmbedding> SOURCE_MAP_EMBED_SOURCES =
CompilerConfigurationKey.create("embed source files into source map");
public static final CompilerConfigurationKey<SourceMapNamesPolicy> SOURCEMAP_NAMES_POLICY = CompilerConfigurationKey.create(
"a policy to generate a mapping from generated identifiers to their corresponding original names");
public static final CompilerConfigurationKey<Boolean> META_INFO =
CompilerConfigurationKey.create("generate .meta.js and .kjsm files");
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2022 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.js.config
/**
* A policy to generate name mappings in sourcemaps.
*
* Sourcemaps can map names from the generated JavaScript code to the names of the corresponding entities in the Kotlin source code.
*/
enum class SourceMapNamesPolicy {
/**
* Don't generate name mappings
*/
NO,
/**
* Generate name mappings. For functions and methods, map to their simple names instead of fully-qualified names.
*
* This is the default.
*/
SIMPLE_NAMES,
/**
* Generate name mappings. For functions and methods, map to their fully-qualified names.
*/
FULLY_QUALIFIED_NAMES,
}
@@ -64,6 +64,20 @@ public final class org/jetbrains/kotlin/gradle/dsl/JsSourceMapEmbedMode$Companio
public final fun fromMode (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/dsl/JsSourceMapEmbedMode;
}
public final class org/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy : java/lang/Enum {
public static final field Companion Lorg/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy$Companion;
public static final field SOURCE_MAP_NAMES_POLICY_FQ_NAMES Lorg/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy;
public static final field SOURCE_MAP_NAMES_POLICY_NO Lorg/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy;
public static final field SOURCE_MAP_NAMES_POLICY_SIMPLE_NAMES Lorg/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy;
public final fun getPolicy ()Ljava/lang/String;
public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy;
public static fun values ()[Lorg/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy;
}
public final class org/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy$Companion {
public final fun fromPolicy (Ljava/lang/String;)Lorg/jetbrains/kotlin/gradle/dsl/JsSourceMapNamesPolicy;
}
public final class org/jetbrains/kotlin/gradle/dsl/JvmTarget : java/lang/Enum {
public static final field Companion Lorg/jetbrains/kotlin/gradle/dsl/JvmTarget$Companion;
public static final field JVM_10 Lorg/jetbrains/kotlin/gradle/dsl/JvmTarget;
@@ -233,6 +247,7 @@ public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinJsCompiler
public abstract fun getOutputFile ()Lorg/gradle/api/provider/Property;
public abstract fun getSourceMap ()Lorg/gradle/api/provider/Property;
public abstract fun getSourceMapEmbedSources ()Lorg/gradle/api/provider/Property;
public abstract fun getSourceMapNamesPolicy ()Lorg/gradle/api/provider/Property;
public abstract fun getSourceMapPrefix ()Lorg/gradle/api/provider/Property;
public abstract fun getTarget ()Lorg/gradle/api/provider/Property;
public abstract fun getTypedArrays ()Lorg/gradle/api/provider/Property;
@@ -277,6 +292,7 @@ public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinJsOptions
public abstract fun getOutputFile ()Ljava/lang/String;
public abstract fun getSourceMap ()Z
public abstract fun getSourceMapEmbedSources ()Ljava/lang/String;
public abstract fun getSourceMapNamesPolicy ()Ljava/lang/String;
public abstract fun getSourceMapPrefix ()Ljava/lang/String;
public abstract fun getTarget ()Ljava/lang/String;
public abstract fun getTypedArrays ()Z
@@ -289,6 +305,7 @@ public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinJsOptions
public abstract fun setOutputFile (Ljava/lang/String;)V
public abstract fun setSourceMap (Z)V
public abstract fun setSourceMapEmbedSources (Ljava/lang/String;)V
public abstract fun setSourceMapNamesPolicy (Ljava/lang/String;)V
public abstract fun setSourceMapPrefix (Ljava/lang/String;)V
public abstract fun setTarget (Ljava/lang/String;)V
public abstract fun setTypedArrays (Z)V
@@ -308,6 +325,7 @@ public final class org/jetbrains/kotlin/gradle/dsl/KotlinJsOptions$DefaultImpls
public static fun getOutputFile (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;)Ljava/lang/String;
public static fun getSourceMap (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;)Z
public static fun getSourceMapEmbedSources (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;)Ljava/lang/String;
public static fun getSourceMapNamesPolicy (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;)Ljava/lang/String;
public static fun getSourceMapPrefix (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;)Ljava/lang/String;
public static fun getSuppressWarnings (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;)Z
public static fun getTarget (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;)Ljava/lang/String;
@@ -327,6 +345,7 @@ public final class org/jetbrains/kotlin/gradle/dsl/KotlinJsOptions$DefaultImpls
public static fun setOutputFile (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;Ljava/lang/String;)V
public static fun setSourceMap (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;Z)V
public static fun setSourceMapEmbedSources (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;Ljava/lang/String;)V
public static fun setSourceMapNamesPolicy (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;Ljava/lang/String;)V
public static fun setSourceMapPrefix (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;Ljava/lang/String;)V
public static fun setSuppressWarnings (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;Z)V
public static fun setTarget (Lorg/jetbrains/kotlin/gradle/dsl/KotlinJsOptions;Ljava/lang/String;)V
@@ -0,0 +1,19 @@
// DO NOT EDIT MANUALLY!
// Generated by org/jetbrains/kotlin/generators/arguments/GenerateGradleOptions.kt
// To regenerate run 'generateGradleOptions' task
@file:Suppress("RemoveRedundantQualifierName", "Deprecation", "DuplicatedCode")
package org.jetbrains.kotlin.gradle.dsl
enum class JsSourceMapNamesPolicy(val policy: String) {
SOURCE_MAP_NAMES_POLICY_FQ_NAMES("fully-qualified-names"),
SOURCE_MAP_NAMES_POLICY_SIMPLE_NAMES("simple-names"),
SOURCE_MAP_NAMES_POLICY_NO("no"),
;
companion object {
fun fromPolicy(policy: String): JsSourceMapNamesPolicy =
JsSourceMapNamesPolicy.values().firstOrNull { it.policy == policy }
?: throw IllegalArgumentException("Unknown JS source map names policy: $policy")
}
}
@@ -76,6 +76,15 @@ interface KotlinJsCompilerOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommon
@get:org.gradle.api.tasks.Input
val sourceMapEmbedSources: org.gradle.api.provider.Property<org.jetbrains.kotlin.gradle.dsl.JsSourceMapEmbedMode>
/**
* How to map generated names to original names (IR backend only)
* Possible values: "no", "simple-names", "fully-qualified-names"
* Default value: null
*/
@get:org.gradle.api.tasks.Optional
@get:org.gradle.api.tasks.Input
val sourceMapNamesPolicy: org.gradle.api.provider.Property<org.jetbrains.kotlin.gradle.dsl.JsSourceMapNamesPolicy>
/**
* Add the specified prefix to paths in the source map
* Default value: null
@@ -97,6 +97,19 @@ interface KotlinJsOptions : org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
get() = options.sourceMapEmbedSources.orNull.sourceMapEmbedSourcesKotlinOption
set(value) = options.sourceMapEmbedSources.set(value.sourceMapEmbedSourcesCompilerOption)
private val kotlin.String?.sourceMapNamesPolicyCompilerOption get() = this?.let { org.jetbrains.kotlin.gradle.dsl.JsSourceMapNamesPolicy.fromPolicy(it) }
private val org.jetbrains.kotlin.gradle.dsl.JsSourceMapNamesPolicy?.sourceMapNamesPolicyKotlinOption get() = this?.policy
/**
* How to map generated names to original names (IR backend only)
* Possible values: "no", "simple-names", "fully-qualified-names"
* Default value: null
*/
var sourceMapNamesPolicy: kotlin.String?
get() = options.sourceMapNamesPolicy.orNull.sourceMapNamesPolicyKotlinOption
set(value) = options.sourceMapNamesPolicy.set(value.sourceMapNamesPolicyCompilerOption)
/**
* Add the specified prefix to paths in the source map
* Default value: null
@@ -37,6 +37,9 @@ internal abstract class KotlinJsCompilerOptionsDefault @javax.inject.Inject cons
override val sourceMapEmbedSources: org.gradle.api.provider.Property<org.jetbrains.kotlin.gradle.dsl.JsSourceMapEmbedMode> =
objectFactory.property(org.jetbrains.kotlin.gradle.dsl.JsSourceMapEmbedMode::class.java)
override val sourceMapNamesPolicy: org.gradle.api.provider.Property<org.jetbrains.kotlin.gradle.dsl.JsSourceMapNamesPolicy> =
objectFactory.property(org.jetbrains.kotlin.gradle.dsl.JsSourceMapNamesPolicy::class.java)
override val sourceMapPrefix: org.gradle.api.provider.Property<kotlin.String> =
objectFactory.property(kotlin.String::class.java)
@@ -57,6 +60,7 @@ internal abstract class KotlinJsCompilerOptionsDefault @javax.inject.Inject cons
args.outputFile = outputFile.orNull
args.sourceMap = sourceMap.get()
args.sourceMapEmbedSources = sourceMapEmbedSources.orNull?.mode
args.sourceMapNamesPolicy = sourceMapNamesPolicy.orNull?.policy
args.sourceMapPrefix = sourceMapPrefix.orNull
args.target = target.get()
args.typedArrays = typedArrays.get()
@@ -73,6 +77,7 @@ internal abstract class KotlinJsCompilerOptionsDefault @javax.inject.Inject cons
args.outputFile = null
args.sourceMap = false
args.sourceMapEmbedSources = null
args.sourceMapNamesPolicy = null
args.sourceMapPrefix = null
args.target = "v5"
args.typedArrays = true