Refactor: process mentions of class object
Rename usages that refer to "default object" concept now Test data file names are left as is
This commit is contained in:
@@ -78,8 +78,8 @@ public final class Namer {
|
||||
private static final String RECEIVER_PARAMETER_NAME = "$receiver";
|
||||
|
||||
private static final String THROW_NPE_FUN_NAME = "throwNPE";
|
||||
private static final String CLASS_OBJECT_GETTER = "object";
|
||||
private static final String CLASS_OBJECT_INITIALIZER = "object_initializer$";
|
||||
private static final String DEFAULT_OBJECT_GETTER = "object";
|
||||
private static final String DEFAULT_OBJECT_INITIALIZER = "object_initializer$";
|
||||
private static final String PROTOTYPE_NAME = "prototype";
|
||||
public static final String CAPTURED_VAR_FIELD = "v";
|
||||
|
||||
@@ -141,13 +141,13 @@ public final class Namer {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static JsExpression getClassObjectAccessor(@NotNull JsExpression referenceToClass) {
|
||||
return new JsNameRef(CLASS_OBJECT_GETTER, referenceToClass);
|
||||
public static JsExpression getDefaultObjectAccessor(@NotNull JsExpression referenceToClass) {
|
||||
return new JsNameRef(DEFAULT_OBJECT_GETTER, referenceToClass);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static String getNameForClassObjectInitializer() {
|
||||
return CLASS_OBJECT_INITIALIZER;
|
||||
public static String getNameForDefaultObjectInitializer() {
|
||||
return DEFAULT_OBJECT_INITIALIZER;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -267,10 +267,10 @@ public final class StaticContext {
|
||||
return scope.declareFreshName(getSuggestedName(descriptor));
|
||||
}
|
||||
};
|
||||
Rule<JsName> constructorOrClassObjectHasTheSameNameAsTheClass = new Rule<JsName>() {
|
||||
Rule<JsName> constructorOrDefaultObjectHasTheSameNameAsTheClass = new Rule<JsName>() {
|
||||
@Override
|
||||
public JsName apply(@NotNull DeclarationDescriptor descriptor) {
|
||||
if (descriptor instanceof ConstructorDescriptor || (DescriptorUtils.isClassObject(descriptor))) {
|
||||
if (descriptor instanceof ConstructorDescriptor || (DescriptorUtils.isDefaultObject(descriptor))) {
|
||||
//noinspection ConstantConditions
|
||||
return getNameForDescriptor(descriptor.getContainingDeclaration());
|
||||
}
|
||||
@@ -355,7 +355,7 @@ public final class StaticContext {
|
||||
|
||||
addRule(namesForDynamic);
|
||||
addRule(namesForStandardClasses);
|
||||
addRule(constructorOrClassObjectHasTheSameNameAsTheClass);
|
||||
addRule(constructorOrDefaultObjectHasTheSameNameAsTheClass);
|
||||
addRule(propertyOrPropertyAccessor);
|
||||
addRule(predefinedObjectsHasUnobfuscatableNames);
|
||||
addRule(overridingDescriptorsReferToOriginalName);
|
||||
@@ -501,10 +501,10 @@ public final class StaticContext {
|
||||
return element.getContainingFile().getUserData(LibrarySourcesConfig.EXTERNAL_MODULE_NAME);
|
||||
}
|
||||
};
|
||||
Rule<JsExpression> constructorOrClassObjectHasTheSameQualifierAsTheClass = new Rule<JsExpression>() {
|
||||
Rule<JsExpression> constructorOrDefaultObjectHasTheSameQualifierAsTheClass = new Rule<JsExpression>() {
|
||||
@Override
|
||||
public JsExpression apply(@NotNull DeclarationDescriptor descriptor) {
|
||||
if (descriptor instanceof ConstructorDescriptor || DescriptorUtils.isClassObject(descriptor)) {
|
||||
if (descriptor instanceof ConstructorDescriptor || DescriptorUtils.isDefaultObject(descriptor)) {
|
||||
//noinspection ConstantConditions
|
||||
return getQualifierForDescriptor(descriptor.getContainingDeclaration());
|
||||
}
|
||||
@@ -548,7 +548,7 @@ public final class StaticContext {
|
||||
};
|
||||
|
||||
addRule(libraryObjectsHaveKotlinQualifier);
|
||||
addRule(constructorOrClassObjectHasTheSameQualifierAsTheClass);
|
||||
addRule(constructorOrDefaultObjectHasTheSameQualifierAsTheClass);
|
||||
addRule(standardObjectsHaveKotlinQualifier);
|
||||
addRule(packageLevelDeclarationsHaveEnclosingPackagesNamesAsQualifier);
|
||||
addRule(nativeObjectsHaveNativePartOfFullQualifier);
|
||||
|
||||
+10
-10
@@ -124,7 +124,7 @@ public final class ClassTranslator extends AbstractTranslator {
|
||||
declarationContext = declarationContext.newDeclaration(descriptor, definitionPlace);
|
||||
}
|
||||
|
||||
declarationContext = fixContextForClassObjectAccessing(declarationContext);
|
||||
declarationContext = fixContextForDefaultObjectAccessing(declarationContext);
|
||||
|
||||
invocationArguments.add(getSuperclassReferences(declarationContext));
|
||||
DelegationTranslator delegationTranslator = new DelegationTranslator(classDeclaration, context());
|
||||
@@ -171,15 +171,15 @@ public final class ClassTranslator extends AbstractTranslator {
|
||||
return invocationArguments;
|
||||
}
|
||||
|
||||
private TranslationContext fixContextForClassObjectAccessing(TranslationContext declarationContext) {
|
||||
// In Kotlin we can access to class object members without qualifier just by name, but we should translate it to access with FQ name.
|
||||
// So create alias for class object receiver parameter.
|
||||
ClassDescriptor classObjectDescriptor = descriptor.getDefaultObjectDescriptor();
|
||||
if (classObjectDescriptor != null) {
|
||||
JsExpression referenceToClass = translateAsFQReference(classObjectDescriptor.getContainingDeclaration(), declarationContext);
|
||||
JsExpression classObjectAccessor = Namer.getClassObjectAccessor(referenceToClass);
|
||||
ReceiverParameterDescriptor classObjectReceiver = getReceiverParameterForDeclaration(classObjectDescriptor);
|
||||
declarationContext.aliasingContext().registerAlias(classObjectReceiver, classObjectAccessor);
|
||||
private TranslationContext fixContextForDefaultObjectAccessing(TranslationContext declarationContext) {
|
||||
// In Kotlin we can access to default object members without qualifier just by name, but we should translate it to access with FQ name.
|
||||
// So create alias for default object receiver parameter.
|
||||
ClassDescriptor defaultObjectDescriptor = descriptor.getDefaultObjectDescriptor();
|
||||
if (defaultObjectDescriptor != null) {
|
||||
JsExpression referenceToClass = translateAsFQReference(defaultObjectDescriptor.getContainingDeclaration(), declarationContext);
|
||||
JsExpression defaultObjectAccessor = Namer.getDefaultObjectAccessor(referenceToClass);
|
||||
ReceiverParameterDescriptor defaultObjectReceiver = getReceiverParameterForDeclaration(defaultObjectDescriptor);
|
||||
declarationContext.aliasingContext().registerAlias(defaultObjectReceiver, defaultObjectAccessor);
|
||||
}
|
||||
|
||||
// Overlap alias of class object receiver for accessing from containing class(see previous if block),
|
||||
|
||||
+3
-3
@@ -38,7 +38,7 @@ import org.jetbrains.kotlin.types.JetType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.jetbrains.kotlin.js.translate.initializer.InitializerUtils.createClassObjectInitializer;
|
||||
import static org.jetbrains.kotlin.js.translate.initializer.InitializerUtils.createDefaultObjectInitializer;
|
||||
import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getClassDescriptor;
|
||||
import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getFunctionDescriptor;
|
||||
import static org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils.getSupertypesWithoutFakes;
|
||||
@@ -85,7 +85,7 @@ public class DeclarationBodyVisitor extends TranslatorVisitor<Void> {
|
||||
|
||||
@Override
|
||||
public Void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration, TranslationContext context) {
|
||||
if (!declaration.isClassObject()) {
|
||||
if (!declaration.isDefault()) {
|
||||
// parsed it in initializer visitor => no additional actions are needed
|
||||
return null;
|
||||
}
|
||||
@@ -93,7 +93,7 @@ public class DeclarationBodyVisitor extends TranslatorVisitor<Void> {
|
||||
|
||||
ClassDescriptor descriptor = getClassDescriptor(context.bindingContext(), declaration);
|
||||
JsFunction fun = TranslationUtils.simpleReturnFunction(context.getScopeForDescriptor(descriptor), value);
|
||||
staticResult.add(createClassObjectInitializer(fun, context));
|
||||
staticResult.add(createDefaultObjectInitializer(fun, context));
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -70,8 +70,8 @@ public final class InitializerUtils {
|
||||
initializers.add(expression.makeStmt());
|
||||
}
|
||||
|
||||
public static JsPropertyInitializer createClassObjectInitializer(JsExpression value, TranslationContext context) {
|
||||
JsStringLiteral classObjectInitStr = context.program().getStringLiteral(Namer.getNameForClassObjectInitializer());
|
||||
return new JsPropertyInitializer(classObjectInitStr, value);
|
||||
public static JsPropertyInitializer createDefaultObjectInitializer(JsExpression value, TranslationContext context) {
|
||||
JsStringLiteral defaultObjectInitStr = context.program().getStringLiteral(Namer.getNameForDefaultObjectInitializer());
|
||||
return new JsPropertyInitializer(defaultObjectInitStr, value);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -65,7 +65,7 @@ public final class InitializerVisitor extends TranslatorVisitor<Void> {
|
||||
|
||||
@Override
|
||||
public Void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration, @NotNull TranslationContext context) {
|
||||
if (!declaration.isClassObject()) {
|
||||
if (!declaration.isDefault()) {
|
||||
InitializerUtils.generateObjectInitializer(declaration, result, context);
|
||||
}
|
||||
return null;
|
||||
|
||||
+16
-12
@@ -36,45 +36,49 @@ import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getDescriptor
|
||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry;
|
||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isObject;
|
||||
|
||||
public class ClassObjectAccessTranslator extends AbstractTranslator implements CachedAccessTranslator {
|
||||
public class DefaultObjectAccessTranslator extends AbstractTranslator implements CachedAccessTranslator {
|
||||
@NotNull
|
||||
/*package*/ static ClassObjectAccessTranslator newInstance(@NotNull JetSimpleNameExpression expression,
|
||||
@NotNull TranslationContext context) {
|
||||
/*package*/ static DefaultObjectAccessTranslator newInstance(
|
||||
@NotNull JetSimpleNameExpression expression,
|
||||
@NotNull TranslationContext context
|
||||
) {
|
||||
DeclarationDescriptor referenceDescriptor = getDescriptorForReferenceExpression(context.bindingContext(), expression);
|
||||
assert referenceDescriptor != null : "JetSimpleName expression must reference a descriptor " + expression.getText();
|
||||
return new ClassObjectAccessTranslator(referenceDescriptor, context);
|
||||
return new DefaultObjectAccessTranslator(referenceDescriptor, context);
|
||||
}
|
||||
|
||||
/*package*/ static boolean isClassObjectReference(@NotNull JetReferenceExpression expression,
|
||||
@NotNull TranslationContext context) {
|
||||
/*package*/ static boolean isDefaultObjectReference(
|
||||
@NotNull JetReferenceExpression expression,
|
||||
@NotNull TranslationContext context
|
||||
) {
|
||||
DeclarationDescriptor descriptor = getDescriptorForReferenceExpression(context.bindingContext(), expression);
|
||||
return descriptor instanceof ClassDescriptor && !AnnotationsUtils.isNativeObject(descriptor);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private final JsExpression referenceToClassObject;
|
||||
private final JsExpression referenceToDefaultObject;
|
||||
|
||||
private ClassObjectAccessTranslator(@NotNull DeclarationDescriptor descriptor, @NotNull TranslationContext context) {
|
||||
private DefaultObjectAccessTranslator(@NotNull DeclarationDescriptor descriptor, @NotNull TranslationContext context) {
|
||||
super(context);
|
||||
JsExpression fqReference = translateAsFQReference(descriptor, context());
|
||||
if (isObject(descriptor) || isEnumEntry(descriptor)) {
|
||||
this.referenceToClassObject = fqReference;
|
||||
this.referenceToDefaultObject = fqReference;
|
||||
}
|
||||
else {
|
||||
this.referenceToClassObject = Namer.getClassObjectAccessor(fqReference);
|
||||
this.referenceToDefaultObject = Namer.getDefaultObjectAccessor(fqReference);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public JsExpression translateAsGet() {
|
||||
return referenceToClassObject;
|
||||
return referenceToDefaultObject;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public JsExpression translateAsSet(@NotNull JsExpression toSetTo) {
|
||||
throw new IllegalStateException("Class object can't set");
|
||||
throw new IllegalStateException("default object can't be set");
|
||||
}
|
||||
|
||||
@NotNull
|
||||
+4
-4
@@ -56,14 +56,14 @@ public final class ReferenceTranslator {
|
||||
// Ignore qualifier if expression is EnumEntry or default object reference and use always use FQ name.
|
||||
DeclarationDescriptor descriptor = BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), expression);
|
||||
//TODO: should go away when objects inside classes are supported
|
||||
if (DescriptorUtils.isClassObject(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) {
|
||||
if (DescriptorUtils.isDefaultObject(descriptor) && !AnnotationsUtils.isNativeObject(descriptor)) {
|
||||
return simpleName;
|
||||
}
|
||||
if (descriptor instanceof ClassDescriptor) {
|
||||
ClassDescriptor entryClass = (ClassDescriptor) descriptor;
|
||||
if (entryClass.getKind() == ClassKind.ENUM_ENTRY) {
|
||||
DeclarationDescriptor enumClass = entryClass.getContainingDeclaration();
|
||||
qualifier = Namer.getClassObjectAccessor(translateAsFQReference(enumClass, context));
|
||||
qualifier = Namer.getDefaultObjectAccessor(translateAsFQReference(enumClass, context));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,8 +109,8 @@ public final class ReferenceTranslator {
|
||||
if (canBePropertyAccess(referenceExpression, context)) {
|
||||
return VariableAccessTranslator.newInstance(context, referenceExpression, receiver);
|
||||
}
|
||||
if (ClassObjectAccessTranslator.isClassObjectReference(referenceExpression, context)) {
|
||||
return ClassObjectAccessTranslator.newInstance(referenceExpression, context);
|
||||
if (DefaultObjectAccessTranslator.isDefaultObjectReference(referenceExpression, context)) {
|
||||
return DefaultObjectAccessTranslator.newInstance(referenceExpression, context);
|
||||
}
|
||||
return ReferenceAccessTranslator.newInstance(referenceExpression, context);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user