KT-13836: fix generation of FQN of secondary constructor when it's called via typealias. Fix #KT-13836

This commit is contained in:
Alexey Andreev
2016-09-14 12:11:22 +03:00
parent 115d63a2f3
commit 5d34f5fb75
5 changed files with 60 additions and 0 deletions
@@ -0,0 +1,9 @@
object O {
val x = "OK"
operator fun invoke() = x
}
typealias A = O
fun box(): String = A()
@@ -0,0 +1,11 @@
class C(val x: String) {
constructor(n: Int) : this(n.toString())
}
typealias Alias = C
fun box(): String {
val c = Alias(23)
if (c.x != "23") return "fail: $c"
return "OK"
}
@@ -15603,6 +15603,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt"); String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("typeAliasObjectCallable.kt")
public void testTypeAliasObjectCallable() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt");
doTest(fileName);
}
@TestMetadata("typeAliasSecondaryConstructor.kt")
public void testTypeAliasSecondaryConstructor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasSecondaryConstructor.kt");
doTest(fileName);
}
} }
@TestMetadata("compiler/testData/codegen/box/unaryOp") @TestMetadata("compiler/testData/codegen/box/unaryOp")
@@ -76,4 +76,16 @@ public class TypeAliasesTestsGenerated extends AbstractTypeAliasesTests {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt"); String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");
doTest(fileName); doTest(fileName);
} }
@TestMetadata("typeAliasObjectCallable.kt")
public void testTypeAliasObjectCallable() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObjectCallable.kt");
doTest(fileName);
}
@TestMetadata("typeAliasSecondaryConstructor.kt")
public void testTypeAliasSecondaryConstructor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasSecondaryConstructor.kt");
doTest(fileName);
}
} }
@@ -29,6 +29,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.ReflectionTypes; import org.jetbrains.kotlin.builtins.ReflectionTypes;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor;
import org.jetbrains.kotlin.js.config.JsConfig; import org.jetbrains.kotlin.js.config.JsConfig;
import org.jetbrains.kotlin.js.config.LibrarySourcesConfig; import org.jetbrains.kotlin.js.config.LibrarySourcesConfig;
import org.jetbrains.kotlin.js.translate.context.generator.Generator; import org.jetbrains.kotlin.js.translate.context.generator.Generator;
@@ -266,6 +267,20 @@ public final class StaticContext {
private final class NameGenerator extends Generator<JsName> { private final class NameGenerator extends Generator<JsName> {
public NameGenerator() { public NameGenerator() {
Rule<JsName> typeAliasConstructor = new Rule<JsName>() {
@Nullable
@Override
public JsName apply(@NotNull DeclarationDescriptor descriptor) {
if (descriptor instanceof TypeAliasConstructorDescriptor) {
TypeAliasConstructorDescriptor constructorDescriptor = (TypeAliasConstructorDescriptor) descriptor;
return getNameForDescriptor(constructorDescriptor.getUnderlyingConstructorDescriptor());
}
else {
return null;
}
}
};
Rule<JsName> namesForDynamic = new Rule<JsName>() { Rule<JsName> namesForDynamic = new Rule<JsName>() {
@Override @Override
@Nullable @Nullable
@@ -422,6 +437,7 @@ public final class StaticContext {
} }
}; };
addRule(typeAliasConstructor);
addRule(namesForDynamic); addRule(namesForDynamic);
addRule(localClasses); addRule(localClasses);
addRule(namesForStandardClasses); addRule(namesForStandardClasses);