Prohibit type parameters for enum classes

#KT-5696 Fixed
This commit is contained in:
Alexander Udalov
2014-10-17 15:01:26 +04:00
parent 63366042ed
commit ae401cac0f
17 changed files with 114 additions and 109 deletions
@@ -178,7 +178,7 @@ public interface Errors {
.create(ERROR, modifierSetPosition(JetTokens.ABSTRACT_KEYWORD));
DiagnosticFactory0<PsiElement> CLASS_IN_SUPERTYPE_FOR_ENUM = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<JetTypeParameterList> TYPE_PARAMETERS_IN_ENUM = DiagnosticFactory0.create(ERROR);
DiagnosticFactory1<JetClass, ClassDescriptor> ENUM_ENTRY_SHOULD_BE_INITIALIZED = DiagnosticFactory1.create(ERROR, DECLARATION_NAME);
DiagnosticFactory1<JetTypeReference, ClassDescriptor> ENUM_ENTRY_ILLEGAL_TYPE = DiagnosticFactory1.create(ERROR);
DiagnosticFactory1<JetClass, ClassDescriptor> LOCAL_ENUM_NOT_ALLOWED = DiagnosticFactory1.create(ERROR, DECLARATION_NAME);
@@ -102,6 +102,7 @@ public class DefaultErrorMessages {
MAP.put(ILLEGAL_ENUM_ANNOTATION, "Annotation ''enum'' is only applicable for class");
MAP.put(REDUNDANT_MODIFIER_IN_GETTER, "Visibility modifiers are redundant in getter");
MAP.put(TRAIT_CAN_NOT_BE_FINAL, "Trait cannot be final");
MAP.put(TYPE_PARAMETERS_IN_ENUM, "Enum class cannot have type parameters");
MAP.put(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM,
"Type checking has run into a recursive problem. Easiest workaround: specify types of your declarations explicitly"); // TODO: message
MAP.put(RETURN_NOT_ALLOWED, "'return' is not allowed here");
@@ -114,9 +114,16 @@ public class DescriptorResolver {
BindingTrace trace
) {
// TODO : Where-clause
List<TypeParameterDescriptor> typeParameters = Lists.newArrayList();
List<JetTypeParameter> typeParameters = classElement.getTypeParameters();
List<TypeParameterDescriptor> typeParameterDescriptors = new ArrayList<TypeParameterDescriptor>(typeParameters.size());
if (descriptor.getKind() == ClassKind.ENUM_CLASS) {
JetTypeParameterList typeParameterList = classElement.getTypeParameterList();
if (typeParameterList != null) {
trace.report(TYPE_PARAMETERS_IN_ENUM.on(typeParameterList));
}
}
int index = 0;
for (JetTypeParameter typeParameter : classElement.getTypeParameters()) {
for (JetTypeParameter typeParameter : typeParameters) {
if (!topDownAnalysisParameters.isLazyTopDownAnalysis()) {
// TODO: Support
AnnotationResolver.reportUnsupportedAnnotationForTypeParameter(typeParameter, trace);
@@ -132,10 +139,10 @@ public class DescriptorResolver {
toSourceElement(typeParameter)
);
trace.record(BindingContext.TYPE_PARAMETER, typeParameter, typeParameterDescriptor);
typeParameters.add(typeParameterDescriptor);
typeParameterDescriptors.add(typeParameterDescriptor);
index++;
}
descriptor.setTypeParameterDescriptors(typeParameters);
descriptor.setTypeParameterDescriptors(typeParameterDescriptors);
Modality defaultModality = descriptor.getKind() == ClassKind.TRAIT ? Modality.ABSTRACT : Modality.FINAL;
descriptor.setModality(resolveModalityFromModifiers(classElement, defaultModality));
descriptor.setVisibility(resolveVisibilityFromModifiers(classElement, getDefaultClassVisibility(descriptor)));
@@ -17,14 +17,13 @@
package org.jetbrains.jet.lang.resolve.lazy.data;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.psi.*;
import java.util.List;
public class JetClassInfo extends JetClassOrObjectInfo<JetClass> {
@NotNull
private final ClassKind kind;
protected JetClassInfo(@NotNull JetClass classOrObject) {
@@ -51,10 +50,10 @@ public class JetClassInfo extends JetClassOrObjectInfo<JetClass> {
return element.getClassObject();
}
@NotNull
@Nullable
@Override
public List<JetTypeParameter> getTypeParameters() {
return element.getTypeParameters();
public JetTypeParameterList getTypeParameterList() {
return element.getTypeParameterList();
}
@NotNull
@@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
import java.util.List;
public interface JetClassLikeInfo extends JetDeclarationContainer {
@NotNull
FqName getContainingPackageFqName();
@@ -48,9 +47,8 @@ public interface JetClassLikeInfo extends JetDeclarationContainer {
@Nullable
JetClassOrObject getCorrespondingClassOrObject();
@NotNull
@ReadOnly
List<JetTypeParameter> getTypeParameters();
@Nullable
JetTypeParameterList getTypeParameterList();
@NotNull
@ReadOnly
@@ -17,14 +17,17 @@
package org.jetbrains.jet.lang.resolve.lazy.data;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.psi.JetClassObject;
import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
import org.jetbrains.jet.lang.psi.JetParameter;
import org.jetbrains.jet.lang.psi.JetTypeParameterList;
import java.util.Collections;
import java.util.List;
public class JetObjectInfo extends JetClassOrObjectInfo<JetObjectDeclaration> {
@NotNull
private final ClassKind kind;
@@ -38,10 +41,10 @@ public class JetObjectInfo extends JetClassOrObjectInfo<JetObjectDeclaration> {
return null;
}
@NotNull
@Nullable
@Override
public List<JetTypeParameter> getTypeParameters() {
return Collections.emptyList();
public JetTypeParameterList getTypeParameterList() {
return null;
}
@NotNull
@@ -16,16 +16,10 @@
package org.jetbrains.jet.lang.resolve.lazy.data
import org.jetbrains.jet.lang.psi.JetTypeParameter
import org.jetbrains.jet.lang.psi.JetParameter
import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.descriptors.ClassKind
import org.jetbrains.jet.lang.psi.JetScript
import org.jetbrains.jet.lang.resolve.ScriptNameUtil
import org.jetbrains.jet.lang.psi.JetNamedFunction
import org.jetbrains.jet.lang.psi.JetDeclaration
import org.jetbrains.jet.lang.psi.JetCallableDeclaration
import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lang.psi.JetClassObject
public class JetScriptInfo(
val script: JetScript
@@ -37,7 +31,7 @@ public class JetScriptInfo(
override fun getClassObjects() = listOf<JetClassObject>()
override fun getScopeAnchor() = script
override fun getCorrespondingClassOrObject() = null
override fun getTypeParameters() = listOf<JetTypeParameter>()
override fun getTypeParameterList() = null
override fun getPrimaryConstructorParameters() = listOf<JetParameter>()
override fun getClassKind() = ClassKind.CLASS
override fun getDeclarations() = script.getDeclarations()
@@ -78,10 +78,10 @@ public class SyntheticClassObjectInfo implements JetClassLikeInfo {
return null;
}
@NotNull
@Nullable
@Override
public List<JetTypeParameter> getTypeParameters() {
return Collections.emptyList();
public JetTypeParameterList getTypeParameterList() {
return null;
}
@NotNull
@@ -58,6 +58,7 @@ import org.jetbrains.jet.storage.StorageManager;
import java.util.*;
import static org.jetbrains.jet.lang.diagnostics.Errors.CLASS_OBJECT_NOT_ALLOWED;
import static org.jetbrains.jet.lang.diagnostics.Errors.TYPE_PARAMETERS_IN_ENUM;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isSyntheticClassObject;
import static org.jetbrains.jet.lang.resolve.ModifiersChecker.*;
import static org.jetbrains.jet.lang.resolve.name.SpecialNames.getClassObjectName;
@@ -529,8 +530,14 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
@Override
public List<TypeParameterDescriptor> invoke() {
JetClassLikeInfo classInfo = declarationProvider.getOwnerInfo();
List<JetTypeParameter> typeParameters = classInfo.getTypeParameters();
JetTypeParameterList typeParameterList = classInfo.getTypeParameterList();
if (typeParameterList == null) return Collections.emptyList();
if (classInfo.getClassKind() == ClassKind.ENUM_CLASS) {
resolveSession.getTrace().report(TYPE_PARAMETERS_IN_ENUM.on(typeParameterList));
}
List<JetTypeParameter> typeParameters = typeParameterList.getParameters();
List<TypeParameterDescriptor> parameters = new ArrayList<TypeParameterDescriptor>(typeParameters.size());
for (int i = 0; i < typeParameters.size(); i++) {
parameters.add(new LazyTypeParameterDescriptor(resolveSession, LazyClassDescriptor.this, typeParameters.get(i), i));