From 7680203de2acfdecf0f76485ea1d10c24376c527 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Thu, 11 Apr 2013 18:54:16 +0400 Subject: [PATCH] Fixed wrong linearization for open classes and traits. openList changed during neighbors calculation because the same TLinkable object cannot be put into more than one TLinkedList at the same time. #KT-3499 fixed --- .../k2js/test/semantics/ClassInheritanceTest.java | 4 ++++ .../declaration/ClassDeclarationTranslator.java | 4 +++- .../testFiles/inheritance/cases/kt3499.kt | 13 +++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testFiles/inheritance/cases/kt3499.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClassInheritanceTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClassInheritanceTest.java index f5001ca9c92..644778294c3 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClassInheritanceTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/ClassInheritanceTest.java @@ -55,6 +55,10 @@ public final class ClassInheritanceTest extends SingleFileTranslationTest { public void testAbstractVarOverride() throws Exception { fooBoxTest(); } + + public void testKt3499() throws Exception { + fooBoxTest(); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java index 03fb98ebfb1..bd58a268a8a 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java @@ -129,7 +129,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { @NotNull @Override public Iterable getNeighbors(FinalListItem current) { - TLinkedList parents = new TLinkedList(); + LinkedList parents = new LinkedList(); ClassDescriptor classDescriptor = getClassDescriptor(context().bindingContext(), current.declaration); Collection superTypes = classDescriptor.getTypeConstructor().getSupertypes(); @@ -147,6 +147,8 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { } }); + assert sortedOpenClasses.size() == openList.size(); + // second pass: generate Iterator it = sortedOpenClasses.descendingIterator(); while (it.hasNext()) { diff --git a/js/js.translator/testFiles/inheritance/cases/kt3499.kt b/js/js.translator/testFiles/inheritance/cases/kt3499.kt new file mode 100644 index 00000000000..2fd7f4a19a0 --- /dev/null +++ b/js/js.translator/testFiles/inheritance/cases/kt3499.kt @@ -0,0 +1,13 @@ +package foo + +trait A : B, E +trait B +open class C { + fun foo() = true +} +trait D +trait E +trait F : G, D +trait G + +fun box() = C().foo() \ No newline at end of file