Prohibit type parameters for enum classes
#KT-5696 Fixed
This commit is contained in:
@@ -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);
|
||||
|
||||
+1
@@ -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
|
||||
|
||||
+2
-4
@@ -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()
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
+8
-1
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user