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:
Pavel V. Talanov
2015-03-03 17:28:24 +03:00
parent 27f5d71e4f
commit 48fbce9582
137 changed files with 471 additions and 479 deletions
@@ -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);
@@ -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),
@@ -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;
}
@@ -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);
}
}
@@ -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;
@@ -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
@@ -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);
}