Fixed bug when class or trait declared early than its parent, traits and abstract classes which declared after doesn't translated
#KT-3437 Fixed
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
<orderEntry type="module" module-name="frontend" />
|
<orderEntry type="module" module-name="frontend" />
|
||||||
<orderEntry type="library" name="js-libs" level="project" />
|
<orderEntry type="library" name="js-libs" level="project" />
|
||||||
<orderEntry type="library" scope="PROVIDED" name="intellij-core" level="project" />
|
<orderEntry type="library" scope="PROVIDED" name="intellij-core" level="project" />
|
||||||
|
<orderEntry type="module" module-name="util" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
|
|
||||||
|
|||||||
+35
-28
@@ -20,7 +20,6 @@ import com.google.dart.compiler.backend.js.ast.*;
|
|||||||
import com.intellij.openapi.util.Pair;
|
import com.intellij.openapi.util.Pair;
|
||||||
import com.intellij.util.SmartList;
|
import com.intellij.util.SmartList;
|
||||||
import gnu.trove.THashMap;
|
import gnu.trove.THashMap;
|
||||||
import gnu.trove.TLinkable;
|
|
||||||
import gnu.trove.TLinkableAdaptor;
|
import gnu.trove.TLinkableAdaptor;
|
||||||
import gnu.trove.TLinkedList;
|
import gnu.trove.TLinkedList;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -29,19 +28,20 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
|||||||
import org.jetbrains.jet.lang.descriptors.Modality;
|
import org.jetbrains.jet.lang.descriptors.Modality;
|
||||||
import org.jetbrains.jet.lang.psi.JetClass;
|
import org.jetbrains.jet.lang.psi.JetClass;
|
||||||
import org.jetbrains.jet.lang.psi.JetClassOrObject;
|
import org.jetbrains.jet.lang.psi.JetClassOrObject;
|
||||||
|
import org.jetbrains.jet.lang.types.JetType;
|
||||||
|
import org.jetbrains.jet.utils.DFS;
|
||||||
import org.jetbrains.k2js.translate.LabelGenerator;
|
import org.jetbrains.k2js.translate.LabelGenerator;
|
||||||
import org.jetbrains.k2js.translate.context.Namer;
|
import org.jetbrains.k2js.translate.context.Namer;
|
||||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||||
import org.jetbrains.k2js.translate.general.AbstractTranslator;
|
import org.jetbrains.k2js.translate.general.AbstractTranslator;
|
||||||
import org.jetbrains.k2js.translate.initializer.InitializerUtils;
|
import org.jetbrains.k2js.translate.initializer.InitializerUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static com.google.dart.compiler.backend.js.ast.JsVars.JsVar;
|
import static com.google.dart.compiler.backend.js.ast.JsVars.JsVar;
|
||||||
|
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.getClassDescriptorForType;
|
||||||
import static org.jetbrains.k2js.translate.general.Translation.translateClassDeclaration;
|
import static org.jetbrains.k2js.translate.general.Translation.translateClassDeclaration;
|
||||||
import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor;
|
import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor;
|
||||||
import static org.jetbrains.k2js.translate.utils.ErrorReportingUtils.message;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generates a big block where are all the classes(objects representing them) are created.
|
* Generates a big block where are all the classes(objects representing them) are created.
|
||||||
@@ -55,6 +55,9 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
|
|||||||
private final TLinkedList<FinalListItem> openList = new TLinkedList<FinalListItem>();
|
private final TLinkedList<FinalListItem> openList = new TLinkedList<FinalListItem>();
|
||||||
private final List<Pair<JetClassOrObject, JsInvocation>> finalList = new ArrayList<Pair<JetClassOrObject, JsInvocation>>();
|
private final List<Pair<JetClassOrObject, JsInvocation>> finalList = new ArrayList<Pair<JetClassOrObject, JsInvocation>>();
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private final ClassDescriptorToLabel classDescriptorToLabel = new ClassDescriptorToLabel();
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private final JsFunction dummyFunction;
|
private final JsFunction dummyFunction;
|
||||||
|
|
||||||
@@ -70,7 +73,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
|
|||||||
declarationsObjectRef = declarationsObject.makeRef();
|
declarationsObjectRef = declarationsObject.makeRef();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class OpenClassRefProvider implements ClassAliasingMap {
|
private final class ClassDescriptorToLabel implements ClassAliasingMap {
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public JsNameRef get(ClassDescriptor descriptor, ClassDescriptor referencedDescriptor) {
|
public JsNameRef get(ClassDescriptor descriptor, ClassDescriptor referencedDescriptor) {
|
||||||
@@ -80,20 +83,8 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
addAfter(item, openClassDescriptorToItem.get(referencedDescriptor));
|
|
||||||
return item.label;
|
return item.label;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addAfter(@NotNull FinalListItem item, @NotNull FinalListItem referencedItem) {
|
|
||||||
for (TLinkable link = item.getNext(); link != null; link = link.getNext()) {
|
|
||||||
if (link == referencedItem) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
openList.remove(referencedItem);
|
|
||||||
openList.addBefore((FinalListItem) item.getNext(), referencedItem);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class FinalListItem extends TLinkableAdaptor {
|
private static class FinalListItem extends TLinkableAdaptor {
|
||||||
@@ -101,8 +92,6 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
|
|||||||
private final JsNameRef label;
|
private final JsNameRef label;
|
||||||
private final JsNameRef qualifiedLabel;
|
private final JsNameRef qualifiedLabel;
|
||||||
|
|
||||||
private JsExpression translatedDeclaration;
|
|
||||||
|
|
||||||
private FinalListItem(JetClass declaration, JsNameRef label, JsNameRef qualifiedLabel) {
|
private FinalListItem(JetClass declaration, JsNameRef label, JsNameRef qualifiedLabel) {
|
||||||
this.declaration = declaration;
|
this.declaration = declaration;
|
||||||
this.label = label;
|
this.label = label;
|
||||||
@@ -134,17 +123,35 @@ public final class ClassDeclarationTranslator extends AbstractTranslator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void generateOpenClassDeclarations(@NotNull List<JsVar> vars, @NotNull List<JsPropertyInitializer> propertyInitializers) {
|
private void generateOpenClassDeclarations(@NotNull List<JsVar> vars, @NotNull List<JsPropertyInitializer> propertyInitializers) {
|
||||||
ClassAliasingMap classAliasingMap = new OpenClassRefProvider();
|
|
||||||
// first pass: set up list order
|
// first pass: set up list order
|
||||||
for (FinalListItem item : openList) {
|
LinkedList<FinalListItem> sortedOpenClasses =
|
||||||
item.translatedDeclaration = translateClassDeclaration(item.declaration, classAliasingMap, context());
|
(LinkedList<FinalListItem>) DFS.topologicalOrder(openList, new DFS.Neighbors<FinalListItem>() {
|
||||||
}
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Iterable<FinalListItem> getNeighbors(FinalListItem current) {
|
||||||
|
TLinkedList<FinalListItem> parents = new TLinkedList<FinalListItem>();
|
||||||
|
ClassDescriptor classDescriptor = getClassDescriptor(context().bindingContext(), current.declaration);
|
||||||
|
Collection<JetType> superTypes = classDescriptor.getTypeConstructor().getSupertypes();
|
||||||
|
|
||||||
|
for (JetType type : superTypes) {
|
||||||
|
ClassDescriptor descriptor = getClassDescriptorForType(type);
|
||||||
|
FinalListItem item = openClassDescriptorToItem.get(descriptor);
|
||||||
|
if (item == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
parents.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
return parents;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// second pass: generate
|
// second pass: generate
|
||||||
for (FinalListItem item : openList) {
|
Iterator<FinalListItem> it = sortedOpenClasses.descendingIterator();
|
||||||
JsExpression translatedDeclaration = item.translatedDeclaration;
|
while (it.hasNext()) {
|
||||||
if (translatedDeclaration == null) {
|
FinalListItem item = it.next();
|
||||||
throw new IllegalStateException(message(item.declaration, "Could not translate class declaration)"));
|
JsExpression translatedDeclaration = translateClassDeclaration(item.declaration, classDescriptorToLabel, context());
|
||||||
}
|
|
||||||
generate(item, propertyInitializers, translatedDeclaration, vars);
|
generate(item, propertyInitializers, translatedDeclaration, vars);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ open class B() : A() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open class A() {
|
open class A() : G() {
|
||||||
|
|
||||||
var order = ""
|
var order = ""
|
||||||
{
|
{
|
||||||
@@ -32,6 +32,13 @@ open class A() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KT-3437
|
||||||
|
abstract class G : H()
|
||||||
|
abstract class K : H()
|
||||||
|
abstract class L
|
||||||
|
abstract class H : L()
|
||||||
|
abstract class Dummy
|
||||||
|
|
||||||
fun box() : Boolean {
|
fun box() : Boolean {
|
||||||
return (C().order == "ABC") && (D().order == "ABD") && (E().order == "AE")
|
return (C().order == "ABC") && (D().order == "ABD") && (E().order == "AE")
|
||||||
}
|
}
|
||||||
@@ -32,10 +32,17 @@ open class A() : F {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trait F {
|
trait F : G {
|
||||||
fun bar() = "F"
|
fun bar() = "F"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KT-3437
|
||||||
|
trait G : H
|
||||||
|
trait K : H
|
||||||
|
trait L
|
||||||
|
trait H : L
|
||||||
|
trait Dummy
|
||||||
|
|
||||||
fun box() : Boolean {
|
fun box() : Boolean {
|
||||||
return (C().order == "ABC") && (D().order == "ABD") && (E().order == "AE") && (C().bar() == "F") && (A().bar() == "F")
|
return (C().order == "ABC") && (D().order == "ABD") && (E().order == "AE") && (C().bar() == "F") && (A().bar() == "F")
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user