JS: fix long constants importing
This commit is contained in:
@@ -395,12 +395,6 @@ fun extractImportTag(jsVar: JsVars.JsVar): String? {
|
|||||||
return if (extractImportTagImpl(initExpression, sb)) sb.toString() else null
|
return if (extractImportTagImpl(initExpression, sb)) sb.toString() else null
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note! Doesn't handle Long's
|
|
||||||
fun extractImportTag(initExpression: JsExpression): String? {
|
|
||||||
val sb = StringBuilder()
|
|
||||||
return if (extractImportTagImpl(initExpression, sb)) sb.toString() else null
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun extractImportTagImpl(expression: JsExpression, sb: StringBuilder): Boolean {
|
private fun extractImportTagImpl(expression: JsExpression, sb: StringBuilder): Boolean {
|
||||||
when (expression) {
|
when (expression) {
|
||||||
is JsNameRef -> {
|
is JsNameRef -> {
|
||||||
|
|||||||
+10
-2
@@ -909,11 +909,16 @@ public class TranslationContext {
|
|||||||
String tag = Objects.requireNonNull(staticContext.getTag(descriptor));
|
String tag = Objects.requireNonNull(staticContext.getTag(descriptor));
|
||||||
String suggestedName = StaticContext.getSuggestedName(descriptor);
|
String suggestedName = StaticContext.getSuggestedName(descriptor);
|
||||||
|
|
||||||
return declareConstantValue(suggestedName, tag, value);
|
return declareConstantValue(suggestedName, tag, value, descriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public JsExpression declareConstantValue(@NotNull String suggestedName, @NotNull String tag, @NotNull JsExpression value) {
|
public JsExpression declareConstantValue(
|
||||||
|
@NotNull String suggestedName,
|
||||||
|
@NotNull String tag,
|
||||||
|
@NotNull JsExpression value,
|
||||||
|
@Nullable DeclarationDescriptor descriptor
|
||||||
|
) {
|
||||||
if (inlineFunctionContext == null || !isPublicInlineFunction()) {
|
if (inlineFunctionContext == null || !isPublicInlineFunction()) {
|
||||||
return staticContext.importDeclaration(suggestedName, tag, value).makeRef();
|
return staticContext.importDeclaration(suggestedName, tag, value).makeRef();
|
||||||
}
|
}
|
||||||
@@ -921,6 +926,9 @@ public class TranslationContext {
|
|||||||
return inlineFunctionContext.getImports().computeIfAbsent(tag, t -> {
|
return inlineFunctionContext.getImports().computeIfAbsent(tag, t -> {
|
||||||
JsName result = JsScope.declareTemporaryName(suggestedName);
|
JsName result = JsScope.declareTemporaryName(suggestedName);
|
||||||
MetadataProperties.setImported(result, true);
|
MetadataProperties.setImported(result, true);
|
||||||
|
if (descriptor != null && isFromCurrentModule(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) {
|
||||||
|
MetadataProperties.setLocalAlias(result, new LocalAlias(getInnerNameForDescriptor(descriptor), tag));
|
||||||
|
}
|
||||||
inlineFunctionContext.getImportBlock().getStatements().add(JsAstUtils.newVar(result, value));
|
inlineFunctionContext.getImportBlock().getStatements().add(JsAstUtils.newVar(result, value));
|
||||||
return result;
|
return result;
|
||||||
}).makeRef();
|
}).makeRef();
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ public final class Translation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String name = NameSuggestion.sanitizeName("L" + compileTimeValue.getValue(type).toString());
|
String name = NameSuggestion.sanitizeName("L" + compileTimeValue.getValue(type).toString());
|
||||||
return context.declareConstantValue(name, "constant:" + name, constantResult);
|
return context.declareConstantValue(name, "constant:" + name, constantResult, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (KotlinBuiltIns.isInt(type)) {
|
if (KotlinBuiltIns.isInt(type)) {
|
||||||
|
|||||||
+15
-19
@@ -5,32 +5,28 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.js.translate.general
|
package org.jetbrains.kotlin.js.translate.general
|
||||||
|
|
||||||
import org.jetbrains.kotlin.js.backend.ast.JsExpression
|
|
||||||
import org.jetbrains.kotlin.js.backend.ast.JsNameBinding
|
import org.jetbrains.kotlin.js.backend.ast.JsNameBinding
|
||||||
import org.jetbrains.kotlin.js.backend.ast.JsProgramFragment
|
import org.jetbrains.kotlin.js.backend.ast.JsProgramFragment
|
||||||
|
import org.jetbrains.kotlin.js.backend.ast.JsVars
|
||||||
import org.jetbrains.kotlin.js.inline.util.extractImportTag
|
import org.jetbrains.kotlin.js.inline.util.extractImportTag
|
||||||
|
|
||||||
// TODO this is a hack for `intrinsic:` tags
|
// TODO this is a hack for `intrinsic:` and `constant:` tags
|
||||||
fun JsProgramFragment.normalizeImportTags() {
|
fun JsProgramFragment.normalizeImportTags() {
|
||||||
|
|
||||||
val newImports = mutableMapOf<String, JsExpression>()
|
|
||||||
val replacements = mutableMapOf<String, String>()
|
|
||||||
|
|
||||||
imports.entries.retainAll { (tag, statement) ->
|
|
||||||
extractImportTag(statement)?.let { newTag ->
|
|
||||||
if (newTag != tag) {
|
|
||||||
newImports[newTag] = statement
|
|
||||||
replacements[tag] = newTag
|
|
||||||
}
|
|
||||||
newTag == tag
|
|
||||||
} ?: true
|
|
||||||
}
|
|
||||||
|
|
||||||
imports += newImports
|
|
||||||
|
|
||||||
nameBindings.replaceAll { binding ->
|
nameBindings.replaceAll { binding ->
|
||||||
replacements[binding.key]?.let {
|
val (tag, name) = binding
|
||||||
JsNameBinding(it, binding.name)
|
|
||||||
|
imports[tag]?.let { import ->
|
||||||
|
extractImportTag(JsVars.JsVar(name, imports[tag]))?.let { newtag ->
|
||||||
|
if (tag != newtag) {
|
||||||
|
imports[newtag] = import
|
||||||
|
JsNameBinding(newtag, name)
|
||||||
|
} else null
|
||||||
|
}
|
||||||
} ?: binding
|
} ?: binding
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val tagSet = nameBindings.asSequence().map { it.key }.toSet()
|
||||||
|
|
||||||
|
imports.entries.retainAll { (tag, _) -> tag in tagSet }
|
||||||
}
|
}
|
||||||
@@ -145,11 +145,11 @@ inline fun testImportedLongConstInlineFunLib1() {
|
|||||||
assertEquals(123456789012345L, bigLongConstCopy)
|
assertEquals(123456789012345L, bigLongConstCopy)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PROPERTY_READ_COUNT: name=longConst_0 count=1 scope=testImportedLongConstInlinedLocally
|
// PROPERTY_READ_COUNT: name=longConst count=1 scope=testImportedLongConstInlinedLocally
|
||||||
// PROPERTY_READ_COUNT: name=L42 count=1 scope=testImportedLongConstInlinedLocally
|
// PROPERTY_READ_COUNT: name=L42 count=1 scope=testImportedLongConstInlinedLocally
|
||||||
// PROPERTY_READ_COUNT: name=L_42 count=4 scope=testImportedLongConstInlinedLocally
|
// PROPERTY_READ_COUNT: name=L_42 count=4 scope=testImportedLongConstInlinedLocally
|
||||||
// PROPERTY_READ_COUNT: name=L84 count=2 scope=testImportedLongConstInlinedLocally
|
// PROPERTY_READ_COUNT: name=L84 count=2 scope=testImportedLongConstInlinedLocally
|
||||||
// PROPERTY_READ_COUNT: name=bigLongConst_0 count=1 scope=testImportedLongConstInlinedLocally
|
// PROPERTY_READ_COUNT: name=bigLongConst count=1 scope=testImportedLongConstInlinedLocally
|
||||||
// PROPERTY_READ_COUNT: name=L123456789012345 count=1 scope=testImportedLongConstInlinedLocally
|
// PROPERTY_READ_COUNT: name=L123456789012345 count=1 scope=testImportedLongConstInlinedLocally
|
||||||
private fun testImportedLongConstInlinedLocally() {
|
private fun testImportedLongConstInlinedLocally() {
|
||||||
testImportedLongConstInlineFunLib1()
|
testImportedLongConstInlineFunLib1()
|
||||||
|
|||||||
Reference in New Issue
Block a user