Generate accessor for private companion object
This commit is contained in:
+44
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.codegen
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class AccessorForCompanionObjectInstanceFieldDescriptor(
|
||||||
|
val companionObjectDescriptor: ClassDescriptor,
|
||||||
|
name: Name
|
||||||
|
) :
|
||||||
|
SimpleFunctionDescriptorImpl(
|
||||||
|
companionObjectDescriptor.containingDeclaration,
|
||||||
|
null, Annotations.EMPTY,
|
||||||
|
name,
|
||||||
|
CallableMemberDescriptor.Kind.DECLARATION, SourceElement.NO_SOURCE
|
||||||
|
) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
initialize(
|
||||||
|
null, null, emptyList(), emptyList(),
|
||||||
|
companionObjectDescriptor.defaultType,
|
||||||
|
Modality.FINAL,
|
||||||
|
Visibilities.LOCAL
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun createSubstitutedCopy(
|
||||||
|
newOwner: DeclarationDescriptor,
|
||||||
|
original: FunctionDescriptor?,
|
||||||
|
kind: CallableMemberDescriptor.Kind,
|
||||||
|
newName: Name?,
|
||||||
|
annotations: Annotations,
|
||||||
|
source: SourceElement
|
||||||
|
): FunctionDescriptorImpl {
|
||||||
|
throw UnsupportedOperationException("Accessor for companion object $companionObjectDescriptor should not be substituted")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -400,6 +400,10 @@ public class AsmUtil {
|
|||||||
return NO_FLAG_PACKAGE_PRIVATE;
|
return NO_FLAG_PACKAGE_PRIVATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (memberDescriptor instanceof AccessorForCompanionObjectInstanceFieldDescriptor) {
|
||||||
|
return NO_FLAG_PACKAGE_PRIVATE;
|
||||||
|
}
|
||||||
|
|
||||||
// the following code is only for PRIVATE visibility of member
|
// the following code is only for PRIVATE visibility of member
|
||||||
if (memberDescriptor instanceof ConstructorDescriptor) {
|
if (memberDescriptor instanceof ConstructorDescriptor) {
|
||||||
if (isEnumEntry(containingDeclaration)) {
|
if (isEnumEntry(containingDeclaration)) {
|
||||||
|
|||||||
@@ -1756,6 +1756,9 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
if (shouldGenerateSingletonAsThisOrOuterFromContext(classDescriptor)) {
|
if (shouldGenerateSingletonAsThisOrOuterFromContext(classDescriptor)) {
|
||||||
return generateThisOrOuterFromContext(classDescriptor, false, false);
|
return generateThisOrOuterFromContext(classDescriptor, false, false);
|
||||||
}
|
}
|
||||||
|
if (isCompanionObject(classDescriptor) && !couldUseDirectAccessToCompanionObject(classDescriptor, context)) {
|
||||||
|
return generateAccessorCallForCompanionObject(classDescriptor);
|
||||||
|
}
|
||||||
if (isObject(classDescriptor)) {
|
if (isObject(classDescriptor)) {
|
||||||
return StackValue.singleton(classDescriptor, typeMapper);
|
return StackValue.singleton(classDescriptor, typeMapper);
|
||||||
}
|
}
|
||||||
@@ -2612,9 +2615,12 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
else if (isPossiblyUninitializedSingleton(receiverDescriptor) && isInsideSingleton(receiverDescriptor)) {
|
else if (isPossiblyUninitializedSingleton(receiverDescriptor) && isInsideSingleton(receiverDescriptor)) {
|
||||||
return generateThisOrOuterFromContext(receiverDescriptor, false, false);
|
return generateThisOrOuterFromContext(receiverDescriptor, false, false);
|
||||||
}
|
}
|
||||||
else {
|
else if (couldUseDirectAccessToCompanionObject(receiverDescriptor, context)) {
|
||||||
return StackValue.singleton(receiverDescriptor, typeMapper);
|
return StackValue.singleton(receiverDescriptor, typeMapper);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
return generateAccessorCallForCompanionObject(receiverDescriptor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (receiverDescriptor instanceof ScriptDescriptor) {
|
else if (receiverDescriptor instanceof ScriptDescriptor) {
|
||||||
return generateScriptReceiver((ScriptDescriptor) receiverDescriptor);
|
return generateScriptReceiver((ScriptDescriptor) receiverDescriptor);
|
||||||
@@ -2642,6 +2648,41 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private StackValue generateAccessorCallForCompanionObject(@NotNull ClassDescriptor companionObjectDescriptor) {
|
||||||
|
DeclarationDescriptor hostClassDescriptor = companionObjectDescriptor.getContainingDeclaration();
|
||||||
|
assert hostClassDescriptor instanceof ClassDescriptor :
|
||||||
|
"Containing declaration of the companion object " + companionObjectDescriptor +
|
||||||
|
": expected a class, actual: " + hostClassDescriptor;
|
||||||
|
|
||||||
|
CodegenContext hostClassContext = context;
|
||||||
|
while (hostClassContext.getContextDescriptor() != hostClassDescriptor) {
|
||||||
|
hostClassContext = hostClassContext.getParentContext();
|
||||||
|
assert hostClassContext != null :
|
||||||
|
"Host class context for " + hostClassDescriptor + " not found in context hierarchy for " + context;
|
||||||
|
}
|
||||||
|
|
||||||
|
hostClassContext.markCompanionObjectDescriptorWithAccessorRequired(companionObjectDescriptor);
|
||||||
|
|
||||||
|
Type hostClassType = typeMapper.mapClass((ClassifierDescriptor) hostClassDescriptor);
|
||||||
|
Type companionObjectType = typeMapper.mapClass(companionObjectDescriptor);
|
||||||
|
|
||||||
|
// TODO given that we actually have corresponding AccessorForCompanionObjectInstanceFieldDescriptor,
|
||||||
|
// it might be a better idea to use general method call generation
|
||||||
|
return StackValue.operation(
|
||||||
|
companionObjectType,
|
||||||
|
companionObjectDescriptor.getDefaultType(),
|
||||||
|
v -> {
|
||||||
|
v.invokestatic(
|
||||||
|
hostClassType.getInternalName(),
|
||||||
|
getCompanionObjectAccessorName(companionObjectDescriptor),
|
||||||
|
Type.getMethodDescriptor(companionObjectType),
|
||||||
|
/* itf */ false
|
||||||
|
);
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private StackValue generateExtensionReceiver(@NotNull CallableDescriptor descriptor) {
|
private StackValue generateExtensionReceiver(@NotNull CallableDescriptor descriptor) {
|
||||||
ReceiverParameterDescriptor parameter = descriptor.getExtensionReceiverParameter();
|
ReceiverParameterDescriptor parameter = descriptor.getExtensionReceiverParameter();
|
||||||
|
|||||||
@@ -22,9 +22,6 @@ import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor;
|
|||||||
import org.jetbrains.kotlin.load.java.JvmAbi;
|
import org.jetbrains.kotlin.load.java.JvmAbi;
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor;
|
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor;
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor;
|
import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor;
|
||||||
import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass;
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass;
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement;
|
|
||||||
import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityUtilsKt;
|
import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityUtilsKt;
|
||||||
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping;
|
import org.jetbrains.kotlin.metadata.jvm.deserialization.ModuleMapping;
|
||||||
import org.jetbrains.kotlin.psi.Call;
|
import org.jetbrains.kotlin.psi.Call;
|
||||||
@@ -153,6 +150,29 @@ public class JvmCodegenUtil {
|
|||||||
return propertyDescriptor.isConst() || hasJvmFieldAnnotation(propertyDescriptor);
|
return propertyDescriptor.isConst() || hasJvmFieldAnnotation(propertyDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean couldUseDirectAccessToCompanionObject(
|
||||||
|
@NotNull ClassDescriptor companionObjectDescriptor,
|
||||||
|
@NotNull MethodContext contextBeforeInline
|
||||||
|
) {
|
||||||
|
if (!Visibilities.isPrivate(companionObjectDescriptor.getVisibility())) {
|
||||||
|
// Non-private companion object can be directly accessed anywhere it's allowed by the front-end.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
CodegenContext context = contextBeforeInline.getFirstCrossInlineOrNonInlineContext();
|
||||||
|
if (context.isInlineMethodContext()) {
|
||||||
|
// Inline method can be called from a nested class.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Private companion object is directly accessible only from the corresponding class
|
||||||
|
return context.getContextDescriptor().getContainingDeclaration() == companionObjectDescriptor.getContainingDeclaration();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getCompanionObjectAccessorName(@NotNull ClassDescriptor companionObjectDescriptor) {
|
||||||
|
return "access$" + companionObjectDescriptor.getName();
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean couldUseDirectAccessToProperty(
|
public static boolean couldUseDirectAccessToProperty(
|
||||||
@NotNull PropertyDescriptor property,
|
@NotNull PropertyDescriptor property,
|
||||||
boolean forGetter,
|
boolean forGetter,
|
||||||
|
|||||||
@@ -708,6 +708,30 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
|
|||||||
generateSyntheticAccessor(accessor);
|
generateSyntheticAccessor(accessor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AccessorForCompanionObjectInstanceFieldDescriptor accessorForCompanionObjectInstanceFieldDescriptor =
|
||||||
|
context.getAccessorForCompanionObjectDescriptorIfRequired();
|
||||||
|
if (accessorForCompanionObjectInstanceFieldDescriptor != null) {
|
||||||
|
generateSyntheticAccessorForCompanionObject(accessorForCompanionObjectInstanceFieldDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateSyntheticAccessorForCompanionObject(@NotNull AccessorForCompanionObjectInstanceFieldDescriptor accessor) {
|
||||||
|
ClassDescriptor companionObjectDescriptor = accessor.getCompanionObjectDescriptor();
|
||||||
|
DeclarationDescriptor hostClassDescriptor = companionObjectDescriptor.getContainingDeclaration();
|
||||||
|
assert hostClassDescriptor instanceof ClassDescriptor : "Class descriptor expected: " + hostClassDescriptor;
|
||||||
|
functionCodegen.generateMethod(
|
||||||
|
Synthetic(null, companionObjectDescriptor),
|
||||||
|
accessor,
|
||||||
|
new FunctionGenerationStrategy.CodegenBased(state) {
|
||||||
|
@Override
|
||||||
|
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
|
||||||
|
Type companionObjectType = typeMapper.mapClass(companionObjectDescriptor);
|
||||||
|
StackValue.singleton(companionObjectDescriptor, typeMapper).put(companionObjectType, codegen.v);
|
||||||
|
codegen.v.areturn(companionObjectType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateSyntheticAccessor(@NotNull AccessorForCallableDescriptor<?> accessorForCallableDescriptor) {
|
private void generateSyntheticAccessor(@NotNull AccessorForCallableDescriptor<?> accessorForCallableDescriptor) {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
|
|||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.load.java.JavaVisibilities;
|
import org.jetbrains.kotlin.load.java.JavaVisibilities;
|
||||||
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor;
|
import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptor;
|
||||||
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.psi.KtFile;
|
import org.jetbrains.kotlin.psi.KtFile;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager;
|
||||||
@@ -44,12 +45,12 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
|||||||
private Map<DeclarationDescriptor, CodegenContext> childContexts;
|
private Map<DeclarationDescriptor, CodegenContext> childContexts;
|
||||||
private Map<AccessorKey, AccessorForCallableDescriptor<?>> accessors;
|
private Map<AccessorKey, AccessorForCallableDescriptor<?>> accessors;
|
||||||
private Map<AccessorKey, AccessorForPropertyDescriptorFactory> propertyAccessorFactories;
|
private Map<AccessorKey, AccessorForPropertyDescriptorFactory> propertyAccessorFactories;
|
||||||
|
private AccessorForCompanionObjectInstanceFieldDescriptor accessorForCompanionObjectInstanceFieldDescriptor = null;
|
||||||
|
|
||||||
private static class AccessorKey {
|
private static class AccessorKey {
|
||||||
public final DeclarationDescriptor descriptor;
|
public final DeclarationDescriptor descriptor;
|
||||||
public final ClassDescriptor superCallLabelTarget;
|
public final ClassDescriptor superCallLabelTarget;
|
||||||
public final AccessorKind accessorKind;
|
public final AccessorKind accessorKind;
|
||||||
|
|
||||||
public AccessorKey(
|
public AccessorKey(
|
||||||
@NotNull DeclarationDescriptor descriptor,
|
@NotNull DeclarationDescriptor descriptor,
|
||||||
@Nullable ClassDescriptor superCallLabelTarget,
|
@Nullable ClassDescriptor superCallLabelTarget,
|
||||||
@@ -742,4 +743,30 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
|||||||
public LocalLookup getEnclosingLocalLookup() {
|
public LocalLookup getEnclosingLocalLookup() {
|
||||||
return enclosingLocalLookup;
|
return enclosingLocalLookup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public AccessorForCompanionObjectInstanceFieldDescriptor markCompanionObjectDescriptorWithAccessorRequired(@NotNull ClassDescriptor companionObjectDescriptor) {
|
||||||
|
assert DescriptorUtils.isCompanionObject(companionObjectDescriptor) : "Companion object expected: " + companionObjectDescriptor;
|
||||||
|
|
||||||
|
assert accessorForCompanionObjectInstanceFieldDescriptor == null
|
||||||
|
|| accessorForCompanionObjectInstanceFieldDescriptor.getCompanionObjectDescriptor() == companionObjectDescriptor
|
||||||
|
: "Unexpected companion object descriptor with accessor required: " + companionObjectDescriptor +
|
||||||
|
"; should be " + accessorForCompanionObjectInstanceFieldDescriptor.getCompanionObjectDescriptor();
|
||||||
|
|
||||||
|
if (accessorForCompanionObjectInstanceFieldDescriptor == null) {
|
||||||
|
accessorForCompanionObjectInstanceFieldDescriptor =
|
||||||
|
new AccessorForCompanionObjectInstanceFieldDescriptor(
|
||||||
|
companionObjectDescriptor,
|
||||||
|
Name.identifier(JvmCodegenUtil.getCompanionObjectAccessorName(companionObjectDescriptor))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return accessorForCompanionObjectInstanceFieldDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public AccessorForCompanionObjectInstanceFieldDescriptor getAccessorForCompanionObjectDescriptorIfRequired() {
|
||||||
|
return accessorForCompanionObjectInstanceFieldDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -948,7 +948,8 @@ public class KotlinTypeMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isAccessor(@Nullable CallableMemberDescriptor descriptor) {
|
public static boolean isAccessor(@Nullable CallableMemberDescriptor descriptor) {
|
||||||
return descriptor instanceof AccessorForCallableDescriptor<?>;
|
return descriptor instanceof AccessorForCallableDescriptor<?> ||
|
||||||
|
descriptor instanceof AccessorForCompanionObjectInstanceFieldDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isStaticAccessor(@Nullable CallableMemberDescriptor descriptor) {
|
public static boolean isStaticAccessor(@Nullable CallableMemberDescriptor descriptor) {
|
||||||
|
|||||||
+1
-1
@@ -84,7 +84,7 @@ fun Delegation(element: PsiElement?, descriptor: FunctionDescriptor): JvmDeclara
|
|||||||
|
|
||||||
fun SamDelegation(descriptor: FunctionDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(SAM_DELEGATION, null, descriptor)
|
fun SamDelegation(descriptor: FunctionDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(SAM_DELEGATION, null, descriptor)
|
||||||
|
|
||||||
fun Synthetic(element: PsiElement?, descriptor: CallableMemberDescriptor): JvmDeclarationOrigin =
|
fun Synthetic(element: PsiElement?, descriptor: DeclarationDescriptor): JvmDeclarationOrigin =
|
||||||
JvmDeclarationOrigin(SYNTHETIC, element, descriptor)
|
JvmDeclarationOrigin(SYNTHETIC, element, descriptor)
|
||||||
|
|
||||||
val CollectionStub = JvmDeclarationOrigin(COLLECTION_STUB, null, null)
|
val CollectionStub = JvmDeclarationOrigin(COLLECTION_STUB, null, null)
|
||||||
|
|||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
private companion object {
|
||||||
|
val result = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Nested {
|
||||||
|
fun foo() = object {
|
||||||
|
override fun toString(): String = result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = Nested().foo().toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Outer().test()
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
|
|
||||||
|
inline fun <T> run(fn: () -> T) = fn()
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
private companion object {
|
||||||
|
val result = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Nested {
|
||||||
|
fun foo() = run { result }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = Nested().foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Outer().test()
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
private companion object {
|
||||||
|
val result = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Nested {
|
||||||
|
fun foo() = { result }()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = Nested().foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Outer().test()
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
private companion object {
|
||||||
|
val result = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline fun bar() = result
|
||||||
|
|
||||||
|
class Nested {
|
||||||
|
fun foo(x: Outer) = x.bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = Nested().foo(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Outer().test()
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
private companion object {
|
||||||
|
val result = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Nested {
|
||||||
|
fun foo() = result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = Nested().foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Outer().test()
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
private companion object {
|
||||||
|
fun xo() = "O"
|
||||||
|
fun xk() = "K"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Nested1 {
|
||||||
|
fun foo() = xo()
|
||||||
|
}
|
||||||
|
|
||||||
|
class Nested2 {
|
||||||
|
fun bar() = xk()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = Nested1().foo() + Nested2().bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Outer().test()
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
private companion object {
|
||||||
|
override fun toString(): String = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Nested {
|
||||||
|
fun foo(): Any = Outer.Companion
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = Nested().foo().toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Outer().test()
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// !LANGUAGE: +ProperVisibilityForCompanionObjectInstanceField
|
||||||
|
|
||||||
|
class Outer {
|
||||||
|
protected companion object {
|
||||||
|
val result = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
class Nested {
|
||||||
|
fun foo() = result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = Nested().foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = Outer().test()
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
class Outer {
|
||||||
|
private companion object {
|
||||||
|
val result = "OK"
|
||||||
|
|
||||||
|
fun bar() = result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun test() = bar()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 access\$Companion
|
||||||
|
// 1 INVOKEVIRTUAL Outer\$Companion\.bar
|
||||||
|
// 1 INVOKEVIRTUAL Outer\$Companion\.getResult
|
||||||
Generated
+53
@@ -14016,6 +14016,59 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
public void testUseImportedMemberFromCompanion() throws Exception {
|
public void testUseImportedMemberFromCompanion() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/codegen/box/objects/companionObjectAccess")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class CompanionObjectAccess extends AbstractIrBlackBoxCodegenTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInCompanionObjectAccess() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/objects/companionObjectAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromAnonymousObjectInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromInlineLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromMethodInlinedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClassSeveralTimes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectUsedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectUsedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectUsedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("protectedCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testProtectedCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/protectedCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
||||||
|
|||||||
+53
@@ -14016,6 +14016,59 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
public void testUseImportedMemberFromCompanion() throws Exception {
|
public void testUseImportedMemberFromCompanion() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/codegen/box/objects/companionObjectAccess")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class CompanionObjectAccess extends AbstractBlackBoxCodegenTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInCompanionObjectAccess() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/objects/companionObjectAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromAnonymousObjectInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromInlineLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromMethodInlinedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClassSeveralTimes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectUsedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectUsedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectUsedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("protectedCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testProtectedCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/protectedCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
||||||
|
|||||||
@@ -274,6 +274,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
|||||||
runTest("compiler/testData/codegen/bytecodeText/noSuperCheckInDefaultConstuctor.kt");
|
runTest("compiler/testData/codegen/bytecodeText/noSuperCheckInDefaultConstuctor.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("noSyntheticAccessorForPrivateCompanionObjectWhenNotRequired.kt")
|
||||||
|
public void testNoSyntheticAccessorForPrivateCompanionObjectWhenNotRequired() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/bytecodeText/noSyntheticAccessorForPrivateCompanionObjectWhenNotRequired.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noWrapperForMethodReturningPrimitive.kt")
|
@TestMetadata("noWrapperForMethodReturningPrimitive.kt")
|
||||||
public void testNoWrapperForMethodReturningPrimitive() throws Exception {
|
public void testNoWrapperForMethodReturningPrimitive() throws Exception {
|
||||||
runTest("compiler/testData/codegen/bytecodeText/noWrapperForMethodReturningPrimitive.kt");
|
runTest("compiler/testData/codegen/bytecodeText/noWrapperForMethodReturningPrimitive.kt");
|
||||||
|
|||||||
+53
@@ -14016,6 +14016,59 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
public void testUseImportedMemberFromCompanion() throws Exception {
|
public void testUseImportedMemberFromCompanion() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/codegen/box/objects/companionObjectAccess")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class CompanionObjectAccess extends AbstractLightAnalysisModeTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest(this::doTest, TargetBackend.JVM, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInCompanionObjectAccess() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/objects/companionObjectAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromAnonymousObjectInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromInlineLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromMethodInlinedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClassSeveralTimes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectUsedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectUsedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectUsedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("protectedCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testProtectedCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/protectedCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
||||||
|
|||||||
+53
@@ -13346,6 +13346,59 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
public void testUseImportedMemberFromCompanion() throws Exception {
|
public void testUseImportedMemberFromCompanion() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/codegen/box/objects/companionObjectAccess")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class CompanionObjectAccess extends AbstractIrJsCodegenBoxTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS_IR, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInCompanionObjectAccess() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/objects/companionObjectAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromAnonymousObjectInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromInlineLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromMethodInlinedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClassSeveralTimes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectUsedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectUsedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectUsedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("protectedCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testProtectedCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/protectedCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
||||||
|
|||||||
+53
@@ -12218,6 +12218,59 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
public void testUseImportedMemberFromCompanion() throws Exception {
|
public void testUseImportedMemberFromCompanion() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
runTest("compiler/testData/codegen/box/objects/useImportedMemberFromCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("compiler/testData/codegen/box/objects/companionObjectAccess")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class CompanionObjectAccess extends AbstractJsCodegenBoxTest {
|
||||||
|
private void runTest(String testDataFilePath) throws Exception {
|
||||||
|
KotlinTestUtils.runTest0(this::doTest, TargetBackend.JS, testDataFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testAllFilesPresentInCompanionObjectAccess() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/objects/companionObjectAccess"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromAnonymousObjectInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromAnonymousObjectInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromInlineLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromInlineLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromLambdaInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromLambdaInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromLambdaInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromMethodInlinedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromMethodInlinedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt")
|
||||||
|
public void testPrivateCompanionObjectAccessedFromNestedClassSeveralTimes() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectAccessedFromNestedClassSeveralTimes.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("privateCompanionObjectUsedInNestedClass.kt")
|
||||||
|
public void testPrivateCompanionObjectUsedInNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/privateCompanionObjectUsedInNestedClass.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("protectedCompanionObjectAccessedFromNestedClass.kt")
|
||||||
|
public void testProtectedCompanionObjectAccessedFromNestedClass() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/objects/companionObjectAccess/protectedCompanionObjectAccessedFromNestedClass.kt");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
@TestMetadata("compiler/testData/codegen/box/operatorConventions")
|
||||||
|
|||||||
Reference in New Issue
Block a user