From 8a8891d7c951bc1c55df47e5e83597bbc0bd4636 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 11 Oct 2017 13:57:44 +0300 Subject: [PATCH] Fix Kotlin/JS compiler under JRE9 See KT-20653, KT-20650 --- .../utils/KotlinJavascriptMetadataUtils.kt | 8 +-- .../js/translate/context/StaticContext.java | 16 ++++-- .../translate/context/TranslationContext.java | 49 +++++++++++-------- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt index 4831314be6d..a6a6a90ffb2 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/KotlinJavascriptMetadataUtils.kt @@ -20,8 +20,7 @@ import org.jetbrains.kotlin.serialization.deserialization.BinaryVersion import java.io.DataInputStream import java.io.File import java.io.InputStream -import javax.xml.bind.DatatypeConverter.parseBase64Binary -import javax.xml.bind.DatatypeConverter.printBase64Binary +import java.util.* class KotlinJavascriptMetadata(val version: JsMetadataVersion, val moduleName: String, val body: ByteArray) @@ -73,7 +72,8 @@ object KotlinJavascriptMetadataUtils { KOTLIN_JAVASCRIPT_METHOD_NAME_PATTERN.matcher(text).find() && METADATA_PATTERN.matcher(text).find() fun formatMetadataAsString(moduleName: String, content: ByteArray): String = - "// Kotlin.$KOTLIN_JAVASCRIPT_METHOD_NAME(${JsMetadataVersion.INSTANCE.toInteger()}, \"$moduleName\", \"${printBase64Binary(content)}\");\n" + "// Kotlin.$KOTLIN_JAVASCRIPT_METHOD_NAME(${JsMetadataVersion.INSTANCE.toInteger()}, \"$moduleName\", " + + "\"${Base64.getEncoder().encodeToString(content)}\");\n" @JvmStatic fun loadMetadata(file: File): List { @@ -99,7 +99,7 @@ object KotlinJavascriptMetadataUtils { val abiVersion = JsMetadataVersion.fromInteger(matcher.group(1).toInt()) val moduleName = matcher.group(3) val data = matcher.group(5) - metadataList.add(KotlinJavascriptMetadata(abiVersion, moduleName, parseBase64Binary(data))) + metadataList.add(KotlinJavascriptMetadata(abiVersion, moduleName, Base64.getDecoder().decode(data))) } } } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index c8e9b39e4c3..731c86cc657 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -247,7 +247,11 @@ public final class StaticContext { @NotNull private JsExpression getQualifiedExpression(@NotNull DeclarationDescriptor descriptor) { - JsExpression fqn = fqnCache.computeIfAbsent(descriptor, this::buildQualifiedExpression); + JsExpression fqn = fqnCache.get(descriptor); + if (fqn == null) { + fqn = buildQualifiedExpression(descriptor); + fqnCache.put(descriptor, fqn); + } return fqn.deepCopy(); } @@ -810,12 +814,12 @@ public final class StaticContext { @NotNull public JsExpression exportModuleForInline(@NotNull String moduleId, @NotNull JsName moduleName) { - return modulesImportedForInline.computeIfAbsent(moduleId, k -> { + JsExpression moduleRef = modulesImportedForInline.get(moduleId); + if (moduleRef == null) { JsExpression currentModuleRef = pureFqn(getInnerNameForDescriptor(getCurrentModule()), null); JsExpression importsRef = pureFqn(Namer.IMPORTS_FOR_INLINE_PROPERTY, currentModuleRef); JsExpression currentImports = pureFqn(getNameForImportsForInline(), null); - JsExpression moduleRef; JsExpression lhsModuleRef; if (NameSuggestionKt.isValidES5Identifier(moduleId)) { moduleRef = pureFqn(moduleId, importsRef); @@ -832,8 +836,10 @@ public final class StaticContext { MetadataProperties.setExportedTag(importStmt, "imports:" + moduleId); getFragment().getExportBlock().getStatements().add(importStmt); - return moduleRef; - }).deepCopy(); + modulesImportedForInline.put(moduleId, moduleRef); + } + + return moduleRef.deepCopy(); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index 791e6d7a7eb..ed9fff35280 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -294,31 +294,40 @@ public class TranslationContext { } else { String tag = staticContext.getTag(descriptor); - name = inlineFunctionContext.getImports().computeIfAbsent(tag, t -> { - JsExpression imported = createInlineLocalImportExpression(descriptor); - if (imported instanceof JsNameRef) { - JsNameRef importedNameRef = (JsNameRef) imported; - if (importedNameRef.getQualifier() == null && importedNameRef.getIdent().equals(Namer.getRootPackageName()) && - (descriptor instanceof PackageFragmentDescriptor || descriptor instanceof ModuleDescriptor)) { - return importedNameRef.getName(); - } - } - - JsName result = JsScope.declareTemporaryName(StaticContext.getSuggestedName(descriptor)); - if (isFromCurrentModule(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) { - MetadataProperties.setLocalAlias(result, getInnerNameForDescriptor(descriptor)); - } - MetadataProperties.setDescriptor(result, descriptor); - MetadataProperties.setStaticRef(result, imported); - MetadataProperties.setImported(result, true); - inlineFunctionContext.getImportBlock().getStatements().add(JsAstUtils.newVar(result, imported)); - return result; - }); + name = inlineFunctionContext.getImports().get(tag); + if (name == null) { + name = createInlineableInnerNameForDescriptor(descriptor); + inlineFunctionContext.getImports().put(tag, name); + } } return name; } + private JsName createInlineableInnerNameForDescriptor(@NotNull DeclarationDescriptor descriptor) { + assert inlineFunctionContext != null; + + JsExpression imported = createInlineLocalImportExpression(descriptor); + if (imported instanceof JsNameRef) { + JsNameRef importedNameRef = (JsNameRef) imported; + if (importedNameRef.getQualifier() == null && importedNameRef.getIdent().equals(Namer.getRootPackageName()) && + (descriptor instanceof PackageFragmentDescriptor || descriptor instanceof ModuleDescriptor)) { + return importedNameRef.getName(); + } + } + + JsName result = JsScope.declareTemporaryName(StaticContext.getSuggestedName(descriptor)); + if (isFromCurrentModule(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) { + MetadataProperties.setLocalAlias(result, getInnerNameForDescriptor(descriptor)); + } + MetadataProperties.setDescriptor(result, descriptor); + MetadataProperties.setStaticRef(result, imported); + MetadataProperties.setImported(result, true); + inlineFunctionContext.getImportBlock().getStatements().add(JsAstUtils.newVar(result, imported)); + + return result; + } + @NotNull public JsExpression getReferenceToIntrinsic(@NotNull String intrinsicName) { JsExpression result;