JS backend: fix KT-6323: KotlinJS library modules
#KT-6323 Fixed
This commit is contained in:
@@ -87,7 +87,7 @@ public final class StaticContext {
|
||||
@NotNull
|
||||
private final Generator<JsScope> scopes = new ScopeGenerator();
|
||||
@NotNull
|
||||
private final Generator<JsNameRef> qualifiers = new QualifierGenerator();
|
||||
private final Generator<JsExpression> qualifiers = new QualifierGenerator();
|
||||
@NotNull
|
||||
private final Generator<Boolean> 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<JsNameRef> {
|
||||
private final class QualifierGenerator extends Generator<JsExpression> {
|
||||
public QualifierGenerator() {
|
||||
Rule<JsNameRef> standardObjectsHaveKotlinQualifier = new Rule<JsNameRef>() {
|
||||
Rule<JsExpression> standardObjectsHaveKotlinQualifier = new Rule<JsExpression>() {
|
||||
@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<JsNameRef> packageLevelDeclarationsHaveEnclosingPackagesNamesAsQualifier = new Rule<JsNameRef>() {
|
||||
Rule<JsExpression> packageLevelDeclarationsHaveEnclosingPackagesNamesAsQualifier = new Rule<JsExpression>() {
|
||||
@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<JsNameRef> constructorOrClassObjectHasTheSameQualifierAsTheClass = new Rule<JsNameRef>() {
|
||||
Rule<JsExpression> constructorOrClassObjectHasTheSameQualifierAsTheClass = new Rule<JsExpression>() {
|
||||
@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<JsNameRef> libraryObjectsHaveKotlinQualifier = new Rule<JsNameRef>() {
|
||||
Rule<JsExpression> libraryObjectsHaveKotlinQualifier = new Rule<JsExpression>() {
|
||||
@Override
|
||||
public JsNameRef apply(@NotNull DeclarationDescriptor descriptor) {
|
||||
public JsExpression apply(@NotNull DeclarationDescriptor descriptor) {
|
||||
if (isLibraryObject(descriptor)) {
|
||||
return namer.kotlinObject();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
Rule<JsNameRef> nativeObjectsHaveNativePartOfFullQualifier = new Rule<JsNameRef>() {
|
||||
Rule<JsExpression> nativeObjectsHaveNativePartOfFullQualifier = new Rule<JsExpression>() {
|
||||
@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<JsNameRef> staticMembersHaveContainerQualifier = new Rule<JsNameRef>() {
|
||||
Rule<JsExpression> staticMembersHaveContainerQualifier = new Rule<JsExpression>() {
|
||||
@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)) {
|
||||
|
||||
@@ -205,7 +205,7 @@ public class TranslationContext {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public JsNameRef getQualifierForDescriptor(@NotNull DeclarationDescriptor descriptor) {
|
||||
public JsExpression getQualifierForDescriptor(@NotNull DeclarationDescriptor descriptor) {
|
||||
return staticContext.getQualifierForDescriptor(descriptor);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user