diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index fcc876796a3..f558a2c638c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -87,7 +87,7 @@ public final class StaticContext { @NotNull private final Generator scopes = new ScopeGenerator(); @NotNull - private final Generator qualifiers = new QualifierGenerator(); + private final Generator qualifiers = new QualifierGenerator(); @NotNull private final Generator qualifierIsNull = new QualifierIsNullGenerator(); @@ -437,18 +437,18 @@ public final class StaticContext { } @Nullable - public JsNameRef getQualifierForDescriptor(@NotNull DeclarationDescriptor descriptor) { + public JsExpression getQualifierForDescriptor(@NotNull DeclarationDescriptor descriptor) { if (qualifierIsNull.get(descriptor.getOriginal()) != null) { return null; } return qualifiers.get(descriptor.getOriginal()); } - private final class QualifierGenerator extends Generator { + private final class QualifierGenerator extends Generator { public QualifierGenerator() { - Rule standardObjectsHaveKotlinQualifier = new Rule() { + Rule standardObjectsHaveKotlinQualifier = new Rule() { @Override - public JsNameRef apply(@NotNull DeclarationDescriptor descriptor) { + public JsExpression apply(@NotNull DeclarationDescriptor descriptor) { if (!standardClasses.isStandardObject(descriptor)) { return null; } @@ -456,9 +456,9 @@ public final class StaticContext { } }; //TODO: review and refactor - Rule packageLevelDeclarationsHaveEnclosingPackagesNamesAsQualifier = new Rule() { + Rule packageLevelDeclarationsHaveEnclosingPackagesNamesAsQualifier = new Rule() { @Override - public JsNameRef apply(@NotNull DeclarationDescriptor descriptor) { + public JsExpression apply(@NotNull DeclarationDescriptor descriptor) { if (isNativeObject(descriptor)) return null; DeclarationDescriptor containingDescriptor = getContainingDeclaration(descriptor); @@ -477,9 +477,8 @@ public final class StaticContext { return null; } - JsAstUtils.replaceRootReference( + return JsAstUtils.replaceRootReference( result, new JsArrayAccess(namer.kotlin("modules"), program.getStringLiteral(moduleName))); - return result; } private String getExternalModuleName(DeclarationDescriptor descriptor) { @@ -496,9 +495,9 @@ public final class StaticContext { return element.getContainingFile().getUserData(LibrarySourcesConfig.EXTERNAL_MODULE_NAME); } }; - Rule constructorOrClassObjectHasTheSameQualifierAsTheClass = new Rule() { + Rule constructorOrClassObjectHasTheSameQualifierAsTheClass = new Rule() { @Override - public JsNameRef apply(@NotNull DeclarationDescriptor descriptor) { + public JsExpression apply(@NotNull DeclarationDescriptor descriptor) { if (descriptor instanceof ConstructorDescriptor || DescriptorUtils.isClassObject(descriptor)) { //noinspection ConstantConditions return getQualifierForDescriptor(descriptor.getContainingDeclaration()); @@ -506,18 +505,18 @@ public final class StaticContext { return null; } }; - Rule libraryObjectsHaveKotlinQualifier = new Rule() { + Rule libraryObjectsHaveKotlinQualifier = new Rule() { @Override - public JsNameRef apply(@NotNull DeclarationDescriptor descriptor) { + public JsExpression apply(@NotNull DeclarationDescriptor descriptor) { if (isLibraryObject(descriptor)) { return namer.kotlinObject(); } return null; } }; - Rule nativeObjectsHaveNativePartOfFullQualifier = new Rule() { + Rule nativeObjectsHaveNativePartOfFullQualifier = new Rule() { @Override - public JsNameRef apply(@NotNull DeclarationDescriptor descriptor) { + public JsExpression apply(@NotNull DeclarationDescriptor descriptor) { if (descriptor instanceof ConstructorDescriptor || !isNativeObject(descriptor)) return null; DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); @@ -528,9 +527,9 @@ public final class StaticContext { return null; } }; - Rule staticMembersHaveContainerQualifier = new Rule() { + Rule staticMembersHaveContainerQualifier = new Rule() { @Override - public JsNameRef apply(@NotNull DeclarationDescriptor descriptor) { + public JsExpression apply(@NotNull DeclarationDescriptor descriptor) { if (descriptor instanceof CallableDescriptor && !isNativeObject(descriptor)) { CallableDescriptor callableDescriptor = (CallableDescriptor) descriptor; if (DescriptorUtils.isStaticDeclaration(callableDescriptor)) { diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java index ff3f93ab4e0..aa168487405 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/TranslationContext.java @@ -205,7 +205,7 @@ public class TranslationContext { } @Nullable - public JsNameRef getQualifierForDescriptor(@NotNull DeclarationDescriptor descriptor) { + public JsExpression getQualifierForDescriptor(@NotNull DeclarationDescriptor descriptor) { return staticContext.getQualifierForDescriptor(descriptor); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java index ab24a11e0d1..1ed72ff3d1f 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/JsAstUtils.java @@ -449,7 +449,13 @@ public final class JsAstUtils { return new JsObjectLiteral(Collections.singletonList(new JsPropertyInitializer(label, value))); } - public static void replaceRootReference(@NotNull JsNameRef fullQualifier, @NotNull JsExpression newQualifier) { + public static JsExpression replaceRootReference(@NotNull JsNameRef fullQualifier, @NotNull JsExpression newQualifier) { + if (fullQualifier.getQualifier() == null) { + assert Namer.getRootPackageName().equals(fullQualifier.getIdent()) : "Expected root package, but: " + fullQualifier.getIdent(); + return newQualifier; + } + + fullQualifier = fullQualifier.deepCopy(); JsNameRef qualifier = fullQualifier; while (true) { JsExpression parent = qualifier.getQualifier(); @@ -457,7 +463,7 @@ public final class JsAstUtils { if (((JsNameRef) parent).getQualifier() == null) { assert Namer.getRootPackageName().equals(((JsNameRef) parent).getIdent()); qualifier.setQualifier(newQualifier); - return; + return fullQualifier; } qualifier = (JsNameRef) parent; }