JS: fix bootstrap

This commit is contained in:
Anton Bannykh
2019-07-01 18:00:14 +03:00
parent 69962cbf8c
commit 208c8f9339
3 changed files with 23 additions and 6 deletions
@@ -876,6 +876,11 @@ public final class StaticContext {
@NotNull @NotNull
public JsExpression getReferenceToIntrinsic(@NotNull String name) { public JsExpression getReferenceToIntrinsic(@NotNull String name) {
return pureFqn(getNameForIntrinsic(name), null);
}
@NotNull
public JsName getNameForIntrinsic(@NotNull String name) {
JsName resultName = intrinsicNames.computeIfAbsent(name, k -> { JsName resultName = intrinsicNames.computeIfAbsent(name, k -> {
if (isStdlib) { if (isStdlib) {
DeclarationDescriptor descriptor = findDescriptorForIntrinsic(name); DeclarationDescriptor descriptor = findDescriptorForIntrinsic(name);
@@ -886,7 +891,7 @@ public final class StaticContext {
return importDeclaration(NameSuggestion.sanitizeName(name), "intrinsic:" + name, TranslationUtils.getIntrinsicFqn(name)); return importDeclaration(NameSuggestion.sanitizeName(name), "intrinsic:" + name, TranslationUtils.getIntrinsicFqn(name));
}); });
return pureFqn(resultName, null); return resultName;
} }
@Nullable @Nullable
@@ -328,25 +328,31 @@ public class TranslationContext {
@NotNull @NotNull
public JsExpression getReferenceToIntrinsic(@NotNull String intrinsicName) { public JsExpression getReferenceToIntrinsic(@NotNull String intrinsicName) {
JsExpression result; return pureFqn(getNameForIntrinsic(intrinsicName), null);
}
@NotNull
public JsName getNameForIntrinsic(@NotNull String intrinsicName) {
JsName result;
if (inlineFunctionContext == null || !isPublicInlineFunction()) { if (inlineFunctionContext == null || !isPublicInlineFunction()) {
result = staticContext.getReferenceToIntrinsic(intrinsicName); result = staticContext.getNameForIntrinsic(intrinsicName);
} }
else { else {
String tag = "intrinsic:" + intrinsicName; String tag = "intrinsic:" + intrinsicName;
result = pureFqn(inlineFunctionContext.getImports().computeIfAbsent(tag, t -> { result = inlineFunctionContext.getImports().computeIfAbsent(tag, t -> {
JsExpression imported = TranslationUtils.getIntrinsicFqn(intrinsicName); JsExpression imported = TranslationUtils.getIntrinsicFqn(intrinsicName);
JsName name = JsScope.declareTemporaryName(NameSuggestion.sanitizeName(intrinsicName)); JsName name = JsScope.declareTemporaryName(NameSuggestion.sanitizeName(intrinsicName));
MetadataProperties.setImported(name, true); MetadataProperties.setImported(name, true);
inlineFunctionContext.getImportBlock().getStatements().add(JsAstUtils.newVar(name, imported)); inlineFunctionContext.getImportBlock().getStatements().add(JsAstUtils.newVar(name, imported));
return name; return name;
}), null); });
} }
return result; return result;
} }
@NotNull @NotNull
public JsName getNameForObjectInstance(@NotNull ClassDescriptor descriptor) { public JsName getNameForObjectInstance(@NotNull ClassDescriptor descriptor) {
return staticContext.getNameForObjectInstance(descriptor); return staticContext.getNameForObjectInstance(descriptor);
@@ -289,7 +289,13 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
public static JsExpression getObjectKClass(@NotNull TranslationContext context, @Nullable ClassifierDescriptor descriptor) { public static JsExpression getObjectKClass(@NotNull TranslationContext context, @Nullable ClassifierDescriptor descriptor) {
JsExpression primitiveExpression = getPrimitiveClass(context, descriptor); JsExpression primitiveExpression = getPrimitiveClass(context, descriptor);
if (primitiveExpression != null) return primitiveExpression; if (primitiveExpression != null) return primitiveExpression;
return new JsInvocation(context.getNameForSpecialFunction(SpecialFunction.GET_KCLASS).makeRef(), UtilsKt.getReferenceToJsClass(descriptor, context));
// getKClass should be imported as intrinsic when used outside of inline context, otherwise bootstrap fails.
// Inside an inline function it should however be marked as SpecialFunction to support T::class when T -> Int (KT-32215)
JsName kClassName = context.getNameForIntrinsic(SpecialFunction.GET_KCLASS.getSuggestedName());
MetadataProperties.setSpecialFunction(kClassName, SpecialFunction.GET_KCLASS);
return new JsInvocation(kClassName.makeRef(), UtilsKt.getReferenceToJsClass(descriptor, context));
} }
@Nullable @Nullable