Fix Kotlin/JS compiler under JRE9

See KT-20653, KT-20650
This commit is contained in:
Alexey Andreev
2017-10-11 13:57:44 +03:00
parent e5cfd198c7
commit 8a8891d7c9
3 changed files with 44 additions and 29 deletions
@@ -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<KotlinJavascriptMetadata> {
@@ -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)))
}
}
}
@@ -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
@@ -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;