KT-11769 case with companion function call: error is now detected if companion receiver is stated explicitly

This commit is contained in:
Mikhail Glukhikh
2016-08-09 13:11:04 +03:00
parent 3c002625c6
commit 04f71bccf2
19 changed files with 361 additions and 142 deletions

View File

@@ -48,7 +48,7 @@ interface ControlFlowBuilder {
fun declareVariable(property: KtVariableDeclaration)
fun declareFunction(subroutine: KtElement, pseudocode: Pseudocode)
fun declareEnumEntry(enumEntry: KtEnumEntry)
fun declareEntryOrObject(entryOrObject: KtClassOrObject)
// Labels
fun createUnboundLabel(): Label

View File

@@ -200,8 +200,8 @@ abstract class ControlFlowBuilderAdapter : ControlFlowBuilder {
delegateBuilder.declareFunction(subroutine, pseudocode)
}
override fun declareEnumEntry(enumEntry: KtEnumEntry) {
delegateBuilder.declareEnumEntry(enumEntry)
override fun declareEntryOrObject(entryOrObject: KtClassOrObject) {
delegateBuilder.declareEntryOrObject(entryOrObject)
}
override fun repeatPseudocode(startLabel: Label, finishLabel: Label) {

View File

@@ -328,8 +328,20 @@ class ControlFlowInformationProvider private constructor(
when (variableDescriptor) {
is ValueParameterDescriptor ->
report(Errors.UNINITIALIZED_PARAMETER.on(element, variableDescriptor), ctxt)
is FakeCallableDescriptorForObject ->
report(Errors.UNINITIALIZED_ENUM_ENTRY.on(element, variableDescriptor.classDescriptor), ctxt)
is FakeCallableDescriptorForObject -> {
val classDescriptor = variableDescriptor.classDescriptor
when (classDescriptor.kind) {
ClassKind.ENUM_ENTRY ->
report(Errors.UNINITIALIZED_ENUM_ENTRY.on(element, classDescriptor), ctxt)
ClassKind.OBJECT -> if (classDescriptor.isCompanionObject) {
val container = classDescriptor.containingDeclaration
if (container is ClassDescriptor && container.kind == ClassKind.ENUM_CLASS) {
report(Errors.UNINITIALIZED_ENUM_COMPANION.on(element, container), ctxt)
}
}
else -> {}
}
}
is VariableDescriptor ->
report(Errors.UNINITIALIZED_VARIABLE.on(element, variableDescriptor), ctxt)
}

View File

@@ -1266,6 +1266,16 @@ class ControlFlowProcessor(private val trace: BindingTrace) {
}
}
private fun processEntryOrObject(entryOrObject: KtClassOrObject) {
val classDescriptor = trace[BindingContext.DECLARATION_TO_DESCRIPTOR, entryOrObject]
if (classDescriptor is ClassDescriptor) {
builder.declareEntryOrObject(entryOrObject)
builder.write(entryOrObject, entryOrObject, createSyntheticValue(entryOrObject, MagicKind.FAKE_INITIALIZER),
AccessTarget.Declaration(FakeCallableDescriptorForObject(classDescriptor)), emptyMap())
generateInstructions(entryOrObject)
}
}
override fun visitClass(klass: KtClass) {
if (klass.hasPrimaryConstructor()) {
processParameters(klass.getPrimaryConstructorParameters())
@@ -1281,16 +1291,10 @@ class ControlFlowProcessor(private val trace: BindingTrace) {
klass.declarations.forEach {
when (it) {
is KtEnumEntry -> {
val classDescriptor = trace[BindingContext.DECLARATION_TO_DESCRIPTOR, it]
if (classDescriptor is ClassDescriptor) {
builder.declareEnumEntry(it)
builder.write(it, it, createSyntheticValue(it, MagicKind.FAKE_INITIALIZER),
AccessTarget.Declaration(FakeCallableDescriptorForObject(classDescriptor)), emptyMap())
generateInstructions(it)
}
processEntryOrObject(it)
}
is KtObjectDeclaration -> if (it.isCompanion()) {
generateInstructions(it)
processEntryOrObject(it)
}
}
}

View File

@@ -274,8 +274,8 @@ class ControlFlowInstructionsGenerator : ControlFlowBuilderAdapter() {
add(LocalFunctionDeclarationInstruction(subroutine, pseudocode, currentScope))
}
override fun declareEnumEntry(enumEntry: KtEnumEntry) {
add(VariableDeclarationInstruction(enumEntry, currentScope))
override fun declareEntryOrObject(entryOrObject: KtClassOrObject) {
add(VariableDeclarationInstruction(entryOrObject, currentScope))
}
override fun loadUnit(expression: KtExpression) {

View File

@@ -16,22 +16,19 @@
package org.jetbrains.kotlin.cfg.pseudocode.instructions.special
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtVariableDeclaration
import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.cfg.pseudocode.instructions.InstructionWithNext
import org.jetbrains.kotlin.cfg.pseudocode.instructions.BlockScope
import org.jetbrains.kotlin.cfg.pseudocode.instructions.InstructionVisitor
import org.jetbrains.kotlin.cfg.pseudocode.instructions.InstructionVisitorWithResult
import org.jetbrains.kotlin.cfg.pseudocode.instructions.InstructionImpl
import org.jetbrains.kotlin.psi.KtEnumEntry
import org.jetbrains.kotlin.psi.*
class VariableDeclarationInstruction(
element: KtDeclaration,
blockScope: BlockScope
) : InstructionWithNext(element, blockScope) {
init {
assert(element is KtVariableDeclaration || element is KtParameter || element is KtEnumEntry) {
assert(element is KtVariableDeclaration || element is KtParameter || element is KtEnumEntry || element is KtObjectDeclaration) {
"Invalid element: ${render(element)}}"
}
}

View File

@@ -645,6 +645,7 @@ public interface Errors {
DiagnosticFactory1<KtSimpleNameExpression, VariableDescriptor> UNINITIALIZED_VARIABLE = DiagnosticFactory1.create(ERROR);
DiagnosticFactory1<KtSimpleNameExpression, ValueParameterDescriptor> UNINITIALIZED_PARAMETER = DiagnosticFactory1.create(ERROR);
DiagnosticFactory1<KtSimpleNameExpression, ClassDescriptor> UNINITIALIZED_ENUM_ENTRY = DiagnosticFactory1.create(ERROR);
DiagnosticFactory1<KtSimpleNameExpression, ClassDescriptor> UNINITIALIZED_ENUM_COMPANION = DiagnosticFactory1.create(ERROR);
DiagnosticFactory1<KtNamedDeclaration, VariableDescriptor> UNUSED_VARIABLE = DiagnosticFactory1.create(WARNING, DECLARATION_NAME);
DiagnosticFactory1<KtParameter, VariableDescriptor> UNUSED_PARAMETER = DiagnosticFactory1.create(WARNING, DECLARATION_NAME);

View File

@@ -265,6 +265,7 @@ public class DefaultErrorMessages {
MAP.put(UNINITIALIZED_VARIABLE, "Variable ''{0}'' must be initialized", NAME);
MAP.put(UNINITIALIZED_PARAMETER, "Parameter ''{0}'' is uninitialized here", NAME);
MAP.put(UNINITIALIZED_ENUM_ENTRY, "Enum entry ''{0}'' is uninitialized here", NAME);
MAP.put(UNINITIALIZED_ENUM_COMPANION, "Companion object of enum class ''{0}'' is uninitialized here", NAME);
MAP.put(UNUSED_VARIABLE, "Variable ''{0}'' is never used", NAME);
MAP.put(UNUSED_PARAMETER, "Parameter ''{0}'' is never used", NAME);
MAP.put(ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE, "Variable ''{0}'' is assigned but never accessed", NAME);

View File

@@ -71,7 +71,8 @@ public class BindingContextUtils {
public static VariableDescriptor extractVariableDescriptorIfAny(@NotNull BindingContext bindingContext, @Nullable KtElement element, boolean onlyReference) {
DeclarationDescriptor descriptor = null;
if (!onlyReference &&
(element instanceof KtVariableDeclaration || element instanceof KtParameter || element instanceof KtEnumEntry)) {
(element instanceof KtVariableDeclaration || element instanceof KtParameter ||
element instanceof KtEnumEntry || element instanceof KtObjectDeclaration)) {
descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, element);
}
else if (element instanceof KtSimpleNameExpression) {

View File

@@ -0,0 +1,43 @@
== EE ==
enum class EE(val x: Int) {
INSTANCE(Companion.foo()),
ANOTHER(foo());
companion object {
fun foo() = 42
}
}
---------------------
L0:
1 <START>
v(val x: Int)
magic[FAKE_INITIALIZER](val x: Int) -> <v0>
w(x|<v0>)
v(INSTANCE(Companion.foo()),)
magic[FAKE_INITIALIZER](INSTANCE(Companion.foo()),) -> <v1>
w(INSTANCE|<v1>)
mark(Companion.foo())
mark(Companion)
r(Companion) -> <v2>
mark(foo())
call(foo(), foo|<v2>) -> <v3>
mark((Companion.foo()))
call((Companion.foo()), <init>|<v3>) -> <v4>
v(ANOTHER(foo());)
magic[FAKE_INITIALIZER](ANOTHER(foo());) -> <v5>
w(ANOTHER|<v5>)
magic[IMPLICIT_RECEIVER](foo()) -> <v6>
mark(foo())
call(foo(), foo|<v6>) -> <v7>
mark((foo()))
call((foo()), <init>|<v7>) -> <v8>
v(companion object { fun foo() = 42 })
magic[FAKE_INITIALIZER](companion object { fun foo() = 42 }) -> <v9>
w(Companion|<v9>)
L1:
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================

View File

@@ -0,0 +1,8 @@
enum class EE(val x: Int) {
INSTANCE(Companion.foo()),
ANOTHER(foo());
companion object {
fun foo() = 42
}
}

View File

@@ -0,0 +1,22 @@
== EE ==
enum class EE(val x: Int) {
INSTANCE(Companion.foo()),
ANOTHER(foo());
companion object {
fun foo() = 42
}
}
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](val x: Int) -> <v0>
<v1>: EE NEW: magic[FAKE_INITIALIZER](INSTANCE(Companion.foo()),) -> <v1>
<v5>: EE NEW: magic[FAKE_INITIALIZER](ANOTHER(foo());) -> <v5>
<v6>: EE.Companion NEW: magic[IMPLICIT_RECEIVER](foo()) -> <v6>
<v9>: EE.Companion NEW: magic[FAKE_INITIALIZER](companion object { fun foo() = 42 }) -> <v9>
Companion <v2>: EE.Companion NEW: r(Companion) -> <v2>
foo() <v3>: Int NEW: call(foo(), foo|<v2>) -> <v3>
Companion.foo() <v3>: Int COPY
(Companion.foo()) <v4>: * NEW: call((Companion.foo()), <init>|<v3>) -> <v4>
foo() <v7>: Int NEW: call(foo(), foo|<v6>) -> <v7>
(foo()) <v8>: * NEW: call((foo()), <init>|<v7>) -> <v8>
=====================

View File

@@ -0,0 +1,55 @@
enum class B(val x: Int) {
B1(1),
B2(2);
companion object {
val SUM = B1.x + B2.x
val COPY = B1
}
}
enum class C(val x: Int) {
C1(<!UNINITIALIZED_VARIABLE!>SUM<!>),
C2(1);
companion object {
val COPY = C2
val SUM = C1.x + COPY.x
}
}
// From KT-11769
enum class Fruit(personal: Int) {
APPLE(1);
companion object {
val common = 20
}
val score = personal + <!UNINITIALIZED_VARIABLE!>common<!>
}
// Another example from KT-11769
enum class EnumCompanion1(val x: Int) {
INSTANCE(<!UNINITIALIZED_ENUM_COMPANION!>Companion<!>.foo()),
ANOTHER(foo());
companion object {
fun foo() = 42
}
}
// Also should be reported for implicit receiver
enum class EnumCompanion2(val x: Int) {
INSTANCE(foo()); // TODO
companion object {
fun foo() = 42
}
}
// But not for another enum
enum class EnumCompanion3(val x: Int) {
INSTANCE(EnumCompanion1.foo()),
ANOTHER(EnumCompanion2.foo());
companion object
}

View File

@@ -0,0 +1,178 @@
package
public final enum class B : kotlin.Enum<B> {
enum entry B1
enum entry B2
private constructor B(/*0*/ x: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val x: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: B): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<B!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public final val COPY: B
public final val SUM: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): B
public final /*synthesized*/ fun values(): kotlin.Array<B>
}
public final enum class C : kotlin.Enum<C> {
enum entry C1
enum entry C2
private constructor C(/*0*/ x: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val x: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: C): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<C!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public final val COPY: C
public final val SUM: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): C
public final /*synthesized*/ fun values(): kotlin.Array<C>
}
public final enum class EnumCompanion1 : kotlin.Enum<EnumCompanion1> {
enum entry INSTANCE
enum entry ANOTHER
private constructor EnumCompanion1(/*0*/ x: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val x: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: EnumCompanion1): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<EnumCompanion1!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): EnumCompanion1
public final /*synthesized*/ fun values(): kotlin.Array<EnumCompanion1>
}
public final enum class EnumCompanion2 : kotlin.Enum<EnumCompanion2> {
enum entry INSTANCE
private constructor EnumCompanion2(/*0*/ x: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val x: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: EnumCompanion2): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<EnumCompanion2!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): EnumCompanion2
public final /*synthesized*/ fun values(): kotlin.Array<EnumCompanion2>
}
public final enum class EnumCompanion3 : kotlin.Enum<EnumCompanion3> {
enum entry INSTANCE
enum entry ANOTHER
private constructor EnumCompanion3(/*0*/ x: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val x: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: EnumCompanion3): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<EnumCompanion3!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): EnumCompanion3
public final /*synthesized*/ fun values(): kotlin.Array<EnumCompanion3>
}
public final enum class Fruit : kotlin.Enum<Fruit> {
enum entry APPLE
private constructor Fruit(/*0*/ personal: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val score: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Fruit): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<Fruit!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public final val common: kotlin.Int = 20
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): Fruit
public final /*synthesized*/ fun values(): kotlin.Array<Fruit>
}

View File

@@ -3,26 +3,6 @@ enum class A(val v: A) {
A2(A1)
}
enum class B(val x: Int) {
B1(1),
B2(2);
companion object {
val SUM = B1.x + B2.x
val COPY = B1
}
}
enum class C(val x: Int) {
C1(<!UNINITIALIZED_VARIABLE!>SUM<!>),
C2(1);
companion object {
val COPY = C2
val SUM = C1.x + COPY.x
}
}
enum class D(val x: Int) {
D1(<!UNINITIALIZED_ENUM_ENTRY!>D2<!>.x),
D2(D1.x)
@@ -44,17 +24,6 @@ object Object1 {
}
}
// From KT-11769
enum class Fruit(personal: Int) {
APPLE(1);
companion object {
val common = 20
}
val score = personal + <!UNINITIALIZED_VARIABLE!>common<!>
}
// From KT-6054
enum class MyEnum {
A, B;

View File

@@ -22,68 +22,6 @@ public final enum class A : kotlin.Enum<A> {
public final /*synthesized*/ fun values(): kotlin.Array<A>
}
public final enum class B : kotlin.Enum<B> {
enum entry B1
enum entry B2
private constructor B(/*0*/ x: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val x: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: B): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<B!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public final val COPY: B
public final val SUM: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): B
public final /*synthesized*/ fun values(): kotlin.Array<B>
}
public final enum class C : kotlin.Enum<C> {
enum entry C1
enum entry C2
private constructor C(/*0*/ x: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val x: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: C): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<C!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public final val COPY: C
public final val SUM: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): C
public final /*synthesized*/ fun values(): kotlin.Array<C>
}
public final enum class D : kotlin.Enum<D> {
enum entry D1
@@ -134,34 +72,6 @@ public final enum class E : kotlin.Enum<E> {
public final /*synthesized*/ fun values(): kotlin.Array<E>
}
public final enum class Fruit : kotlin.Enum<Fruit> {
enum entry APPLE
private constructor Fruit(/*0*/ personal: kotlin.Int)
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
public final val score: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Fruit): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<Fruit!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public companion object Companion {
private constructor Companion()
public final val common: kotlin.Int = 20
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): Fruit
public final /*synthesized*/ fun values(): kotlin.Array<Fruit>
}
public final enum class MyEnum : kotlin.Enum<MyEnum> {
enum entry A

View File

@@ -375,6 +375,12 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest {
doTest(fileName);
}
@TestMetadata("EnumEntryRefersCompanion.kt")
public void testEnumEntryRefersCompanion() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/EnumEntryRefersCompanion.kt");
doTest(fileName);
}
@TestMetadata("ObjectEnumQualifiers.kt")
public void testObjectEnumQualifiers() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.kt");

View File

@@ -377,6 +377,12 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest {
doTest(fileName);
}
@TestMetadata("EnumEntryRefersCompanion.kt")
public void testEnumEntryRefersCompanion() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/EnumEntryRefersCompanion.kt");
doTest(fileName);
}
@TestMetadata("ObjectEnumQualifiers.kt")
public void testObjectEnumQualifiers() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.kt");

View File

@@ -3306,6 +3306,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("enumCompanionInterdependence.kt")
public void testEnumCompanionInterdependence() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlFlowAnalysis/enumCompanionInterdependence.kt");
doTest(fileName);
}
@TestMetadata("enumInterdependence.kt")
public void testEnumInterdependence() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/controlFlowAnalysis/enumInterdependence.kt");