diff --git a/.idea/workspace.xml b/.idea/workspace.xml index e7120107d33..c6634cc28f4 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -8,10 +8,38 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + @@ -165,40 +193,13 @@ - + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - + @@ -207,14 +208,59 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -223,7 +269,7 @@ - + @@ -232,7 +278,7 @@ - + @@ -244,39 +290,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -285,16 +329,38 @@ - + + + + + + + + + + + + + + + + + + + + + + + - + @@ -303,34 +369,16 @@ - + - - + + - - - - - - - - - - - - - - - - - - - + @@ -357,22 +405,22 @@ @@ -508,7 +556,7 @@ @@ -1063,76 +1265,16 @@ - + - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -1144,23 +1286,39 @@ - + + + + + + + + - + - - + + + + - + + + + + + + + @@ -1172,9 +1330,53 @@ + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java index 3312083cfc9..5c5f3eb1ec4 100644 --- a/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/declaration/ClassDeclarationTranslator.java @@ -95,7 +95,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { private void removeAliases() { for (JetClass jetClass : getClassDeclarations()) { - context().aliases().remove(jetClass); + context().aliaser().removeAliasForDeclaration(jetClass); } } @@ -122,7 +122,7 @@ public final class ClassDeclarationTranslator extends AbstractTranslator { JsName globalClassName = context().getNameForElement(declaration); JsName localAlias = dummyFunctionScope.declareName(globalClassName.getIdent()); localToGlobalClassName.put(localAlias, globalClassName); - context().aliases().put(declaration, localAlias); + context().aliaser().setAliasForDeclaration(declaration, localAlias); return localAlias; } } diff --git a/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java b/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java index c716ee81fa7..8c0ae7a2f6f 100644 --- a/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java @@ -102,8 +102,8 @@ public final class ClassTranslator extends AbstractTranslator { private JsNameRef getClassReference(@NotNull ClassDescriptor superClassDescriptor) { //TODO we actually know that in current implementation superclass must have an alias but // if future it might change - return context().aliases().get - (BindingUtils.getClassForDescriptor(context().bindingContext(), superClassDescriptor)).makeRef(); + return context().aliaser().getAliasForDeclaration( + BindingUtils.getClassForDescriptor(context().bindingContext(), superClassDescriptor)); } @Nullable diff --git a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 6cf08b9a834..547ea3b1d72 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -100,7 +100,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull // assume it is a local variable declaration public JsNode visitProperty(@NotNull JetProperty expression, @NotNull TranslationContext context) { - JsName jsPropertyName = context.declareLocalName(getPropertyName(expression)); + JsName jsPropertyName = context.enclosingScope().declareName(getPropertyName(expression)); JsExpression jsInitExpression = translateInitializerForProperty(expression, context); return AstUtil.newVar(jsPropertyName, jsInitExpression); } @@ -380,8 +380,8 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull public JsNode visitThisExpression(@NotNull JetThisExpression expression, @NotNull TranslationContext context) { - if (context.hasAliasForThis()) { - return context.getAliasForThis(); + if (context.aliaser().hasAliasForThis()) { + return context.aliaser().getAliasForThis(); } return new JsThisRef(); } diff --git a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java index 3221f3d920a..51e2c4418ee 100644 --- a/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/expression/FunctionTranslator.java @@ -46,9 +46,9 @@ public final class FunctionTranslator extends AbstractTranslator { @NotNull public JsExpression translateAsLiteral() { JsName aliasForThis = context().enclosingScope().declareName("that"); - context().setAliasForThis(aliasForThis); + context().aliaser().setAliasForThis(aliasForThis); JsFunction function = generateFunctionObject(); - context().removeAliasForThis(); + context().aliaser().removeAliasForThis(); JsExpression assignThatToThis = AstUtil.newAssignment(aliasForThis.makeRef(), new JsThisRef()); return AstUtil.newSequence(assignThatToThis, function); } diff --git a/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java b/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java new file mode 100644 index 00000000000..8a32880c612 --- /dev/null +++ b/translator/src/org/jetbrains/k2js/translate/general/Aliaser.java @@ -0,0 +1,59 @@ +package org.jetbrains.k2js.translate.general; + +import com.google.dart.compiler.backend.js.ast.JsName; +import com.google.dart.compiler.backend.js.ast.JsNameRef; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.psi.JetDeclaration; + +import java.util.HashMap; +import java.util.Map; + +public class Aliaser { + @NotNull + private final Map aliases = new HashMap(); + @Nullable + private JsName aliasForThis = null; + + public Aliaser() { + } + + @NotNull + public JsNameRef getAliasForThis() { + assert aliasForThis != null : "Alias is null. Use hasAliasForThis function to check."; + return aliasForThis.makeRef(); + } + + public void setAliasForThis(@NotNull JsName alias) { + aliasForThis = alias; + } + + public void removeAliasForThis() { + aliasForThis = null; + } + + public boolean hasAliasForThis() { + return (aliasForThis != null); + } + + public boolean hasAliasForDeclaration(@NotNull JetDeclaration declaration) { + return aliases.containsKey(declaration); + } + + @NotNull + public JsNameRef getAliasForDeclaration(@NotNull JetDeclaration declaration) { + JsName alias = aliases.get(declaration); + assert alias != null : "Use has alias for declaration to check."; + return alias.makeRef(); + } + + public void setAliasForDeclaration(@NotNull JetDeclaration declaration, @NotNull JsName alias) { + assert (!hasAliasForDeclaration(declaration)) : "This declaration already has an alias!"; + aliases.put(declaration, alias); + } + + public void removeAliasForDeclaration(@NotNull JetDeclaration declaration) { + assert (hasAliasForDeclaration(declaration)) : "This declaration does not has an alias!"; + aliases.remove(declaration); + } +} \ No newline at end of file diff --git a/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java b/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java index 1a8ea33a763..d3e5d003366 100644 --- a/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java +++ b/translator/src/org/jetbrains/k2js/translate/general/TranslationContext.java @@ -13,15 +13,11 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.k2js.declarations.Declarations; import org.jetbrains.k2js.translate.utils.BindingUtils; -import java.util.HashMap; -import java.util.Map; - /** * @author Talanov Pavel */ public final class TranslationContext { - // TODO: extract different parts of this classes into separate classes private static class Scopes { public Scopes(@NotNull JsScope enclosingScope, @NotNull JsScope functionScope, @NotNull JsScope namespaceScope) { @@ -44,7 +40,7 @@ public final class TranslationContext { JsScope rootScope = program.getRootScope(); Scopes scopes = new Scopes(rootScope, rootScope, rootScope); return new TranslationContext(null, program, bindingContext, - scopes, extractor, new HashMap(), null); + scopes, extractor, new Aliaser()); } @NotNull @@ -58,22 +54,18 @@ public final class TranslationContext { @NotNull private final Declarations declarations; @NotNull - private final Map aliases; - @Nullable - private JsName aliasForThis; + private final Aliaser aliaser; private TranslationContext(@Nullable JsName namespaceName, @NotNull JsProgram program, @NotNull BindingContext bindingContext, @NotNull Scopes scopes, - @NotNull Declarations declarations, @NotNull Map aliases, - @Nullable JsName aliasForThis) { + @NotNull Declarations declarations, @NotNull Aliaser aliaser) { this.program = program; this.bindingContext = bindingContext; this.namespaceName = namespaceName; this.scopes = scopes; this.declarations = declarations; - this.aliases = aliases; - this.aliasForThis = aliasForThis; + this.aliaser = aliaser; } @NotNull @@ -87,7 +79,7 @@ public final class TranslationContext { JsName namespaceName = getNameForDescriptor(descriptor); Scopes newScopes = new Scopes(namespaceScope, namespaceScope, namespaceScope); return new TranslationContext(namespaceName, program, bindingContext, newScopes, - declarations, aliases, aliasForThis); + declarations, new Aliaser()); } @NotNull @@ -100,7 +92,7 @@ public final class TranslationContext { JsScope classScope = declarations.getScope(descriptor); Scopes newScopes = new Scopes(classScope, classScope, scopes.namespaceScope); return new TranslationContext(namespaceName, program, bindingContext, - newScopes, declarations, aliases, aliasForThis); + newScopes, declarations, aliaser); } @NotNull @@ -123,7 +115,7 @@ public final class TranslationContext { JsScope functionScope = declarations.getScope(descriptor); Scopes newScopes = new Scopes(functionScope, scopes.classScope, scopes.namespaceScope); return new TranslationContext(namespaceName, program, bindingContext, - newScopes, declarations, aliases, aliasForThis); + newScopes, declarations, aliaser); } // @NotNull TranslationContext newAliases(Map newAliases) { @@ -137,7 +129,7 @@ public final class TranslationContext { public TranslationContext newEnclosingScope(@NotNull JsScope enclosingScope) { Scopes newScopes = new Scopes(enclosingScope, scopes.classScope, scopes.namespaceScope); return new TranslationContext(namespaceName, program, bindingContext, - newScopes, declarations, aliases, aliasForThis); + newScopes, declarations, aliaser); } @@ -174,15 +166,6 @@ public final class TranslationContext { return scopes.classScope; } - @NotNull - public Map aliases() { - return aliases; - } - - @NotNull - public JsName declareLocalName(@NotNull String name) { - return scopes.enclosingScope.declareFreshName(name); - } @NotNull public JsScope getScopeForDescriptor(@NotNull DeclarationDescriptor descriptor) { @@ -213,25 +196,11 @@ public final class TranslationContext { return descriptor; } - @NotNull - public JsNameRef getAliasForThis() { - assert aliasForThis != null : "Alias is null. Use hasAliasForThis function to check."; - return aliasForThis.makeRef(); - } - - public void setAliasForThis(@NotNull JsName alias) { - aliasForThis = alias; - } - - public void removeAliasForThis() { - aliasForThis = null; - } - - public boolean hasAliasForThis() { - return (aliasForThis != null); - } - public boolean isDeclared(@NotNull DeclarationDescriptor descriptor) { return declarations.isDeclared(descriptor); } + + public Aliaser aliaser() { + return aliaser; + } } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceProvider.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceProvider.java index c1000e10641..95a07c78e62 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceProvider.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceProvider.java @@ -54,11 +54,11 @@ public final class ReferenceProvider { } private JsNameRef thisQualifiedReference() { - if (!context.hasAliasForThis()) { + if (!context.aliaser().hasAliasForThis()) { return AstUtil.thisQualifiedReference(referencedName); } JsNameRef reference = referencedName.makeRef(); - AstUtil.setQualifier(reference, context.getAliasForThis()); + AstUtil.setQualifier(reference, context.aliaser().getAliasForThis()); return reference; } diff --git a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index 3c1c533424f..1599361e0f1 100644 --- a/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -59,10 +59,11 @@ public class ReferenceTranslator extends AbstractTranslator { BindingUtils.getDeclarationForDescriptor(context().bindingContext(), referencedDescriptor); if (declaration == null) return null; - JsName alias = context().aliases().get(declaration); - if (alias == null) return null; + if (!context().aliaser().hasAliasForDeclaration(declaration)) { + return null; + } - return alias.makeRef(); + return context().aliaser().getAliasForDeclaration(declaration); } @Nullable diff --git a/translator/testFiles/sortedTests/unsupported/basicproperty.jet b/translator/testFiles/examples/sortedTests/unsupported/basicproperty.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/basicproperty.jet rename to translator/testFiles/examples/sortedTests/unsupported/basicproperty.jet diff --git a/translator/testFiles/sortedTests/unsupported/classObject.jet b/translator/testFiles/examples/sortedTests/unsupported/classObject.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/classObject.jet rename to translator/testFiles/examples/sortedTests/unsupported/classObject.jet diff --git a/translator/testFiles/sortedTests/unsupported/classObjectInterface.jet b/translator/testFiles/examples/sortedTests/unsupported/classObjectInterface.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/classObjectInterface.jet rename to translator/testFiles/examples/sortedTests/unsupported/classObjectInterface.jet diff --git a/translator/testFiles/sortedTests/unsupported/classObjectMethod.jet b/translator/testFiles/examples/sortedTests/unsupported/classObjectMethod.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/classObjectMethod.jet rename to translator/testFiles/examples/sortedTests/unsupported/classObjectMethod.jet diff --git a/translator/testFiles/sortedTests/unsupported/enclosed.jet b/translator/testFiles/examples/sortedTests/unsupported/enclosed.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/enclosed.jet rename to translator/testFiles/examples/sortedTests/unsupported/enclosed.jet diff --git a/translator/testFiles/sortedTests/unsupported/extensionClosure.jet b/translator/testFiles/examples/sortedTests/unsupported/extensionClosure.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/extensionClosure.jet rename to translator/testFiles/examples/sortedTests/unsupported/extensionClosure.jet diff --git a/translator/testFiles/examples/sortedTests/unsupported/forwardTypeParameter.jet b/translator/testFiles/examples/sortedTests/unsupported/forwardTypeParameter.jet new file mode 100644 index 00000000000..2e78cd3ae9c --- /dev/null +++ b/translator/testFiles/examples/sortedTests/unsupported/forwardTypeParameter.jet @@ -0,0 +1,12 @@ +class Foo() { } +class Bar() { } + +fun isInstance(obj: Any?) = obj is T + +fun isInstance2(obj: Any?) = isInstance(obj) + +fun box(): String { + if (! isInstance2(Foo())) return "fail 1" + if (isInstance2(Foo())) return "fail 2" + return "OK" +} diff --git a/translator/testFiles/sortedTests/unsupported/inheritance.jet b/translator/testFiles/examples/sortedTests/unsupported/inheritance.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/inheritance.jet rename to translator/testFiles/examples/sortedTests/unsupported/inheritance.jet diff --git a/translator/testFiles/sortedTests/unsupported/inheritedInnerClass.jet b/translator/testFiles/examples/sortedTests/unsupported/inheritedInnerClass.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/inheritedInnerClass.jet rename to translator/testFiles/examples/sortedTests/unsupported/inheritedInnerClass.jet diff --git a/translator/testFiles/sortedTests/unsupported/propertyInInitializer.jet b/translator/testFiles/examples/sortedTests/unsupported/propertyInInitializer.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/propertyInInitializer.jet rename to translator/testFiles/examples/sortedTests/unsupported/propertyInInitializer.jet diff --git a/translator/testFiles/sortedTests/unsupported/simpleBox.jet b/translator/testFiles/examples/sortedTests/unsupported/simpleBox.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/simpleBox.jet rename to translator/testFiles/examples/sortedTests/unsupported/simpleBox.jet diff --git a/translator/testFiles/sortedTests/unsupported/traitproperty.jet b/translator/testFiles/examples/sortedTests/unsupported/traitproperty.jet similarity index 100% rename from translator/testFiles/sortedTests/unsupported/traitproperty.jet rename to translator/testFiles/examples/sortedTests/unsupported/traitproperty.jet diff --git a/translator/testFiles/sortedTests/usesJava/basicmethod.jet b/translator/testFiles/examples/sortedTests/usesJava/basicmethod.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/basicmethod.jet rename to translator/testFiles/examples/sortedTests/usesJava/basicmethod.jet diff --git a/translator/testFiles/sortedTests/unexpectedError/exceptionConstructor.jet b/translator/testFiles/examples/sortedTests/usesJava/exceptionConstructor.jet similarity index 100% rename from translator/testFiles/sortedTests/unexpectedError/exceptionConstructor.jet rename to translator/testFiles/examples/sortedTests/usesJava/exceptionConstructor.jet diff --git a/translator/testFiles/sortedTests/usesJava/inheritingFromArrayList.jet b/translator/testFiles/examples/sortedTests/usesJava/inheritingFromArrayList.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/inheritingFromArrayList.jet rename to translator/testFiles/examples/sortedTests/usesJava/inheritingFromArrayList.jet diff --git a/translator/testFiles/sortedTests/usesJava/initializerBlockDImpl.jet b/translator/testFiles/examples/sortedTests/usesJava/initializerBlockDImpl.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/initializerBlockDImpl.jet rename to translator/testFiles/examples/sortedTests/usesJava/initializerBlockDImpl.jet diff --git a/translator/testFiles/sortedTests/usesJava/innerClass.jet b/translator/testFiles/examples/sortedTests/usesJava/innerClass.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/innerClass.jet rename to translator/testFiles/examples/sortedTests/usesJava/innerClass.jet diff --git a/translator/testFiles/sortedTests/usesJava/overloadBinaryOperator.jet b/translator/testFiles/examples/sortedTests/usesJava/overloadBinaryOperator.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/overloadBinaryOperator.jet rename to translator/testFiles/examples/sortedTests/usesJava/overloadBinaryOperator.jet diff --git a/translator/testFiles/sortedTests/usesJava/overloadPlusAssign.jet b/translator/testFiles/examples/sortedTests/usesJava/overloadPlusAssign.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/overloadPlusAssign.jet rename to translator/testFiles/examples/sortedTests/usesJava/overloadPlusAssign.jet diff --git a/translator/testFiles/sortedTests/usesJava/overloadPlusAssignReturn.jet b/translator/testFiles/examples/sortedTests/usesJava/overloadPlusAssignReturn.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/overloadPlusAssignReturn.jet rename to translator/testFiles/examples/sortedTests/usesJava/overloadPlusAssignReturn.jet diff --git a/translator/testFiles/sortedTests/usesJava/overloadPlusToPlusAssign.jet b/translator/testFiles/examples/sortedTests/usesJava/overloadPlusToPlusAssign.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/overloadPlusToPlusAssign.jet rename to translator/testFiles/examples/sortedTests/usesJava/overloadPlusToPlusAssign.jet diff --git a/translator/testFiles/sortedTests/usesJava/overloadUnaryOperator.jet b/translator/testFiles/examples/sortedTests/usesJava/overloadUnaryOperator.jet similarity index 100% rename from translator/testFiles/sortedTests/usesJava/overloadUnaryOperator.jet rename to translator/testFiles/examples/sortedTests/usesJava/overloadUnaryOperator.jet