From 42397c887a2436bf9a5387b99cf7e229da711c98 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 13 Jul 2011 18:01:51 +0400 Subject: [PATCH] JET-183 Typechecker fails with enum constants --- .../lang/resolve/ClassDescriptorResolver.java | 17 +++++++++++--- idea/testData/checker/regression/Jet183.jet | 22 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 idea/testData/checker/regression/Jet183.jet diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index 855feccc65d..d7d35f9a732 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -5,6 +5,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.JetSemanticServices; @@ -143,15 +144,25 @@ public class ClassDescriptorResolver { public void resolveSupertypes(@NotNull JetClassOrObject jetClass, @NotNull MutableClassDescriptor descriptor) { List delegationSpecifiers = jetClass.getDelegationSpecifiers(); -// TODO : assuming that the hierarchy is acyclic + JetType defaultSupertype = JetStandardClasses.getAnyType(); + // TODO : beautify + if (jetClass instanceof JetEnumEntry) { + JetClassOrObject parent = PsiTreeUtil.getParentOfType(jetClass, JetClassOrObject.class); + ClassDescriptor parentDescriptor = trace.getBindingContext().getClassDescriptor(parent); + if (parentDescriptor.getTypeConstructor().getParameters().isEmpty()) { + defaultSupertype = parentDescriptor.getDefaultType(); + } + else if (delegationSpecifiers.isEmpty()) { + trace.getErrorHandler().genericError(((JetEnumEntry) jetClass).getNameIdentifier().getNode(), "generic arguments of the base type must be specified"); + } + } Collection superclasses = delegationSpecifiers.isEmpty() - ? Collections.singleton(JetStandardClasses.getAnyType()) + ? Collections.singleton(defaultSupertype) : resolveDelegationSpecifiers( descriptor.getScopeForSupertypeResolution(), delegationSpecifiers, typeResolverNotCheckingBounds); - // TODO : remove the importing for (JetType superclass : superclasses) { descriptor.addSupertype(superclass); } diff --git a/idea/testData/checker/regression/Jet183.jet b/idea/testData/checker/regression/Jet183.jet new file mode 100644 index 00000000000..4505e912280 --- /dev/null +++ b/idea/testData/checker/regression/Jet183.jet @@ -0,0 +1,22 @@ +enum class ProtocolState { + WAITING { + override fun signal() = ProtocolState.TALKING + } + + TALKING { + override fun signal() = ProtocolState.WAITING + } + + abstract fun signal() : ProtocolState +} + +enum class Foo { + X + +} + + + +fun box(): String { + val x: ProtocolState = ProtocolState.WAITING +}