Regular modifier checker implemented (initial version). A set of tests fixed accordingly.
Most of modifier diagnostic is expressed by REDUNDANT_MODIFIER, INCOMPATIBLE_MODIFIERS, REPEATED_MODIFIER, WRONG_MODIFIER_TARGET, WRONG_MODIFIER_PARENT. A set of modifier diagnostics is not in use now (but not deleted yet).
This commit is contained in:
@@ -108,10 +108,12 @@ public interface Errors {
|
||||
|
||||
// Modifiers
|
||||
|
||||
DiagnosticFactory1<PsiElement, Collection<JetModifierKeywordToken>> INCOMPATIBLE_MODIFIERS = DiagnosticFactory1.create(ERROR);
|
||||
DiagnosticFactory2<PsiElement, JetModifierKeywordToken, JetModifierKeywordToken> INCOMPATIBLE_MODIFIERS = DiagnosticFactory2.create(ERROR);
|
||||
DiagnosticFactory1<PsiElement, JetModifierKeywordToken> ILLEGAL_MODIFIER = DiagnosticFactory1.create(ERROR);
|
||||
DiagnosticFactory1<PsiElement, JetModifierKeywordToken> REPEATED_MODIFIER = DiagnosticFactory1.create(ERROR);
|
||||
DiagnosticFactory2<PsiElement, JetModifierKeywordToken, JetModifierKeywordToken> REDUNDANT_MODIFIER = DiagnosticFactory2.create(WARNING);
|
||||
DiagnosticFactory2<PsiElement, JetModifierKeywordToken, String> WRONG_MODIFIER_TARGET = DiagnosticFactory2.create(ERROR);
|
||||
DiagnosticFactory2<PsiElement, JetModifierKeywordToken, String> WRONG_MODIFIER_CONTAINING_DECLARATION = DiagnosticFactory2.create(ERROR);
|
||||
DiagnosticFactory0<PsiElement> INAPPLICABLE_PLATFORM_NAME = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory1<JetAnnotationEntry, String> WRONG_ANNOTATION_TARGET = DiagnosticFactory1.create(ERROR);
|
||||
DiagnosticFactory0<JetAnnotationEntry> REPEATED_ANNOTATION = DiagnosticFactory0.create(ERROR);
|
||||
|
||||
+3
-14
@@ -119,22 +119,11 @@ public class DefaultErrorMessages {
|
||||
MAP.put(NAME_SHADOWING, "Name shadowed: {0}", STRING);
|
||||
|
||||
MAP.put(TYPE_MISMATCH, "Type mismatch: inferred type is {1} but {0} was expected", RENDER_TYPE, RENDER_TYPE);
|
||||
MAP.put(INCOMPATIBLE_MODIFIERS, "Incompatible modifiers: ''{0}''", new Renderer<Collection<JetModifierKeywordToken>>() {
|
||||
@NotNull
|
||||
@Override
|
||||
public String render(@NotNull Collection<JetModifierKeywordToken> tokens) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (JetKeywordToken token : tokens) {
|
||||
if (sb.length() != 0) {
|
||||
sb.append(" ");
|
||||
}
|
||||
sb.append(token.getValue());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
});
|
||||
MAP.put(INCOMPATIBLE_MODIFIERS, "Modifier ''{0}'' is incompatible with ''{1}''", TO_STRING, TO_STRING);
|
||||
MAP.put(ILLEGAL_MODIFIER, "Illegal modifier ''{0}''", TO_STRING);
|
||||
MAP.put(REPEATED_MODIFIER, "Repeated ''{0}''", TO_STRING);
|
||||
MAP.put(WRONG_MODIFIER_TARGET, "Modifier ''{0}'' is not applicable to ''{1}''", TO_STRING, TO_STRING);
|
||||
MAP.put(WRONG_MODIFIER_CONTAINING_DECLARATION, "Modifier ''{0}'' is not applicable inside ''{1}''", TO_STRING, TO_STRING);
|
||||
MAP.put(INAPPLICABLE_PLATFORM_NAME, "platformName annotation is not applicable to this declaration");
|
||||
MAP.put(WRONG_ANNOTATION_TARGET, "This annotation is not applicable to target ''{0}''", TO_STRING);
|
||||
MAP.put(REPEATED_ANNOTATION, "This annotation is not repeatable");
|
||||
|
||||
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.resolve
|
||||
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getAnnotationEntries
|
||||
@@ -28,6 +27,7 @@ import org.jetbrains.kotlin.types.JetType
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isRepeatableAnnotation
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.*
|
||||
|
||||
public object AnnotationChecker {
|
||||
|
||||
@@ -50,11 +50,6 @@ public object AnnotationChecker {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (annotated is JetClassOrObject) {
|
||||
for (initializer in annotated.getAnonymousInitializers()) {
|
||||
check(initializer, trace)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public fun checkExpression(expression: JetExpression, trace: BindingTrace) {
|
||||
@@ -103,32 +98,40 @@ public object AnnotationChecker {
|
||||
trace.report(Errors.WRONG_ANNOTATION_TARGET.on(entry, actualTargets.firstOrNull()?.description ?: "unidentified target"))
|
||||
}
|
||||
|
||||
private fun getActualTargetList(annotated: JetAnnotated, descriptor: ClassDescriptor?): List<KotlinTarget> {
|
||||
if (annotated is JetClassOrObject) {
|
||||
if (annotated is JetEnumEntry) return listOf(KotlinTarget.PROPERTY, KotlinTarget.FIELD)
|
||||
return if (descriptor?.kind == ClassKind.ANNOTATION_CLASS) {
|
||||
listOf(KotlinTarget.ANNOTATION_CLASS, KotlinTarget.CLASSIFIER)
|
||||
}
|
||||
else {
|
||||
listOf(KotlinTarget.CLASSIFIER)
|
||||
}
|
||||
public fun getActualTargetList(annotated: JetElement, descriptor: ClassDescriptor?): List<KotlinTarget> {
|
||||
return when (annotated) {
|
||||
is JetClassOrObject -> descriptor?.let { KotlinTarget.classActualTargets(it) } ?: listOf(CLASSIFIER)
|
||||
is JetProperty ->
|
||||
if (annotated.isLocal) {
|
||||
listOf(LOCAL_VARIABLE)
|
||||
}
|
||||
else if (annotated.parent is JetClassOrObject || annotated.parent is JetClassBody) {
|
||||
listOf(MEMBER_PROPERTY, PROPERTY, FIELD)
|
||||
}
|
||||
else {
|
||||
listOf(TOP_LEVEL_PROPERTY, PROPERTY, FIELD)
|
||||
}
|
||||
is JetParameter -> if (annotated.hasValOrVar()) listOf(PROPERTY_PARAMETER, MEMBER_PROPERTY, PROPERTY, FIELD) else listOf(VALUE_PARAMETER)
|
||||
is JetConstructor<*> -> listOf(CONSTRUCTOR)
|
||||
is JetFunction ->
|
||||
if (annotated.isLocal) {
|
||||
listOf(LOCAL_FUNCTION, FUNCTION)
|
||||
}
|
||||
else if (annotated.parent is JetClassOrObject || annotated.parent is JetClassBody) {
|
||||
listOf(MEMBER_FUNCTION, FUNCTION)
|
||||
}
|
||||
else {
|
||||
listOf(TOP_LEVEL_FUNCTION, FUNCTION)
|
||||
}
|
||||
is JetPropertyAccessor -> if (annotated.isGetter) listOf(PROPERTY_GETTER) else listOf(PROPERTY_SETTER)
|
||||
is JetPackageDirective -> listOf(PACKAGE)
|
||||
is JetTypeReference -> listOf(TYPE)
|
||||
is JetFile -> listOf(FILE)
|
||||
is JetTypeParameter -> listOf(TYPE_PARAMETER)
|
||||
is JetTypeProjection -> if (annotated.projectionKind == JetProjectionKind.STAR) listOf(STAR_PROJECTION) else listOf(TYPE_PROJECTION)
|
||||
is JetClassInitializer -> listOf(INITIALIZER)
|
||||
else -> listOf()
|
||||
}
|
||||
if (annotated is JetProperty) {
|
||||
return if (annotated.isLocal) listOf(KotlinTarget.LOCAL_VARIABLE) else listOf(KotlinTarget.PROPERTY, KotlinTarget.FIELD)
|
||||
}
|
||||
if (annotated is JetParameter) {
|
||||
return if (annotated.hasValOrVar()) listOf(KotlinTarget.PROPERTY, KotlinTarget.FIELD) else listOf(KotlinTarget.VALUE_PARAMETER)
|
||||
}
|
||||
if (annotated is JetConstructor<*>) return listOf(KotlinTarget.CONSTRUCTOR)
|
||||
if (annotated is JetFunction) return listOf(KotlinTarget.FUNCTION)
|
||||
if (annotated is JetPropertyAccessor) {
|
||||
return if (annotated.isGetter) listOf(KotlinTarget.PROPERTY_GETTER) else listOf(KotlinTarget.PROPERTY_SETTER)
|
||||
}
|
||||
if (annotated is JetPackageDirective) return listOf(KotlinTarget.PACKAGE)
|
||||
if (annotated is JetTypeReference) return listOf(KotlinTarget.TYPE)
|
||||
if (annotated is JetFile) return listOf(KotlinTarget.FILE)
|
||||
if (annotated is JetTypeParameter) return listOf(KotlinTarget.TYPE_PARAMETER)
|
||||
return listOf()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -507,12 +507,12 @@ public class BodyResolver {
|
||||
}
|
||||
|
||||
private void processModifiersOnInitializer(@NotNull JetModifierListOwner owner, @NotNull JetScope scope) {
|
||||
AnnotationChecker.INSTANCE$.check(owner, trace, null);
|
||||
ModifierCheckerCore.INSTANCE$.check(owner, trace, null);
|
||||
JetModifierList modifierList = owner.getModifierList();
|
||||
if (modifierList == null) return;
|
||||
|
||||
annotationResolver.resolveAnnotationsWithArguments(scope, modifierList, trace);
|
||||
|
||||
modifiersChecker.withTrace(trace).reportIllegalModifiers(modifierList, Arrays.asList(JetTokens.MODIFIER_KEYWORDS_ARRAY));
|
||||
}
|
||||
|
||||
private void resolvePrimaryConstructorParameters(@NotNull BodiesResolveContext c) {
|
||||
|
||||
@@ -114,17 +114,9 @@ public class DeclarationsChecker {
|
||||
}
|
||||
|
||||
private void checkConstructorDeclaration(ConstructorDescriptor constructorDescriptor, JetDeclaration declaration) {
|
||||
modifiersChecker.reportIllegalModalityModifiers(declaration);
|
||||
reportErrorIfHasIllegalModifier(declaration);
|
||||
modifiersChecker.checkModifiersForDeclaration(declaration, constructorDescriptor);
|
||||
}
|
||||
|
||||
private void reportErrorIfHasIllegalModifier(JetModifierListOwner declaration) {
|
||||
if (declaration.hasModifier(JetTokens.ENUM_KEYWORD)) {
|
||||
trace.report(ILLEGAL_ENUM_ANNOTATION.on(declaration));
|
||||
}
|
||||
}
|
||||
|
||||
private void checkModifiersAndAnnotationsInPackageDirective(JetFile file) {
|
||||
JetPackageDirective packageDirective = file.getPackageDirective();
|
||||
if (packageDirective == null) return;
|
||||
@@ -142,8 +134,7 @@ public class DeclarationsChecker {
|
||||
}
|
||||
}
|
||||
AnnotationChecker.INSTANCE$.check(packageDirective, trace, null);
|
||||
|
||||
modifiersChecker.reportIllegalModifiers(modifierList, Arrays.asList(JetTokens.MODIFIER_KEYWORDS_ARRAY));
|
||||
ModifierCheckerCore.INSTANCE$.check(packageDirective, trace, null);
|
||||
}
|
||||
|
||||
private void checkTypesInClassHeader(@NotNull JetClassOrObject classOrObject) {
|
||||
@@ -228,8 +219,8 @@ public class DeclarationsChecker {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkObject(JetObjectDeclaration declaration, ClassDescriptor classDescriptor) {
|
||||
reportErrorIfHasIllegalModifier(declaration);
|
||||
if (declaration.isLocal() && !declaration.isCompanion() && !declaration.isObjectLiteral()) {
|
||||
trace.report(LOCAL_OBJECT_NOT_ALLOWED.on(declaration, classDescriptor));
|
||||
}
|
||||
@@ -245,11 +236,9 @@ public class DeclarationsChecker {
|
||||
trace.report(Errors.DEPRECATED_TRAIT_KEYWORD.on(traitKeyword.getPsi()));
|
||||
}
|
||||
|
||||
checkTraitModifiers(aClass);
|
||||
checkConstructorInTrait(aClass);
|
||||
}
|
||||
else if (aClass.isEnum()) {
|
||||
checkEnumModifiers(aClass);
|
||||
if (aClass.isLocal()) {
|
||||
trace.report(LOCAL_ENUM_NOT_ALLOWED.on(aClass, classDescriptor));
|
||||
}
|
||||
@@ -263,9 +252,6 @@ public class DeclarationsChecker {
|
||||
checkAnnotationClassWithBody(aClass);
|
||||
checkValOnAnnotationParameter(aClass);
|
||||
}
|
||||
else if (aClass.hasModifier(JetTokens.SEALED_KEYWORD)) {
|
||||
checkSealedModifiers(aClass);
|
||||
}
|
||||
else if (aClass instanceof JetEnumEntry) {
|
||||
checkEnumEntry((JetEnumEntry) aClass, classDescriptor);
|
||||
}
|
||||
@@ -314,24 +300,6 @@ public class DeclarationsChecker {
|
||||
}
|
||||
}
|
||||
|
||||
private void checkTraitModifiers(JetClass aClass) {
|
||||
reportErrorIfHasIllegalModifier(aClass);
|
||||
JetModifierList modifierList = aClass.getModifierList();
|
||||
if (modifierList == null) return;
|
||||
if (modifierList.hasModifier(JetTokens.FINAL_KEYWORD)) {
|
||||
trace.report(Errors.TRAIT_CAN_NOT_BE_FINAL.on(aClass));
|
||||
}
|
||||
if (modifierList.hasModifier(JetTokens.SEALED_KEYWORD)) {
|
||||
trace.report(Errors.TRAIT_CAN_NOT_BE_SEALED.on(aClass));
|
||||
}
|
||||
if (modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
||||
trace.report(Errors.ABSTRACT_MODIFIER_IN_TRAIT.on(aClass));
|
||||
}
|
||||
if (modifierList.hasModifier(JetTokens.OPEN_KEYWORD)) {
|
||||
trace.report(Errors.OPEN_MODIFIER_IN_TRAIT.on(aClass));
|
||||
}
|
||||
}
|
||||
|
||||
private void checkAnnotationClassWithBody(JetClassOrObject classOrObject) {
|
||||
if (classOrObject.getBody() != null) {
|
||||
trace.report(ANNOTATION_CLASS_WITH_BODY.on(classOrObject.getBody()));
|
||||
@@ -359,14 +327,10 @@ public class DeclarationsChecker {
|
||||
}
|
||||
|
||||
private void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor) {
|
||||
reportErrorIfHasIllegalModifier(property);
|
||||
DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration();
|
||||
if (containingDeclaration instanceof ClassDescriptor) {
|
||||
checkPropertyAbstractness(property, propertyDescriptor, (ClassDescriptor) containingDeclaration);
|
||||
}
|
||||
else {
|
||||
modifiersChecker.reportIllegalModalityModifiers(property);
|
||||
}
|
||||
checkPropertyInitializer(property, propertyDescriptor);
|
||||
checkAccessors(property, propertyDescriptor);
|
||||
checkDeclaredTypeInPublicMember(property, propertyDescriptor);
|
||||
@@ -490,7 +454,6 @@ public class DeclarationsChecker {
|
||||
}
|
||||
|
||||
protected void checkFunction(JetNamedFunction function, SimpleFunctionDescriptor functionDescriptor) {
|
||||
reportErrorIfHasIllegalModifier(function);
|
||||
DeclarationDescriptor containingDescriptor = functionDescriptor.getContainingDeclaration();
|
||||
boolean hasAbstractModifier = function.hasModifier(JetTokens.ABSTRACT_KEYWORD);
|
||||
checkDeclaredTypeInPublicMember(function, functionDescriptor);
|
||||
@@ -515,7 +478,6 @@ public class DeclarationsChecker {
|
||||
}
|
||||
return;
|
||||
}
|
||||
modifiersChecker.reportIllegalModalityModifiers(function);
|
||||
if (!function.hasBody() && !hasAbstractModifier) {
|
||||
trace.report(NON_MEMBER_FUNCTION_NO_BODY.on(function, functionDescriptor));
|
||||
}
|
||||
@@ -526,7 +488,6 @@ public class DeclarationsChecker {
|
||||
PropertyAccessorDescriptor propertyAccessorDescriptor = accessor.isGetter() ? propertyDescriptor.getGetter() : propertyDescriptor.getSetter();
|
||||
assert propertyAccessorDescriptor != null : "No property accessor descriptor for " + property.getText();
|
||||
modifiersChecker.checkModifiersForDeclaration(accessor, propertyAccessorDescriptor);
|
||||
modifiersChecker.reportIllegalModalityModifiers(accessor);
|
||||
}
|
||||
JetPropertyAccessor getter = property.getGetter();
|
||||
PropertyGetterDescriptor getterDescriptor = propertyDescriptor.getGetter();
|
||||
@@ -548,30 +509,6 @@ public class DeclarationsChecker {
|
||||
}
|
||||
}
|
||||
|
||||
private void checkEnumModifiers(JetClass aClass) {
|
||||
if (aClass.hasModifier(JetTokens.OPEN_KEYWORD)) {
|
||||
trace.report(OPEN_MODIFIER_IN_ENUM.on(aClass));
|
||||
}
|
||||
if (aClass.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
||||
trace.report(ABSTRACT_MODIFIER_IN_ENUM.on(aClass));
|
||||
}
|
||||
if (aClass.hasModifier(JetTokens.SEALED_KEYWORD)) {
|
||||
trace.report(SEALED_MODIFIER_IN_ENUM.on(aClass));
|
||||
}
|
||||
}
|
||||
|
||||
private void checkSealedModifiers(JetClass aClass) {
|
||||
if (aClass.hasModifier(JetTokens.OPEN_KEYWORD)) {
|
||||
trace.report(OPEN_MODIFIER_IN_SEALED.on(aClass));
|
||||
}
|
||||
if (aClass.hasModifier(JetTokens.FINAL_KEYWORD)) {
|
||||
trace.report(FINAL_MODIFIER_IN_SEALED.on(aClass));
|
||||
}
|
||||
if (aClass.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
|
||||
trace.report(ABSTRACT_MODIFIER_IN_SEALED.on(aClass));
|
||||
}
|
||||
}
|
||||
|
||||
// Temporary
|
||||
// Returns true if deprecated constructor is in use, like
|
||||
// ENTRY: Enum(arguments) instead of
|
||||
|
||||
@@ -344,12 +344,8 @@ class FunctionDescriptorResolver(
|
||||
valueParameter,
|
||||
if (isConstructor) VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER else VAL_OR_VAR_ON_FUN_PARAMETER
|
||||
)
|
||||
checkParameterHasNoModifier(valueParameter)
|
||||
}
|
||||
}
|
||||
else {
|
||||
checkConstructorParameterHasNoModifier(trace, valueParameter)
|
||||
}
|
||||
|
||||
val valueParameterDescriptor = descriptorResolver.resolveValueParameterDescriptor(parameterScope, functionDescriptor,
|
||||
valueParameter, i, type, trace)
|
||||
@@ -358,11 +354,4 @@ class FunctionDescriptorResolver(
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
private fun checkConstructorParameterHasNoModifier(trace: BindingTrace, parameter: JetParameter) {
|
||||
// If is not a property, then it must have no modifier
|
||||
if (!parameter.hasValOrVar()) {
|
||||
modifiersChecker.withTrace(trace).checkParameterHasNoModifier(parameter)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,14 +20,12 @@ import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.descriptors.*;
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1;
|
||||
import org.jetbrains.kotlin.diagnostics.Errors;
|
||||
import org.jetbrains.kotlin.lexer.JetKeywordToken;
|
||||
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken;
|
||||
import org.jetbrains.kotlin.lexer.JetTokens;
|
||||
@@ -42,8 +40,6 @@ import java.util.*;
|
||||
import static org.jetbrains.kotlin.diagnostics.Errors.*;
|
||||
import static org.jetbrains.kotlin.lexer.JetTokens.*;
|
||||
import static org.jetbrains.kotlin.psi.JetStubbedPsiUtil.getContainingDeclaration;
|
||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject;
|
||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry;
|
||||
|
||||
public class ModifiersChecker {
|
||||
private static final Collection<JetModifierKeywordToken> MODALITY_MODIFIERS =
|
||||
@@ -189,175 +185,29 @@ public class ModifiersChecker {
|
||||
}
|
||||
}
|
||||
|
||||
public void reportIllegalModifiers(
|
||||
@Nullable JetModifierList modifierList,
|
||||
@NotNull Collection<JetModifierKeywordToken> illegalModifiers
|
||||
) {
|
||||
if (modifierList == null) return;
|
||||
|
||||
for (JetModifierKeywordToken modifierToken : illegalModifiers) {
|
||||
if (modifierList.hasModifier(modifierToken)) {
|
||||
PsiElement modifierPsi = modifierList.getModifier(modifierToken);
|
||||
assert modifierPsi != null;
|
||||
trace.report(ILLEGAL_MODIFIER.on(modifierPsi, modifierToken));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void reportIllegalModifiers(
|
||||
@NotNull JetModifierListOwner modifierListOwner,
|
||||
@NotNull Collection<JetModifierKeywordToken> illegalModifiers
|
||||
) {
|
||||
reportIllegalModifiers(modifierListOwner.getModifierList(), illegalModifiers);
|
||||
}
|
||||
|
||||
public void checkIncompatibleModifiers(
|
||||
@Nullable JetModifierList modifierList,
|
||||
@NotNull Collection<JetModifierKeywordToken> availableModifiers,
|
||||
@NotNull Collection<JetModifierKeywordToken>... availableCombinations
|
||||
) {
|
||||
if (modifierList == null) return;
|
||||
Collection<JetModifierKeywordToken> presentModifiers = Sets.newLinkedHashSet();
|
||||
for (JetModifierKeywordToken modifier : availableModifiers) {
|
||||
if (modifierList.hasModifier(modifier)) {
|
||||
presentModifiers.add(modifier);
|
||||
}
|
||||
}
|
||||
checkRepeatedModifiers(modifierList, availableModifiers);
|
||||
|
||||
if (presentModifiers.size() == 1) {
|
||||
return;
|
||||
}
|
||||
for (Collection<JetModifierKeywordToken> combination : availableCombinations) {
|
||||
if (presentModifiers.containsAll(combination) && combination.containsAll(presentModifiers)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (JetModifierKeywordToken token : presentModifiers) {
|
||||
trace.report(Errors.INCOMPATIBLE_MODIFIERS.on(modifierList.getModifierNode(token).getPsi(), presentModifiers));
|
||||
}
|
||||
}
|
||||
|
||||
private void checkRepeatedModifiers(
|
||||
@NotNull JetModifierList modifierList,
|
||||
@NotNull Collection<JetModifierKeywordToken> availableModifiers
|
||||
) {
|
||||
for (JetModifierKeywordToken token : availableModifiers) {
|
||||
if (!modifierList.hasModifier(token)) continue;
|
||||
|
||||
List<ASTNode> nodesOfRepeatedTokens = Lists.newArrayList();
|
||||
ASTNode node = modifierList.getNode().getFirstChildNode();
|
||||
while (node != null) {
|
||||
if (node.getElementType() == token) {
|
||||
nodesOfRepeatedTokens.add(node);
|
||||
}
|
||||
node = node.getTreeNext();
|
||||
}
|
||||
if (nodesOfRepeatedTokens.size() > 1) {
|
||||
for (ASTNode repeatedToken : nodesOfRepeatedTokens) {
|
||||
trace.report(REPEATED_MODIFIER.on(repeatedToken.getPsi(), token));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void checkIncompatibleVarianceModifiers(@Nullable JetModifierList modifierList) {
|
||||
checkIncompatibleModifiers(modifierList, Arrays.asList(JetTokens.IN_KEYWORD, JetTokens.OUT_KEYWORD));
|
||||
}
|
||||
|
||||
|
||||
public void checkModifiersForDeclaration(@NotNull JetDeclaration modifierListOwner, @NotNull MemberDescriptor descriptor) {
|
||||
if (modifierListOwner instanceof JetEnumEntry) {
|
||||
reportIllegalModifiers(modifierListOwner.getModifierList(), Arrays.asList(MODIFIER_KEYWORDS_ARRAY));
|
||||
}
|
||||
else {
|
||||
checkInnerModifier(modifierListOwner, descriptor);
|
||||
checkCompanionModifier(modifierListOwner);
|
||||
checkModalityModifiers(modifierListOwner);
|
||||
checkVisibilityModifiers(modifierListOwner, descriptor);
|
||||
checkVarianceModifiers(modifierListOwner);
|
||||
checkVarargsModifiers(modifierListOwner, descriptor);
|
||||
}
|
||||
checkNestedClassAllowed(modifierListOwner, descriptor);
|
||||
ModifierCheckerCore.INSTANCE$.check(modifierListOwner, trace, descriptor);
|
||||
checkTypeParametersModifiers(modifierListOwner);
|
||||
checkPlatformNameApplicability(descriptor);
|
||||
runDeclarationCheckers(modifierListOwner, descriptor);
|
||||
AnnotationChecker.INSTANCE$.check(modifierListOwner, trace,
|
||||
descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null);
|
||||
}
|
||||
|
||||
private void checkVarargsModifiers(@NotNull JetDeclaration owner, @NotNull MemberDescriptor descriptor) {
|
||||
if (!(owner instanceof JetParameter)) {
|
||||
reportIllegalModifiers(owner.getModifierList(), Collections.singleton(VARARG_KEYWORD));
|
||||
}
|
||||
ClassDescriptor classDescriptor = descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null;
|
||||
AnnotationChecker.INSTANCE$.check(modifierListOwner, trace, classDescriptor);
|
||||
}
|
||||
|
||||
public void checkModifiersForLocalDeclaration(
|
||||
@NotNull JetDeclaration modifierListOwner,
|
||||
@NotNull DeclarationDescriptor descriptor
|
||||
) {
|
||||
reportIllegalModalityModifiers(modifierListOwner);
|
||||
reportIllegalVisibilityModifiers(modifierListOwner);
|
||||
checkPlatformNameApplicability(descriptor);
|
||||
runDeclarationCheckers(modifierListOwner, descriptor);
|
||||
AnnotationChecker.INSTANCE$.check(modifierListOwner, trace,
|
||||
descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null);
|
||||
descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null);
|
||||
ModifierCheckerCore.INSTANCE$.check(modifierListOwner, trace, descriptor);
|
||||
}
|
||||
|
||||
public void reportIllegalModalityModifiers(@NotNull JetModifierListOwner modifierListOwner) {
|
||||
reportIllegalModifiers(modifierListOwner, MODALITY_MODIFIERS);
|
||||
}
|
||||
|
||||
public void reportIllegalVisibilityModifiers(@NotNull JetModifierListOwner modifierListOwner) {
|
||||
reportIllegalModifiers(modifierListOwner, VISIBILITY_MODIFIERS);
|
||||
}
|
||||
|
||||
private void checkModalityModifiers(@NotNull JetModifierListOwner modifierListOwner) {
|
||||
JetModifierList modifierList = modifierListOwner.getModifierList();
|
||||
if (modifierList == null) return;
|
||||
|
||||
checkRedundantModifier(modifierList, Pair.create(OPEN_KEYWORD, ABSTRACT_KEYWORD), Pair.create(OPEN_KEYWORD, OVERRIDE_KEYWORD));
|
||||
|
||||
checkCompatibility(modifierList, Arrays.asList(ABSTRACT_KEYWORD, OPEN_KEYWORD, FINAL_KEYWORD),
|
||||
Arrays.asList(ABSTRACT_KEYWORD, OPEN_KEYWORD));
|
||||
|
||||
if (modifierListOwner instanceof JetObjectDeclaration) {
|
||||
reportIllegalModalityModifiers(modifierListOwner);
|
||||
}
|
||||
else if (modifierListOwner instanceof JetClassOrObject) {
|
||||
reportIllegalModifiers(modifierListOwner, Collections.singletonList(OVERRIDE_KEYWORD));
|
||||
}
|
||||
}
|
||||
|
||||
private void checkVisibilityModifiers(@NotNull JetModifierListOwner modifierListOwner, @NotNull DeclarationDescriptor descriptor) {
|
||||
JetModifierList modifierList = modifierListOwner.getModifierList();
|
||||
if (modifierList == null) return;
|
||||
|
||||
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
|
||||
if (containingDeclaration instanceof PackageFragmentDescriptor) {
|
||||
if (modifierList.hasModifier(PROTECTED_KEYWORD)) {
|
||||
trace.report(Errors.PACKAGE_MEMBER_CANNOT_BE_PROTECTED.on(modifierListOwner));
|
||||
}
|
||||
}
|
||||
|
||||
checkCompatibility(modifierList, VISIBILITY_MODIFIERS);
|
||||
}
|
||||
|
||||
private void checkInnerModifier(@NotNull JetModifierListOwner modifierListOwner, @NotNull DeclarationDescriptor descriptor) {
|
||||
if (modifierListOwner.hasModifier(INNER_KEYWORD)) {
|
||||
switch (checkIllegalInner(descriptor)) {
|
||||
case ALLOWED:
|
||||
break;
|
||||
case ILLEGAL_POSITION:
|
||||
reportIllegalModifiers(modifierListOwner, Collections.singletonList(INNER_KEYWORD));
|
||||
break;
|
||||
case IN_TRAIT:
|
||||
trace.report(INNER_CLASS_IN_TRAIT.on(modifierListOwner));
|
||||
break;
|
||||
case IN_OBJECT:
|
||||
trace.report(INNER_CLASS_IN_OBJECT.on(modifierListOwner));
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
private void checkNestedClassAllowed(@NotNull JetModifierListOwner modifierListOwner, @NotNull DeclarationDescriptor descriptor) {
|
||||
if (modifierListOwner.hasModifier(INNER_KEYWORD)) return;
|
||||
if (modifierListOwner instanceof JetClass && !(modifierListOwner instanceof JetEnumEntry)) {
|
||||
JetClass aClass = (JetClass) modifierListOwner;
|
||||
boolean localEnumError = aClass.isLocal() && aClass.isEnum();
|
||||
@@ -367,12 +217,6 @@ public class ModifiersChecker {
|
||||
}
|
||||
}
|
||||
|
||||
private void checkCompanionModifier(@NotNull JetDeclaration declaration) {
|
||||
if (declaration.hasModifier(COMPANION_KEYWORD) && !isCompanionModifierAllowed(declaration)) {
|
||||
reportIllegalModifiers(declaration, Collections.singletonList(COMPANION_KEYWORD));
|
||||
}
|
||||
}
|
||||
|
||||
private void checkPlatformNameApplicability(@NotNull DeclarationDescriptor descriptor) {
|
||||
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(new FqName("kotlin.platform.platformName"));
|
||||
if (annotation == null) return;
|
||||
@@ -411,28 +255,6 @@ public class ModifiersChecker {
|
||||
return containingDescriptor instanceof PackageFragmentDescriptor || containingDescriptor instanceof ClassDescriptor;
|
||||
}
|
||||
|
||||
private void checkCompatibility(
|
||||
@Nullable JetModifierList modifierList,
|
||||
Collection<JetModifierKeywordToken> availableModifiers,
|
||||
Collection<JetModifierKeywordToken>... availableCombinations
|
||||
) {
|
||||
checkIncompatibleModifiers(modifierList, availableModifiers, availableCombinations);
|
||||
}
|
||||
|
||||
private void checkRedundantModifier(
|
||||
@NotNull JetModifierList modifierList,
|
||||
Pair<JetModifierKeywordToken, JetModifierKeywordToken>... redundantBundles
|
||||
) {
|
||||
for (Pair<JetModifierKeywordToken, JetModifierKeywordToken> tokenPair : redundantBundles) {
|
||||
JetModifierKeywordToken redundantModifier = tokenPair.getFirst();
|
||||
JetModifierKeywordToken sufficientModifier = tokenPair.getSecond();
|
||||
if (modifierList.hasModifier(redundantModifier) && modifierList.hasModifier(sufficientModifier)) {
|
||||
trace.report(Errors.REDUNDANT_MODIFIER.on(modifierList.getModifierNode(redundantModifier).getPsi(), redundantModifier,
|
||||
sufficientModifier));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public Map<JetModifierKeywordToken, ASTNode> getNodesCorrespondingToModifiers(
|
||||
@NotNull JetModifierList modifierList,
|
||||
@@ -454,21 +276,13 @@ public class ModifiersChecker {
|
||||
}
|
||||
}
|
||||
|
||||
public void checkVarianceModifiers(@NotNull JetModifierListOwner modifierListOwner) {
|
||||
reportIllegalModifiers(modifierListOwner.getModifierList(), Arrays.asList(IN_KEYWORD, OUT_KEYWORD, REIFIED_KEYWORD));
|
||||
public void checkTypeParametersModifiers(@NotNull JetModifierListOwner modifierListOwner) {
|
||||
if (!(modifierListOwner instanceof JetTypeParameterListOwner)) return;
|
||||
List<JetTypeParameter> typeParameters = ((JetTypeParameterListOwner) modifierListOwner).getTypeParameters();
|
||||
for (JetTypeParameter typeParameter : typeParameters) {
|
||||
JetModifierList modifierList = typeParameter.getModifierList();
|
||||
checkIncompatibleVarianceModifiers(modifierList);
|
||||
ModifierCheckerCore.INSTANCE$.check(typeParameter, trace, null);
|
||||
}
|
||||
}
|
||||
|
||||
public void checkParameterHasNoModifier(
|
||||
@NotNull JetParameter parameter
|
||||
) {
|
||||
reportIllegalModifiers(parameter.getModifierList(), MODIFIERS_ILLEGAL_ON_PARAMETERS);
|
||||
}
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
* Copyright 2010-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.resolve
|
||||
|
||||
import com.intellij.lang.ASTNode
|
||||
import com.intellij.psi.tree.TokenSet
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken
|
||||
import java.util.*
|
||||
import org.jetbrains.kotlin.lexer.JetTokens.*
|
||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.*
|
||||
import org.jetbrains.kotlin.lexer.JetTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
|
||||
public object ModifierCheckerCore {
|
||||
private enum class Compatibility {
|
||||
COMPATIBLE,
|
||||
REDUNDANT,
|
||||
REVERSE_REDUNDANT,
|
||||
REPEATED,
|
||||
INCOMPATIBLE
|
||||
}
|
||||
|
||||
private val possibleTargetMap = mapOf<JetModifierKeywordToken, Set<KotlinTarget>>(
|
||||
ENUM_KEYWORD to EnumSet.of(ENUM_CLASS),
|
||||
ABSTRACT_KEYWORD to EnumSet.of(CLASS, LOCAL_CLASS, INNER_CLASS, MEMBER_PROPERTY, MEMBER_FUNCTION),
|
||||
OPEN_KEYWORD to EnumSet.of(CLASS, LOCAL_CLASS, INNER_CLASS, MEMBER_PROPERTY, MEMBER_FUNCTION),
|
||||
FINAL_KEYWORD to EnumSet.of(CLASS, LOCAL_CLASS, INNER_CLASS, MEMBER_PROPERTY, MEMBER_FUNCTION),
|
||||
SEALED_KEYWORD to EnumSet.of(CLASS, LOCAL_CLASS, INNER_CLASS),
|
||||
INNER_KEYWORD to EnumSet.of(INNER_CLASS),
|
||||
OVERRIDE_KEYWORD to EnumSet.of(MEMBER_PROPERTY, MEMBER_FUNCTION),
|
||||
PRIVATE_KEYWORD to EnumSet.of(CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
|
||||
MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR),
|
||||
PUBLIC_KEYWORD to EnumSet.of(CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
|
||||
MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR),
|
||||
INTERNAL_KEYWORD to EnumSet.of(CLASSIFIER, MEMBER_FUNCTION, TOP_LEVEL_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER,
|
||||
MEMBER_PROPERTY, TOP_LEVEL_PROPERTY, CONSTRUCTOR),
|
||||
PROTECTED_KEYWORD to EnumSet.of(CLASSIFIER, MEMBER_FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, MEMBER_PROPERTY, CONSTRUCTOR),
|
||||
IN_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION),
|
||||
OUT_KEYWORD to EnumSet.of(TYPE_PARAMETER, TYPE_PROJECTION),
|
||||
REIFIED_KEYWORD to EnumSet.of(TYPE_PARAMETER),
|
||||
VARARG_KEYWORD to EnumSet.of(VALUE_PARAMETER, PROPERTY_PARAMETER),
|
||||
DYNAMIC_KEYWORD to emptySet(), // not really a modifier
|
||||
COMPANION_KEYWORD to EnumSet.of(OBJECT)
|
||||
)
|
||||
|
||||
private val possibleParentTargetMap = mapOf<JetModifierKeywordToken, Set<KotlinTarget>>(
|
||||
INNER_KEYWORD to EnumSet.of(CLASS, INNER_CLASS, LOCAL_CLASS, ENUM_CLASS, ENUM_ENTRY),
|
||||
OVERRIDE_KEYWORD to EnumSet.of(CLASSIFIER, ENUM_ENTRY),
|
||||
PROTECTED_KEYWORD to EnumSet.of(CLASSIFIER, ENUM_ENTRY),
|
||||
COMPANION_KEYWORD to EnumSet.of(CLASS, ENUM_CLASS, INTERFACE)
|
||||
)
|
||||
|
||||
// First modifier in pair should be also first in declaration
|
||||
private val mutualCompatibility = buildCompatibilityMap()
|
||||
|
||||
private fun buildCompatibilityMap(): Map<Pair<JetModifierKeywordToken, JetModifierKeywordToken>, Compatibility> {
|
||||
val result = hashMapOf<Pair<JetModifierKeywordToken, JetModifierKeywordToken>, Compatibility>()
|
||||
// Variance: in + out are incompatible
|
||||
result += incompatibilityRegister(listOf(IN_KEYWORD, OUT_KEYWORD))
|
||||
// Visibilities: incompatible
|
||||
result += incompatibilityRegister(listOf(PRIVATE_KEYWORD, PROTECTED_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD))
|
||||
// Abstract + open + final + sealed: incompatible
|
||||
result += incompatibilityRegister(listOf(ABSTRACT_KEYWORD, OPEN_KEYWORD, FINAL_KEYWORD, SEALED_KEYWORD))
|
||||
// open is redundant to abstract & override
|
||||
result += redundantRegister(ABSTRACT_KEYWORD, OPEN_KEYWORD)
|
||||
result += redundantRegister(OVERRIDE_KEYWORD, OPEN_KEYWORD)
|
||||
// abstract is redundant to sealed
|
||||
result += redundantRegister(SEALED_KEYWORD, ABSTRACT_KEYWORD)
|
||||
return result
|
||||
}
|
||||
|
||||
private fun redundantRegister(
|
||||
sufficient: JetModifierKeywordToken,
|
||||
redundant: JetModifierKeywordToken
|
||||
): Map<Pair<JetModifierKeywordToken, JetModifierKeywordToken>, Compatibility> {
|
||||
return mapOf(Pair(sufficient, redundant) to Compatibility.REDUNDANT,
|
||||
Pair(redundant, sufficient) to Compatibility.REVERSE_REDUNDANT)
|
||||
}
|
||||
|
||||
private fun incompatibilityRegister(
|
||||
list: List<JetModifierKeywordToken>
|
||||
): Map<Pair<JetModifierKeywordToken, JetModifierKeywordToken>, Compatibility> {
|
||||
val result = hashMapOf<Pair<JetModifierKeywordToken, JetModifierKeywordToken>, Compatibility>()
|
||||
for (first in list) {
|
||||
for (second in list) {
|
||||
if (first != second) {
|
||||
result[Pair(first, second)] = Compatibility.INCOMPATIBLE
|
||||
}
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
private fun compatibility(first: JetModifierKeywordToken, second: JetModifierKeywordToken): Compatibility {
|
||||
if (first == second) {
|
||||
return Compatibility.REPEATED
|
||||
}
|
||||
else {
|
||||
return mutualCompatibility[Pair(first, second)] ?: Compatibility.COMPATIBLE
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkCompatibility(trace: BindingTrace, firstNode: ASTNode, secondNode: ASTNode, incorrectNodes: MutableSet<ASTNode>) {
|
||||
val first = firstNode.elementType as JetModifierKeywordToken
|
||||
val second = secondNode.elementType as JetModifierKeywordToken
|
||||
val compatibility = compatibility(first, second)
|
||||
when (compatibility) {
|
||||
Compatibility.COMPATIBLE -> {}
|
||||
Compatibility.REPEATED -> if (incorrectNodes.add(secondNode)) {
|
||||
trace.report(Errors.REPEATED_MODIFIER.on (secondNode.psi, first))
|
||||
}
|
||||
Compatibility.REDUNDANT -> if (incorrectNodes.add(secondNode)) {
|
||||
trace.report(Errors.REDUNDANT_MODIFIER.on(secondNode.psi, first, second))
|
||||
}
|
||||
Compatibility.REVERSE_REDUNDANT -> if (incorrectNodes.add(firstNode)) {
|
||||
trace.report(Errors.REDUNDANT_MODIFIER.on(firstNode.psi, second, first))
|
||||
}
|
||||
Compatibility.INCOMPATIBLE -> {
|
||||
if (incorrectNodes.add(firstNode)) {
|
||||
trace.report(Errors.INCOMPATIBLE_MODIFIERS.on(firstNode.psi, first, second))
|
||||
}
|
||||
if (incorrectNodes.add(secondNode)) {
|
||||
trace.report(Errors.INCOMPATIBLE_MODIFIERS.on(secondNode.psi, second, first))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkTarget(trace: BindingTrace, node: ASTNode, actualTargets: List<KotlinTarget>): Boolean {
|
||||
val modifier = node.elementType as JetModifierKeywordToken
|
||||
val possibleTargets = possibleTargetMap[modifier] ?: emptySet()
|
||||
if (actualTargets.any { it in possibleTargets }) return true
|
||||
trace.report(Errors.WRONG_MODIFIER_TARGET.on(node.psi, modifier, actualTargets.firstOrNull()?.description ?: "this"))
|
||||
return false
|
||||
}
|
||||
|
||||
private fun checkParent(trace: BindingTrace, node: ASTNode, parentDescriptor: DeclarationDescriptor?): Boolean {
|
||||
val modifier = node.elementType as JetModifierKeywordToken
|
||||
val actualParents: List<KotlinTarget> = when (parentDescriptor) {
|
||||
is ClassDescriptor -> KotlinTarget.classActualTargets(parentDescriptor)
|
||||
is FunctionDescriptor -> listOf(FUNCTION)
|
||||
else -> listOf(PACKAGE)
|
||||
}
|
||||
val possibleParents = possibleParentTargetMap[modifier] ?: return true
|
||||
if (possibleParents == KotlinTarget.ALL_TARGET_SET) return true
|
||||
if (actualParents.any { it in possibleParents }) return true
|
||||
trace.report(Errors.WRONG_MODIFIER_CONTAINING_DECLARATION.on(node.psi, modifier, actualParents.firstOrNull()?.description ?: "this scope"))
|
||||
return false
|
||||
}
|
||||
|
||||
private val MODIFIER_KEYWORD_SET = TokenSet.orSet(JetTokens.SOFT_KEYWORDS, TokenSet.create(JetTokens.IN_KEYWORD))
|
||||
|
||||
private fun checkModifierList(list: JetModifierList, trace: BindingTrace, parentDescriptor: DeclarationDescriptor?, actualTargets: List<KotlinTarget>) {
|
||||
val incorrectNodes = hashSetOf<ASTNode>()
|
||||
val children = list.node.getChildren(MODIFIER_KEYWORD_SET)
|
||||
for (second in children) {
|
||||
for (first in children) {
|
||||
if (first == second) {
|
||||
break;
|
||||
}
|
||||
checkCompatibility(trace, first, second, incorrectNodes)
|
||||
}
|
||||
if (second !in incorrectNodes) {
|
||||
if (!checkTarget(trace, second, actualTargets)) {
|
||||
incorrectNodes += second
|
||||
}
|
||||
else if (!checkParent(trace, second, parentDescriptor)) {
|
||||
incorrectNodes += second
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public fun check(listOwner: JetModifierListOwner, trace: BindingTrace, descriptor: DeclarationDescriptor?) {
|
||||
if (listOwner is JetFunction) {
|
||||
for (parameter in listOwner.valueParameters) {
|
||||
if (!parameter.hasValOrVar()) {
|
||||
check(parameter, trace, null)
|
||||
}
|
||||
}
|
||||
}
|
||||
val actualTargets = AnnotationChecker.getActualTargetList(listOwner, descriptor as? ClassDescriptor)
|
||||
val list = listOwner.modifierList ?: return
|
||||
checkModifierList(list, trace, descriptor?.containingDeclaration, actualTargets)
|
||||
}
|
||||
}
|
||||
@@ -269,10 +269,8 @@ public class TypeResolver(
|
||||
return argumentElements.mapIndexed { i, argumentElement ->
|
||||
|
||||
val projectionKind = argumentElement.getProjectionKind()
|
||||
modifiersChecker.withTrace(c.trace).checkIncompatibleVarianceModifiers(argumentElement.getModifierList())
|
||||
ModifierCheckerCore.check(argumentElement, c.trace, null)
|
||||
if (projectionKind == JetProjectionKind.STAR) {
|
||||
modifiersChecker.withTrace(c.trace).reportIllegalModifiers(argumentElement.getModifierList(), listOf(JetTokens.IN_KEYWORD, JetTokens.OUT_KEYWORD))
|
||||
|
||||
val parameters = constructor.getParameters()
|
||||
if (parameters.size() > i) {
|
||||
val parameterDescriptor = parameters[i]
|
||||
|
||||
@@ -126,7 +126,7 @@ public class CandidateResolver(
|
||||
for (projection in jetTypeArguments) {
|
||||
if (projection.getProjectionKind() != JetProjectionKind.NONE) {
|
||||
trace.report(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT.on(projection))
|
||||
modifiersChecker.withTrace(trace).checkIncompatibleVarianceModifiers(projection.getModifierList())
|
||||
ModifierCheckerCore.check(projection, trace, null)
|
||||
}
|
||||
val type = argumentTypeResolver.resolveTypeRefWithDefault(
|
||||
projection.getTypeReference(), scope, trace,
|
||||
|
||||
+1
-5
@@ -381,12 +381,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private JetClassLikeInfo getCompanionObjectInfo(@Nullable JetObjectDeclaration companionObject) {
|
||||
private static JetClassLikeInfo getCompanionObjectInfo(@Nullable JetObjectDeclaration companionObject) {
|
||||
if (companionObject != null) {
|
||||
if (!isCompanionObjectAllowed()) {
|
||||
c.getTrace().report(COMPANION_OBJECT_NOT_ALLOWED.on(companionObject));
|
||||
}
|
||||
|
||||
return JetClassInfoUtil.createClassLikeInfo(companionObject);
|
||||
}
|
||||
|
||||
|
||||
+2
-5
@@ -26,10 +26,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||
import org.jetbrains.kotlin.descriptors.*;
|
||||
import org.jetbrains.kotlin.diagnostics.Errors;
|
||||
import org.jetbrains.kotlin.psi.*;
|
||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||
import org.jetbrains.kotlin.resolve.BindingContextUtils;
|
||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
|
||||
import org.jetbrains.kotlin.resolve.ModifiersChecker;
|
||||
import org.jetbrains.kotlin.resolve.*;
|
||||
import org.jetbrains.kotlin.resolve.calls.model.MutableDataFlowInfoForArguments;
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
||||
@@ -474,7 +471,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
|
||||
if (catchParameter != null) {
|
||||
ModifiersChecker.ModifiersCheckingProcedure modifiersChecking = components.modifiersChecker.withTrace(context.trace);
|
||||
modifiersChecking.checkParameterHasNoValOrVar(catchParameter, VAL_OR_VAR_ON_CATCH_PARAMETER);
|
||||
modifiersChecking.checkParameterHasNoModifier(catchParameter);
|
||||
ModifierCheckerCore.INSTANCE$.check(catchParameter, context.trace, null);
|
||||
|
||||
VariableDescriptor variableDescriptor = components.descriptorResolver.resolveLocalVariableDescriptor(
|
||||
context.scope, catchParameter, context.trace);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.kt:6:14: error: cannot weaken access privilege 'public' for 'c' in 'A'
|
||||
override protected private val c: Int
|
||||
^
|
||||
compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.kt:6:14: error: incompatible modifiers: 'private protected'
|
||||
compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.kt:6:14: error: modifier 'protected' is incompatible with 'private'
|
||||
override protected private val c: Int
|
||||
^
|
||||
compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.kt:6:24: error: incompatible modifiers: 'private protected'
|
||||
compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.kt:6:24: error: modifier 'private' is incompatible with 'protected'
|
||||
override protected private val c: Int
|
||||
^
|
||||
COMPILATION_ERROR
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
open interface First {
|
||||
interface First {
|
||||
public open fun foo() : Int
|
||||
}
|
||||
|
||||
open interface Second : First {
|
||||
interface Second : First {
|
||||
public open fun bar() : Int
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fun box(): String {
|
||||
open interface L1 {
|
||||
interface L1 {
|
||||
fun foo(): String
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ public class Output(val d: Data) : Closeable {
|
||||
public fun doOutput(data: Int): Int = data
|
||||
}
|
||||
|
||||
public open interface Closeable {
|
||||
public interface Closeable {
|
||||
open public fun close() {}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ public class Output(val d: Data) : Closeable {
|
||||
public fun doOutput(data: Int): Int = data
|
||||
}
|
||||
|
||||
public open interface Closeable {
|
||||
public interface Closeable {
|
||||
open public fun close() {}
|
||||
}
|
||||
|
||||
|
||||
+19
-19
@@ -3,44 +3,44 @@ package MyPackage
|
||||
//properties
|
||||
<!MUST_BE_INITIALIZED!>val a: Int<!>
|
||||
val a1: Int = 1
|
||||
<!MUST_BE_INITIALIZED!><!ILLEGAL_MODIFIER!>abstract<!> val a2: Int<!>
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> val a3: Int = 1
|
||||
<!MUST_BE_INITIALIZED!><!WRONG_MODIFIER_TARGET!>abstract<!> val a2: Int<!>
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> val a3: Int = 1
|
||||
|
||||
<!MUST_BE_INITIALIZED!>var b: Int<!> private set
|
||||
var b1: Int = 0; private set
|
||||
<!MUST_BE_INITIALIZED!><!ILLEGAL_MODIFIER!>abstract<!> var b2: Int<!> private set
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> var b3: Int = 0; private set
|
||||
<!MUST_BE_INITIALIZED!><!WRONG_MODIFIER_TARGET!>abstract<!> var b2: Int<!> private set
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> var b3: Int = 0; private set
|
||||
|
||||
<!MUST_BE_INITIALIZED!>var c: Int<!> set(v: Int) { $c = v }
|
||||
var c1: Int = 0; set(v: Int) { $c1 = v }
|
||||
<!MUST_BE_INITIALIZED!><!ILLEGAL_MODIFIER!>abstract<!> var c2: Int<!> set(v: Int) { $c2 = v }
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> var c3: Int = 0; set(v: Int) { $c3 = v }
|
||||
<!MUST_BE_INITIALIZED!><!WRONG_MODIFIER_TARGET!>abstract<!> var c2: Int<!> set(v: Int) { $c2 = v }
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> var c3: Int = 0; set(v: Int) { $c3 = v }
|
||||
|
||||
val e: Int get() = a
|
||||
val e1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = a
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> val e2: Int get() = a
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> val e3: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = a
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> val e2: Int get() = a
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> val e3: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = a
|
||||
|
||||
//methods
|
||||
<!NON_MEMBER_FUNCTION_NO_BODY!>fun f()<!>
|
||||
fun g() {}
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> fun h()
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> fun j() {}
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> fun h()
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> fun j() {}
|
||||
|
||||
//property accessors
|
||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var j: Int get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
<!MUST_BE_INITIALIZED!>var k: Int<!> <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var k1: Int = 0; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
<!MUST_BE_INITIALIZED!>var k: Int<!> <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var k1: Int = 0; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var l: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var n: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set(v: Int) {}
|
||||
var n: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set(v: Int) {}
|
||||
|
||||
// FILE: c.kt
|
||||
//creating an instance
|
||||
|
||||
@@ -29,17 +29,17 @@ abstract class MyAbstractClass() {
|
||||
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||
|
||||
//property accessors
|
||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var j: Int get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j1: Int get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var j1: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var k1: Int = 0; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var k1: Int = 0; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var l: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var n: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set(v: Int) {}
|
||||
var n: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set(v: Int) {}
|
||||
}
|
||||
+9
-9
@@ -29,17 +29,17 @@ class MyClass() {
|
||||
<!ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||
|
||||
//property accessors
|
||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var j: Int get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var k1: Int = 0; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var k1: Int = 0; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var l: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var n: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set(v: Int) {}
|
||||
var n: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set(v: Int) {}
|
||||
}
|
||||
+9
-9
@@ -29,17 +29,17 @@ interface MyTrait {
|
||||
<!ABSTRACT_MODIFIER_IN_TRAIT, ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||
|
||||
//property accessors
|
||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var j: Int get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var k: Int <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var k1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var k: Int <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var k1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var l: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var n: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set(v: Int) {}
|
||||
var n: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set(v: Int) {}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ annotation class Annotation4() <!ANNOTATION_CLASS_WITH_BODY!>{
|
||||
}<!>
|
||||
|
||||
annotation class Annotation5() <!ANNOTATION_CLASS_WITH_BODY!>{
|
||||
companion object {}
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {}
|
||||
}<!>
|
||||
|
||||
annotation class Annotation6() <!ANNOTATION_CLASS_WITH_BODY!>{
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
class A {
|
||||
<!WRONG_ANNOTATION_TARGET!>ann<!> init {}
|
||||
<!WRONG_ANNOTATION_TARGET!>@ann<!> init {}
|
||||
<!UNRESOLVED_REFERENCE, WRONG_ANNOTATION_TARGET!>aaa<!> init {}
|
||||
<!UNRESOLVED_REFERENCE, WRONG_ANNOTATION_TARGET!>@aaa<!> init {}
|
||||
<!WRONG_ANNOTATION_TARGET, UNRESOLVED_REFERENCE!>aaa<!> init {}
|
||||
<!WRONG_ANNOTATION_TARGET, UNRESOLVED_REFERENCE!>@aaa<!> init {}
|
||||
}
|
||||
|
||||
interface T {
|
||||
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!WRONG_ANNOTATION_TARGET!>ann<!> init {}<!>
|
||||
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!WRONG_ANNOTATION_TARGET!>@ann<!> init {}<!>
|
||||
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!UNRESOLVED_REFERENCE, WRONG_ANNOTATION_TARGET!>aaa<!> init {}<!>
|
||||
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!UNRESOLVED_REFERENCE, WRONG_ANNOTATION_TARGET!>@aaa<!> init {}<!>
|
||||
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!WRONG_ANNOTATION_TARGET, UNRESOLVED_REFERENCE!>aaa<!> init {}<!>
|
||||
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!WRONG_ANNOTATION_TARGET, UNRESOLVED_REFERENCE!>@aaa<!> init {}<!>
|
||||
}
|
||||
|
||||
annotation class ann
|
||||
@@ -26,7 +26,7 @@ class B() {
|
||||
}
|
||||
|
||||
object b {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {
|
||||
val x = 1
|
||||
} // error
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
class A {
|
||||
inner class B {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object { }
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object { }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
fun test() {
|
||||
class A {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {}
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {}
|
||||
}
|
||||
|
||||
object {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {}
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {}
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -1,17 +1,17 @@
|
||||
class A {
|
||||
inner class I {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object A
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object A
|
||||
|
||||
<!MANY_COMPANION_OBJECTS, COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object B
|
||||
<!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object B
|
||||
|
||||
<!MANY_COMPANION_OBJECTS, COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object C
|
||||
<!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object C
|
||||
}
|
||||
}
|
||||
|
||||
object O {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object A
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object A
|
||||
|
||||
<!MANY_COMPANION_OBJECTS, COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object B
|
||||
<!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object B
|
||||
|
||||
<!MANY_COMPANION_OBJECTS, COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object C
|
||||
<!MANY_COMPANION_OBJECTS, WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object C
|
||||
}
|
||||
+2
-2
@@ -90,7 +90,7 @@ class Foo {
|
||||
|
||||
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>private val packagePrivateProperty<!> = object : MyClass(), MyTrait {}
|
||||
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> val packageProtectedProperty<!> = object : MyClass(), MyTrait {}
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!WRONG_MODIFIER_TARGET!>protected<!> val packageProtectedProperty<!> = object : MyClass(), MyTrait {}
|
||||
|
||||
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val packageInternalProperty<!> = object : MyClass(), MyTrait {}
|
||||
|
||||
@@ -98,7 +98,7 @@ class Foo {
|
||||
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val packagePublicProperty<!> = object : MyClass(), MyTrait {}
|
||||
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> fun packageProtectedFunction()<!> = object : MyClass(), MyTrait {}
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!WRONG_MODIFIER_TARGET!>protected<!> fun packageProtectedFunction()<!> = object : MyClass(), MyTrait {}
|
||||
|
||||
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun packageInternalFunction()<!> = object : MyClass(), MyTrait {}
|
||||
|
||||
|
||||
+12
-12
@@ -2,18 +2,18 @@
|
||||
|
||||
// KT-3464 Front-end shouldn't allow override modifier in class declaration
|
||||
|
||||
<!ILLEGAL_MODIFIER!>override<!> class A {
|
||||
<!ILLEGAL_MODIFIER!>override<!> companion object {}
|
||||
<!ILLEGAL_MODIFIER!>open<!> companion object {}
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> companion object {}
|
||||
<!ILLEGAL_MODIFIER!>final<!> companion object {}
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> class A {
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> companion object {}
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> companion object {}
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> companion object {}
|
||||
<!WRONG_MODIFIER_TARGET!>final<!> companion object {}
|
||||
}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>override<!> object B1 {}
|
||||
<!ILLEGAL_MODIFIER!>open<!> object B2 {}
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> object B3 {}
|
||||
<!ILLEGAL_MODIFIER!>final<!> object B4 {}
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> object B1 {}
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> object B2 {}
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> object B3 {}
|
||||
<!WRONG_MODIFIER_TARGET!>final<!> object B4 {}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>override<!> enum class C {}
|
||||
<!ILLEGAL_MODIFIER!>override<!> interface D {}
|
||||
<!ILLEGAL_MODIFIER!>override<!> annotation class E
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> enum class C {}
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> interface D {}
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> annotation class E
|
||||
+4
-4
@@ -5,8 +5,8 @@ class T {
|
||||
}
|
||||
|
||||
fun foo() {
|
||||
<!ILLEGAL_MODIFIER!>public<!> val <!UNUSED_VARIABLE!>i<!> = 11
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> val <!VARIABLE_WITH_NO_TYPE_NO_INITIALIZER, UNUSED_VARIABLE!>j<!>
|
||||
<!ILLEGAL_MODIFIER!>override<!> fun T.baz() = 2
|
||||
<!ILLEGAL_MODIFIER!>private<!> fun bar() = 2
|
||||
<!WRONG_MODIFIER_TARGET!>public<!> val <!UNUSED_VARIABLE!>i<!> = 11
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> val <!VARIABLE_WITH_NO_TYPE_NO_INITIALIZER, UNUSED_VARIABLE!>j<!>
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> fun T.baz() = 2
|
||||
<!WRONG_MODIFIER_TARGET!>private<!> fun bar() = 2
|
||||
}
|
||||
+2
-2
@@ -4,10 +4,10 @@ class T {
|
||||
fun baz() = 1
|
||||
}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>override<!> fun zzz() {}
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> fun zzz() {}
|
||||
|
||||
fun foo(t: T) {
|
||||
<!ILLEGAL_MODIFIER!>override<!> fun T.baz() = 2
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> fun T.baz() = 2
|
||||
|
||||
// was "Visibility is unknown yet exception"
|
||||
t.baz()
|
||||
|
||||
+5
-6
@@ -1,13 +1,12 @@
|
||||
package d
|
||||
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> val a : Int = 1
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> val a : Int = 1
|
||||
|
||||
<!ILLEGAL_MODIFIER!>override<!> val c : Int = 1
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> val c : Int = 1
|
||||
|
||||
<!ILLEGAL_MODIFIER!>final<!> fun foo() = 2
|
||||
<!WRONG_MODIFIER_TARGET!>final<!> fun foo() = 2
|
||||
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> fun baz() = 2
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> fun baz() = 2
|
||||
|
||||
class T {}
|
||||
<!ILLEGAL_MODIFIER!>override<!> fun T.bar() = 2
|
||||
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> fun T.bar() = 2
|
||||
Vendored
+2
-2
@@ -1,10 +1,10 @@
|
||||
package d
|
||||
|
||||
<!ILLEGAL_MODIFIER!>override<!> val f : ()-> Int = { 12 }
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> val f : ()-> Int = { 12 }
|
||||
|
||||
fun test() {
|
||||
f()
|
||||
}
|
||||
|
||||
var g: Int = 1
|
||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> set(i: Int) {}
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> set(i: Int) {}
|
||||
+2
-2
@@ -136,7 +136,7 @@ class Foo {
|
||||
|
||||
}
|
||||
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> val packageProtectedProperty<!> = object : MyClass() {}
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!WRONG_MODIFIER_TARGET!>protected<!> val packageProtectedProperty<!> = object : MyClass() {}
|
||||
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val packagePublicProperty<!> = object : MyClass() {}
|
||||
|
||||
@@ -164,7 +164,7 @@ fun testProperties() {
|
||||
|
||||
private fun privateFunction() = object : MyClass() {fun invisible() {}}
|
||||
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> fun protectedFunction()<!> = object : MyClass() {}
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!WRONG_MODIFIER_TARGET!>protected<!> fun protectedFunction()<!> = object : MyClass() {}
|
||||
|
||||
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public fun publicFunction()<!> = object : MyClass() {}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ interface T {}
|
||||
|
||||
class Br(t : T) : T by t {}
|
||||
|
||||
<!OPEN_MODIFIER_IN_ENUM!>open<!> enum class EN() {
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> enum class EN() {
|
||||
A
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
package abstract
|
||||
|
||||
<!ABSTRACT_MODIFIER_IN_ENUM!>abstract<!> enum class MyAbstractEnum() {}
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> enum class MyAbstractEnum() {}
|
||||
@@ -30,17 +30,17 @@ enum class MyEnum() {
|
||||
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||
|
||||
//property accessors
|
||||
var i: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var i: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var i1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var j: Int get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var k1: Int = 0; <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var k1: Int = 0; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var l: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
var l: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
var l1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
var n: Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set(v: Int) {}
|
||||
var n: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set(v: Int) {}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ enum class E {
|
||||
FIRST,
|
||||
|
||||
SECOND {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {
|
||||
fun foo() = 42
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
enum class B {}
|
||||
|
||||
class A {
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!> companion object {}
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!> companion object {}
|
||||
}
|
||||
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!> object O {}
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!> object O {}
|
||||
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!> interface T {}
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!> interface T {}
|
||||
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!> fun f() = 0
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!> fun f() = 0
|
||||
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!> val x = 0
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!> val x = 0
|
||||
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!> var y = 0
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!> var y = 0
|
||||
@@ -2,7 +2,7 @@
|
||||
public enum MyJavaEnum {}
|
||||
|
||||
// FILE: test.kt
|
||||
<!OPEN_MODIFIER_IN_ENUM!>open<!> enum class MyEnum() {
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> enum class MyEnum() {
|
||||
A()
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!> interface Some {
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!> interface Some {
|
||||
// Enum part
|
||||
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED, ENUM_ENTRY_USES_DEPRECATED_OR_NO_DELIMITER!>D<!>
|
||||
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
enum class E {
|
||||
<!ILLEGAL_MODIFIER!>public<!> <!ILLEGAL_MODIFIER!>final<!> SUBCLASS {
|
||||
<!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_MODIFIER_TARGET!>final<!> SUBCLASS {
|
||||
fun foo() {}
|
||||
},
|
||||
|
||||
<!ILLEGAL_MODIFIER!>public<!> PUBLIC,
|
||||
<!ILLEGAL_MODIFIER!>protected<!> PROTECTED,
|
||||
<!ILLEGAL_MODIFIER!>private<!> PRIVATE,
|
||||
<!ILLEGAL_MODIFIER!>internal<!> INTERNAL,
|
||||
<!WRONG_MODIFIER_TARGET!>public<!> PUBLIC,
|
||||
<!WRONG_MODIFIER_TARGET!>protected<!> PROTECTED,
|
||||
<!WRONG_MODIFIER_TARGET!>private<!> PRIVATE,
|
||||
<!WRONG_MODIFIER_TARGET!>internal<!> INTERNAL,
|
||||
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> ABSTRACT,
|
||||
<!ILLEGAL_MODIFIER!>open<!> OPEN,
|
||||
<!ILLEGAL_MODIFIER!>override<!> OVERRIDE,
|
||||
<!ILLEGAL_MODIFIER!>final<!> FINAL,
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> ABSTRACT,
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> OPEN,
|
||||
<!WRONG_MODIFIER_TARGET!>override<!> OVERRIDE,
|
||||
<!WRONG_MODIFIER_TARGET!>final<!> FINAL,
|
||||
|
||||
<!ILLEGAL_MODIFIER!>inner<!> INNER,
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> INNER,
|
||||
<!ENUM_ENTRY_USES_DEPRECATED_OR_NO_DELIMITER!>annotation<!> ANNOTATION,
|
||||
<!ILLEGAL_MODIFIER!>enum<!> ENUM,
|
||||
<!ILLEGAL_MODIFIER!>out<!> OUT,
|
||||
<!ILLEGAL_MODIFIER!>in<!> IN,
|
||||
<!ILLEGAL_MODIFIER!>vararg<!> VARARG,
|
||||
<!ILLEGAL_MODIFIER!>reified<!> REIFIED
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!> ENUM,
|
||||
<!WRONG_MODIFIER_TARGET!>out<!> OUT,
|
||||
<!WRONG_MODIFIER_TARGET!>in<!> IN,
|
||||
<!WRONG_MODIFIER_TARGET!>vararg<!> VARARG,
|
||||
<!WRONG_MODIFIER_TARGET!>reified<!> REIFIED
|
||||
}
|
||||
|
||||
@@ -39,8 +39,8 @@ abstract class Test() {
|
||||
abstract var v8 : Int get set
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var v9 : Int<!> set
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var v10 : Int<!> get
|
||||
abstract val v11 : Int <!ILLEGAL_MODIFIER!>abstract<!> get
|
||||
abstract var v12 : Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
||||
abstract val v11 : Int <!WRONG_MODIFIER_TARGET!>abstract<!> get
|
||||
abstract var v12 : Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ class A<T> {
|
||||
class B {
|
||||
fun test() {
|
||||
class C<W>() : P<W, <!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>T<!>> {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object : P<<!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>W<!>, <!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>T<!>> {
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object : P<<!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>W<!>, <!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>T<!>> {
|
||||
}
|
||||
|
||||
inner class D : P<W, <!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>T<!>>
|
||||
|
||||
+14
-14
@@ -1,21 +1,21 @@
|
||||
<!ILLEGAL_MODIFIER!>inner<!> fun foo() {}
|
||||
<!ILLEGAL_MODIFIER!>inner<!> val prop = 42
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> fun foo() {}
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> val prop = 42
|
||||
|
||||
<!ILLEGAL_MODIFIER!>inner<!> class A
|
||||
<!ILLEGAL_MODIFIER!>inner<!> interface B
|
||||
<!ILLEGAL_MODIFIER!>inner<!> object C
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> class A
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> interface B
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> object C
|
||||
|
||||
class D {
|
||||
inner class E
|
||||
<!ILLEGAL_MODIFIER!>inner<!> interface F
|
||||
<!ILLEGAL_MODIFIER!>inner<!> object G
|
||||
<!ILLEGAL_MODIFIER!>inner<!> enum class R
|
||||
<!ILLEGAL_MODIFIER!>inner<!> annotation class S
|
||||
<!ILLEGAL_MODIFIER!>inner<!> companion object
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> interface F
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> object G
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> enum class R
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> annotation class S
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> companion object
|
||||
}
|
||||
|
||||
enum class H {
|
||||
<!ILLEGAL_MODIFIER!>inner<!> I {
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> I {
|
||||
inner class II
|
||||
};
|
||||
|
||||
@@ -23,16 +23,16 @@ enum class H {
|
||||
}
|
||||
|
||||
interface K {
|
||||
<!INNER_CLASS_IN_TRAIT!>inner<!> class L
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> class L
|
||||
}
|
||||
|
||||
object N {
|
||||
<!INNER_CLASS_IN_OBJECT!>inner<!> class O
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> class O
|
||||
}
|
||||
|
||||
class P {
|
||||
companion object {
|
||||
<!INNER_CLASS_IN_OBJECT!>inner<!> class Q
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!> class Q
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<!UNRESOLVED_REFERENCE!>myAnnotation<!> <!ILLEGAL_MODIFIER!>public<!> package illegal_modifiers
|
||||
<!UNRESOLVED_REFERENCE!>myAnnotation<!> <!WRONG_MODIFIER_TARGET!>public<!> package illegal_modifiers
|
||||
|
||||
abstract class A() {
|
||||
<!INCOMPATIBLE_MODIFIERS!>abstract<!> <!INCOMPATIBLE_MODIFIERS!>final<!> fun f()
|
||||
@@ -7,17 +7,17 @@ abstract class A() {
|
||||
|
||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>open var r: String<!>
|
||||
get
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> protected set
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> protected set
|
||||
}
|
||||
|
||||
<!TRAIT_CAN_NOT_BE_FINAL!>final<!> interface T {}
|
||||
<!WRONG_MODIFIER_TARGET!>final<!> interface T {}
|
||||
|
||||
class FinalClass() {
|
||||
<!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> fun foo() {}
|
||||
val i: Int = 1
|
||||
<!ILLEGAL_MODIFIER!>open<!> get(): Int = $i
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> get(): Int = $i
|
||||
var j: Int = 1
|
||||
<!ILLEGAL_MODIFIER!>open<!> set(v: Int) {}
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> set(v: Int) {}
|
||||
}
|
||||
|
||||
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>public<!> class C
|
||||
@@ -31,104 +31,104 @@ class LegalModifier(val a: Int, annotated private var b: String, annotated varar
|
||||
|
||||
//Check illegal modifier in constructor parameters
|
||||
class IllegalModifiers1(
|
||||
<!ILLEGAL_MODIFIER!>in<!>
|
||||
<!ILLEGAL_MODIFIER!>out<!>
|
||||
<!ILLEGAL_MODIFIER!>reified<!>
|
||||
<!ILLEGAL_MODIFIER!>enum<!>
|
||||
<!ILLEGAL_MODIFIER!>private<!>
|
||||
<!WRONG_MODIFIER_TARGET!>in<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>out<!>
|
||||
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||
<!WRONG_MODIFIER_TARGET!>private<!>
|
||||
<!UNUSED_PARAMETER!>a<!>: Int)
|
||||
|
||||
//Check multiple illegal modifiers in constructor
|
||||
class IllegalModifiers2(<!ILLEGAL_MODIFIER!>private<!> <!ILLEGAL_MODIFIER!>abstract<!> <!UNUSED_PARAMETER!>a<!>: Int)
|
||||
class IllegalModifiers2(<!WRONG_MODIFIER_TARGET!>private<!> <!WRONG_MODIFIER_TARGET!>abstract<!> <!UNUSED_PARAMETER!>a<!>: Int)
|
||||
|
||||
|
||||
//Check annotations with illegal modifiers in constructor
|
||||
class IllegalModifiers3(annotated <!ILLEGAL_MODIFIER!>public<!> <!ILLEGAL_MODIFIER!>abstract<!> <!UNUSED_PARAMETER!>b<!>: String)
|
||||
class IllegalModifiers3(annotated <!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_MODIFIER_TARGET!>abstract<!> <!UNUSED_PARAMETER!>b<!>: String)
|
||||
|
||||
//Check annotations and vararg with illegal modifiers in constructor
|
||||
class IllegalModifiers4(val a: Int, annotated("a text") <!ILLEGAL_MODIFIER!>protected<!> vararg <!UNUSED_PARAMETER!>v<!>: Int)
|
||||
class IllegalModifiers4(val a: Int, annotated("a text") <!WRONG_MODIFIER_TARGET!>protected<!> vararg <!UNUSED_PARAMETER!>v<!>: Int)
|
||||
|
||||
//Check illegal modifiers for functions and catch block
|
||||
abstract class IllegalModifiers5() {
|
||||
|
||||
//Check illegal modifier in function parameter
|
||||
abstract fun foo(<!ILLEGAL_MODIFIER!>public<!> a: Int, vararg v: String)
|
||||
abstract fun foo(<!WRONG_MODIFIER_TARGET!>public<!> a: Int, vararg v: String)
|
||||
|
||||
//Check multiple illegal modifiers in function parameter
|
||||
abstract fun bar(<!ILLEGAL_MODIFIER!>public<!> <!ILLEGAL_MODIFIER!>abstract<!> a: Int, vararg v: String)
|
||||
abstract fun bar(<!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_MODIFIER_TARGET!>abstract<!> a: Int, vararg v: String)
|
||||
|
||||
//Check annotations with illegal modifiers
|
||||
abstract fun baz(annotated("a text") <!ILLEGAL_MODIFIER!>public<!> <!ILLEGAL_MODIFIER!>abstract<!> a: Int)
|
||||
abstract fun baz(annotated("a text") <!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_MODIFIER_TARGET!>abstract<!> a: Int)
|
||||
|
||||
private fun qux() {
|
||||
|
||||
//Check illegal modifier in catch block
|
||||
try {} catch (<!ILLEGAL_MODIFIER!>in<!> <!ILLEGAL_MODIFIER!>out<!> <!ILLEGAL_MODIFIER!>reified<!> <!ILLEGAL_MODIFIER!>enum<!> <!ILLEGAL_MODIFIER!>public<!> e: Exception) {}
|
||||
try {} catch (<!WRONG_MODIFIER_TARGET!>in<!> <!INCOMPATIBLE_MODIFIERS!>out<!> <!WRONG_MODIFIER_TARGET!>reified<!> <!WRONG_MODIFIER_TARGET!>enum<!> <!WRONG_MODIFIER_TARGET!>public<!> e: Exception) {}
|
||||
|
||||
//Check multiple illegal modifiers in catch block
|
||||
try {} catch (<!ILLEGAL_MODIFIER!>in<!> <!ILLEGAL_MODIFIER!>out<!> <!ILLEGAL_MODIFIER!>reified<!> <!ILLEGAL_MODIFIER!>enum<!> <!ILLEGAL_MODIFIER!>abstract<!> <!ILLEGAL_MODIFIER!>public<!> e: Exception) {}
|
||||
try {} catch (<!WRONG_MODIFIER_TARGET!>in<!> <!INCOMPATIBLE_MODIFIERS!>out<!> <!WRONG_MODIFIER_TARGET!>reified<!> <!WRONG_MODIFIER_TARGET!>enum<!> <!WRONG_MODIFIER_TARGET!>abstract<!> <!WRONG_MODIFIER_TARGET!>public<!> e: Exception) {}
|
||||
|
||||
//Check annotations with illegal modifiers
|
||||
try {} catch (annotated("a text") <!ILLEGAL_MODIFIER!>abstract<!> <!ILLEGAL_MODIFIER!>public<!> e: Exception) {}
|
||||
try {} catch (annotated("a text") <!WRONG_MODIFIER_TARGET!>abstract<!> <!WRONG_MODIFIER_TARGET!>public<!> e: Exception) {}
|
||||
}
|
||||
}
|
||||
|
||||
//Check illegal modifiers on anonymous initializers
|
||||
abstract class IllegalModifiers6() {
|
||||
<!ILLEGAL_MODIFIER!>public<!> init {}
|
||||
<!ILLEGAL_MODIFIER!>private<!> init {}
|
||||
<!ILLEGAL_MODIFIER!>protected<!> init {}
|
||||
<!ILLEGAL_MODIFIER!>vararg<!> init {}
|
||||
<!ILLEGAL_MODIFIER!>abstract<!> init {}
|
||||
<!ILLEGAL_MODIFIER!>open<!> init {}
|
||||
<!ILLEGAL_MODIFIER!>final<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>public<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>private<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>protected<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>vararg<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>final<!> init {}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>public<!> <!WRONG_ANNOTATION_TARGET!>annotated<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_ANNOTATION_TARGET!>annotated<!> init {}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>private<!> <!NOT_AN_ANNOTATION_CLASS, WRONG_ANNOTATION_TARGET!>IllegalModifiers6()<!> init {}
|
||||
<!WRONG_MODIFIER_TARGET!>private<!> <!WRONG_ANNOTATION_TARGET, NOT_AN_ANNOTATION_CLASS!>IllegalModifiers6()<!> init {}
|
||||
}
|
||||
|
||||
// strange inappropriate modifiers usages
|
||||
<!ILLEGAL_MODIFIER!>override<!>
|
||||
<!ILLEGAL_MODIFIER!>out<!>
|
||||
<!ILLEGAL_MODIFIER!>in<!>
|
||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
||||
<!ILLEGAL_MODIFIER!>reified<!>
|
||||
<!WRONG_MODIFIER_TARGET!>override<!>
|
||||
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||
class IllegalModifiers7() {
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!>
|
||||
<!ILLEGAL_MODIFIER!>inner<!>
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!>
|
||||
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
||||
<!ILLEGAL_MODIFIER!>out<!>
|
||||
<!ILLEGAL_MODIFIER!>in<!>
|
||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
||||
<!ILLEGAL_MODIFIER!>reified<!>
|
||||
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||
val x = 1
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!>
|
||||
<!ILLEGAL_MODIFIER!>inner<!>
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!>
|
||||
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
||||
<!ILLEGAL_MODIFIER!>out<!>
|
||||
<!ILLEGAL_MODIFIER!>in<!>
|
||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
||||
<!ILLEGAL_MODIFIER!>reified<!>
|
||||
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||
fun foo() {}
|
||||
}
|
||||
|
||||
// Secondary constructors
|
||||
class IllegalModifiers8 {
|
||||
<!ILLEGAL_MODIFIER, INCOMPATIBLE_MODIFIERS!>abstract<!>
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!>
|
||||
<!ILLEGAL_MODIFIER, REDUNDANT_MODIFIER, REDUNDANT_MODIFIER, INCOMPATIBLE_MODIFIERS!>open<!>
|
||||
<!ILLEGAL_MODIFIER!>inner<!>
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!>
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||
<!REDUNDANT_MODIFIER!>open<!>
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!>
|
||||
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
||||
<!ILLEGAL_MODIFIER!>override<!>
|
||||
<!ILLEGAL_MODIFIER!>out<!>
|
||||
<!ILLEGAL_MODIFIER!>in<!>
|
||||
<!ILLEGAL_MODIFIER, INCOMPATIBLE_MODIFIERS!>final<!>
|
||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
||||
<!ILLEGAL_MODIFIER!>reified<!>
|
||||
<!WRONG_MODIFIER_TARGET!>override<!>
|
||||
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>final<!>
|
||||
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||
constructor() {}
|
||||
|
||||
constructor(<!ILLEGAL_MODIFIER!>private<!> <!ILLEGAL_MODIFIER!>enum<!> <!ILLEGAL_MODIFIER!>abstract<!> <!UNUSED_PARAMETER!>x<!>: Int) {}
|
||||
constructor(<!WRONG_MODIFIER_TARGET!>private<!> <!WRONG_MODIFIER_TARGET!>enum<!> <!WRONG_MODIFIER_TARGET!>abstract<!> <!UNUSED_PARAMETER!>x<!>: Int) {}
|
||||
}
|
||||
|
||||
class IllegalModifiers9 {
|
||||
@@ -139,16 +139,16 @@ class IllegalModifiers9 {
|
||||
// Illegal modifiers on primary constructor
|
||||
|
||||
class IllegalModifiers10
|
||||
<!ILLEGAL_MODIFIER, INCOMPATIBLE_MODIFIERS!>abstract<!>
|
||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!>
|
||||
<!ILLEGAL_MODIFIER, REDUNDANT_MODIFIER, REDUNDANT_MODIFIER, INCOMPATIBLE_MODIFIERS!>open<!>
|
||||
<!ILLEGAL_MODIFIER!>inner<!>
|
||||
<!WRONG_MODIFIER_TARGET!>abstract<!>
|
||||
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||
<!REDUNDANT_MODIFIER!>open<!>
|
||||
<!WRONG_MODIFIER_TARGET!>inner<!>
|
||||
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
||||
<!ILLEGAL_MODIFIER!>override<!>
|
||||
<!ILLEGAL_MODIFIER!>out<!>
|
||||
<!ILLEGAL_MODIFIER!>in<!>
|
||||
<!ILLEGAL_MODIFIER, INCOMPATIBLE_MODIFIERS!>final<!>
|
||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
||||
<!ILLEGAL_MODIFIER!>reified<!> constructor()
|
||||
<!WRONG_MODIFIER_TARGET!>override<!>
|
||||
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||
<!INCOMPATIBLE_MODIFIERS!>final<!>
|
||||
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||
<!WRONG_MODIFIER_TARGET!>reified<!> constructor()
|
||||
|
||||
class IllegalModifiers11 <!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>protected<!> constructor()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<!ILLEGAL_MODIFIER!>companion<!> class A {
|
||||
<!WRONG_MODIFIER_TARGET!>companion<!> class A {
|
||||
companion object {
|
||||
|
||||
}
|
||||
@@ -18,38 +18,38 @@ class C {
|
||||
|
||||
class D {
|
||||
companion object A {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>companion<!> object G {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object G {
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object
|
||||
}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>companion<!> interface H {
|
||||
<!WRONG_MODIFIER_TARGET!>companion<!> interface H {
|
||||
companion object
|
||||
}
|
||||
|
||||
class J {
|
||||
companion object C {
|
||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object
|
||||
}
|
||||
}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>companion<!> enum class Enum {
|
||||
<!WRONG_MODIFIER_TARGET!>companion<!> enum class Enum {
|
||||
E1,
|
||||
E2;
|
||||
|
||||
companion object
|
||||
}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>companion<!> fun main() {
|
||||
<!WRONG_MODIFIER_TARGET!>companion<!> fun main() {
|
||||
|
||||
}
|
||||
|
||||
<!ILLEGAL_MODIFIER!>companion<!> var prop: Int = 1
|
||||
<!ILLEGAL_MODIFIER!>companion<!> get
|
||||
<!ILLEGAL_MODIFIER!>companion<!> set
|
||||
<!WRONG_MODIFIER_TARGET!>companion<!> var prop: Int = 1
|
||||
<!WRONG_MODIFIER_TARGET!>companion<!> get
|
||||
<!WRONG_MODIFIER_TARGET!>companion<!> set
|
||||
|
||||
class Z(<!ILLEGAL_MODIFIER!>companion<!> val c: Int)
|
||||
class Z(<!WRONG_MODIFIER_TARGET!>companion<!> val c: Int)
|
||||
+6
-6
@@ -2,22 +2,22 @@
|
||||
|
||||
interface Foo<T>
|
||||
interface Foo1<<!INCOMPATIBLE_MODIFIERS!>in<!> <!INCOMPATIBLE_MODIFIERS!>out<!> T>
|
||||
interface Foo2<<!REPEATED_MODIFIER!>in<!> <!REPEATED_MODIFIER!>in<!> T>
|
||||
interface Foo2<in <!REPEATED_MODIFIER!>in<!> T>
|
||||
|
||||
fun test1(foo: Foo<<!INCOMPATIBLE_MODIFIERS!>in<!> <!INCOMPATIBLE_MODIFIERS!>out<!> Int>) = foo
|
||||
fun test2(): Foo<<!REPEATED_MODIFIER!>in<!> <!REPEATED_MODIFIER!>in<!> Int> = throw Exception()
|
||||
fun test2(): Foo<in <!REPEATED_MODIFIER!>in<!> Int> = throw Exception()
|
||||
|
||||
fun test3() {
|
||||
val f: Foo<<!REPEATED_MODIFIER!>out<!> <!REPEATED_MODIFIER!>out<!> <!REPEATED_MODIFIER!>out<!> <!REPEATED_MODIFIER!>out<!> Int>
|
||||
val f: Foo<out <!REPEATED_MODIFIER!>out<!> <!REPEATED_MODIFIER!>out<!> <!REPEATED_MODIFIER!>out<!> Int>
|
||||
|
||||
class Bzz<<!REPEATED_MODIFIER!>in<!> <!REPEATED_MODIFIER!>in<!> T>
|
||||
class Bzz<in <!REPEATED_MODIFIER!>in<!> T>
|
||||
}
|
||||
|
||||
class A {
|
||||
fun <<!VARIANCE_ON_TYPE_PARAMETER_OF_FUNCTION_OR_PROPERTY, REPEATED_MODIFIER!>out<!> <!REPEATED_MODIFIER!>out<!> T> bar() {
|
||||
fun <<!VARIANCE_ON_TYPE_PARAMETER_OF_FUNCTION_OR_PROPERTY!>out<!> <!REPEATED_MODIFIER!>out<!> T> bar() {
|
||||
}
|
||||
}
|
||||
|
||||
fun test4(a: A) {
|
||||
a.bar<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, REPEATED_MODIFIER!>out<!> <!REPEATED_MODIFIER!>out<!> Int>()
|
||||
a.bar<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>out<!> <!REPEATED_MODIFIER!>out<!> Int>()
|
||||
}
|
||||
|
||||
@@ -1,41 +1,41 @@
|
||||
<!REPEATED_MODIFIER!>abstract<!> <!REPEATED_MODIFIER!>abstract<!> class Foo
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> class Bar
|
||||
<!REPEATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>open<!> <!REPEATED_MODIFIER!>open<!> <!INCOMPATIBLE_MODIFIERS!>final<!> class Baz {
|
||||
<!REPEATED_MODIFIER!>private<!> <!REPEATED_MODIFIER!>private<!> fun foo() {}
|
||||
abstract <!REPEATED_MODIFIER!>abstract<!> class Foo
|
||||
public <!REPEATED_MODIFIER!>public<!> class Bar
|
||||
<!INCOMPATIBLE_MODIFIERS!>open<!> <!REPEATED_MODIFIER!>open<!> <!INCOMPATIBLE_MODIFIERS!>final<!> class Baz {
|
||||
private <!REPEATED_MODIFIER!>private<!> fun foo() {}
|
||||
}
|
||||
|
||||
class Bzz(<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val q: Int = 1) {
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val x: Int = 2
|
||||
class Bzz(public <!REPEATED_MODIFIER!>public<!> val q: Int = 1) {
|
||||
public <!REPEATED_MODIFIER!>public<!> val x: Int = 2
|
||||
|
||||
public val y: Int
|
||||
<!REPEATED_MODIFIER, REDUNDANT_MODIFIER_IN_GETTER!>public<!> <!REPEATED_MODIFIER!>public<!> get() = 3
|
||||
<!REDUNDANT_MODIFIER_IN_GETTER!>public<!> <!REPEATED_MODIFIER!>public<!> get() = 3
|
||||
|
||||
val z: Int
|
||||
<!INCOMPATIBLE_MODIFIERS, ILLEGAL_MODIFIER!>open<!> <!INCOMPATIBLE_MODIFIERS, ILLEGAL_MODIFIER!>final<!> get() = 4
|
||||
<!WRONG_MODIFIER_TARGET!>open<!> <!INCOMPATIBLE_MODIFIERS!>final<!> get() = 4
|
||||
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> class B(<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val z: Int = 1) {
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val y: Int = 2
|
||||
public <!REPEATED_MODIFIER!>public<!> class B(public <!REPEATED_MODIFIER!>public<!> val z: Int = 1) {
|
||||
public <!REPEATED_MODIFIER!>public<!> val y: Int = 2
|
||||
|
||||
public val x: Int
|
||||
<!REPEATED_MODIFIER, REDUNDANT_MODIFIER_IN_GETTER!>public<!> <!REPEATED_MODIFIER!>public<!> get() = 3
|
||||
<!REDUNDANT_MODIFIER_IN_GETTER!>public<!> <!REPEATED_MODIFIER!>public<!> get() = 3
|
||||
}
|
||||
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> object C {
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val y: Int = 1
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> fun z(): Int = 1
|
||||
public <!REPEATED_MODIFIER!>public<!> object C {
|
||||
public <!REPEATED_MODIFIER!>public<!> val y: Int = 1
|
||||
public <!REPEATED_MODIFIER!>public<!> fun z(): Int = 1
|
||||
}
|
||||
}
|
||||
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val bar: Int = 1
|
||||
public <!REPEATED_MODIFIER!>public<!> val bar: Int = 1
|
||||
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> fun foo(): Int = 1
|
||||
public <!REPEATED_MODIFIER!>public<!> fun foo(): Int = 1
|
||||
|
||||
fun test() {
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> class B(<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val z: Int = 1) {
|
||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val y: Int = 2
|
||||
public <!REPEATED_MODIFIER!>public<!> class B(public <!REPEATED_MODIFIER!>public<!> val z: Int = 1) {
|
||||
public <!REPEATED_MODIFIER!>public<!> val y: Int = 2
|
||||
|
||||
public val x: Int
|
||||
<!REPEATED_MODIFIER, REDUNDANT_MODIFIER_IN_GETTER!>public<!> <!REPEATED_MODIFIER!>public<!> get() = 3
|
||||
<!REDUNDANT_MODIFIER_IN_GETTER!>public<!> <!REPEATED_MODIFIER!>public<!> get() = 3
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
//FILE:a.kt
|
||||
package test_visibility
|
||||
|
||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> class ProtectedClass
|
||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> interface ProtectedTrait
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> class ProtectedClass
|
||||
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> interface ProtectedTrait
|
||||
|
||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> val protected_val : Int = 4
|
||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> fun protected_fun() {}
|
||||
<!WRONG_MODIFIER_TARGET!>protected<!> val protected_val : Int = 4
|
||||
<!WRONG_MODIFIER_TARGET!>protected<!> fun protected_fun() {}
|
||||
|
||||
private val private_val : Int = 4
|
||||
private fun private_fun() {}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
<!SEALED_MODIFIER_IN_ENUM!>sealed<!> enum class SealedEnum {
|
||||
<!WRONG_MODIFIER_TARGET!>sealed<!> enum class SealedEnum {
|
||||
FIRST,
|
||||
SECOND;
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<!FINAL_MODIFIER_IN_SEALED!>final<!> sealed class Base {
|
||||
<!INCOMPATIBLE_MODIFIERS!>final<!> <!INCOMPATIBLE_MODIFIERS!>sealed<!> class Base {
|
||||
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
<!TRAIT_CAN_NOT_BE_SEALED!>sealed<!> interface Base {
|
||||
<!WRONG_MODIFIER_TARGET!>sealed<!> interface Base {
|
||||
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<!ILLEGAL_MODIFIER!>sealed<!> object Sealed {
|
||||
<!WRONG_MODIFIER_TARGET!>sealed<!> object Sealed {
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
<!OPEN_MODIFIER_IN_SEALED!>open<!> sealed class Base {
|
||||
<!INCOMPATIBLE_MODIFIERS!>open<!> <!INCOMPATIBLE_MODIFIERS!>sealed<!> class Base {
|
||||
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
<!ABSTRACT_MODIFIER_IN_SEALED!>abstract<!> sealed class Base {
|
||||
<!REDUNDANT_MODIFIER!>abstract<!> sealed class Base {
|
||||
|
||||
}
|
||||
+1
-1
@@ -3,5 +3,5 @@ class A {
|
||||
constructor(
|
||||
<!VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER!>val<!> x: Int, y: Int,
|
||||
<!VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER!>var<!> z: Int,
|
||||
<!ILLEGAL_MODIFIER!>public<!> a: Int)
|
||||
<!WRONG_MODIFIER_TARGET!>public<!> a: Int)
|
||||
}
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
import java.util.ArrayList
|
||||
|
||||
abstract class J {
|
||||
public abstract fun <T : Collection<S>, S : List<<!ILLEGAL_MODIFIER!>in<!> *>> foo(x: T)
|
||||
public abstract fun <T : Collection<S>, S : List<<!WRONG_MODIFIER_TARGET!>in<!> *>> foo(x: T)
|
||||
fun bar() {
|
||||
val s = ArrayList<ArrayList<Int>>()
|
||||
foo(s)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import java.util.ArrayList
|
||||
|
||||
abstract class J {
|
||||
public abstract fun <T : Collection<S>, S : List<<!ILLEGAL_MODIFIER!>out<!> *>> foo(x: T)
|
||||
public abstract fun <T : Collection<S>, S : List<<!WRONG_MODIFIER_TARGET!>out<!> *>> foo(x: T)
|
||||
fun bar() {
|
||||
val s = ArrayList<ArrayList<Int>>()
|
||||
foo(s)
|
||||
|
||||
@@ -16,26 +16,52 @@
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.annotations
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import java.util.*
|
||||
import kotlin.annotation
|
||||
|
||||
// NOTE: this enum must have the same entries with kotlin.annotation.AnnotationTarget
|
||||
// NOTE: this enum must have the same entries with kotlin.annotation.AnnotationTarget,
|
||||
// and may also have some additional entries
|
||||
public enum class KotlinTarget(val description: String, val isDefault: Boolean = true) {
|
||||
PACKAGE("package"),
|
||||
CLASSIFIER("classifier"),
|
||||
CLASSIFIER("classifier"), // includes CLASS, OBJECT, INTERFACE, *_CLASS but not ENUM_ENTRY
|
||||
ANNOTATION_CLASS("annotation class"),
|
||||
TYPE_PARAMETER("type parameter", false),
|
||||
PROPERTY("property"),
|
||||
PROPERTY("property"), // includes *_PROPERTY, PROPERTY_PARAMETER, ENUM_ENTRY
|
||||
FIELD("field"),
|
||||
LOCAL_VARIABLE("local variable"),
|
||||
VALUE_PARAMETER("value parameter"),
|
||||
CONSTRUCTOR("constructor"),
|
||||
FUNCTION("function"),
|
||||
FUNCTION("function"), // includes *_FUNCTION
|
||||
PROPERTY_GETTER("getter"),
|
||||
PROPERTY_SETTER("setter"),
|
||||
TYPE("type usage", false),
|
||||
EXPRESSION("expression", false),
|
||||
FILE("file", false);
|
||||
FILE("file", false),
|
||||
|
||||
TYPE_PROJECTION("type projection", false),
|
||||
STAR_PROJECTION("star projection", false),
|
||||
PROPERTY_PARAMETER("property constructor parameter", false),
|
||||
|
||||
CLASS("class", false),
|
||||
OBJECT("object", false),
|
||||
INTERFACE("interface", false),
|
||||
ENUM_CLASS("enum class", false),
|
||||
ENUM_ENTRY("enum entry", false),
|
||||
|
||||
INNER_CLASS("inner class", false),
|
||||
LOCAL_CLASS("local class", false),
|
||||
|
||||
LOCAL_FUNCTION("local function", false),
|
||||
MEMBER_FUNCTION("member function", false),
|
||||
TOP_LEVEL_FUNCTION("top level function", false),
|
||||
|
||||
MEMBER_PROPERTY("member property", false), // includes PROPERTY_PARAMETER
|
||||
TOP_LEVEL_PROPERTY("top level property", false),
|
||||
|
||||
INITIALIZER("initializer", false)
|
||||
;
|
||||
|
||||
companion object {
|
||||
|
||||
@@ -53,5 +79,21 @@ public enum class KotlinTarget(val description: String, val isDefault: Boolean =
|
||||
|
||||
public val ALL_TARGET_SET: Set<KotlinTarget> = values().toSet()
|
||||
|
||||
public fun classActualTargets(descriptor: ClassDescriptor): List<KotlinTarget> = when (descriptor.kind) {
|
||||
ClassKind.ANNOTATION_CLASS -> listOf(ANNOTATION_CLASS, CLASSIFIER)
|
||||
ClassKind.CLASS -> if (descriptor.isInner) {
|
||||
listOf(INNER_CLASS, CLASSIFIER)
|
||||
}
|
||||
else if (DescriptorUtils.isLocal(descriptor)) {
|
||||
listOf(LOCAL_CLASS, CLASSIFIER)
|
||||
}
|
||||
else {
|
||||
listOf(CLASS, CLASSIFIER)
|
||||
}
|
||||
ClassKind.OBJECT -> listOf(OBJECT, CLASSIFIER)
|
||||
ClassKind.INTERFACE -> listOf(INTERFACE, CLASSIFIER)
|
||||
ClassKind.ENUM_CLASS -> listOf(ENUM_CLASS, CLASSIFIER)
|
||||
ClassKind.ENUM_ENTRY -> listOf(ENUM_ENTRY, PROPERTY, FIELD)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -115,6 +115,8 @@ public class QuickFixRegistrar : QuickFixContributor {
|
||||
GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory)
|
||||
REDUNDANT_MODIFIER_IN_GETTER.registerFactory(removeRedundantModifierFactory)
|
||||
ILLEGAL_MODIFIER.registerFactory(removeModifierFactory)
|
||||
WRONG_MODIFIER_TARGET.registerFactory(removeModifierFactory)
|
||||
WRONG_MODIFIER_CONTAINING_DECLARATION.registerFactory(removeModifierFactory)
|
||||
REPEATED_MODIFIER.registerFactory(removeModifierFactory)
|
||||
|
||||
val removeInnerModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerFactory(INNER_KEYWORD)
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ class B() {
|
||||
}
|
||||
|
||||
object b {
|
||||
<error descr="[COMPANION_OBJECT_NOT_ALLOWED] A companion object is not allowed here">companion</error> object {
|
||||
<error descr="[WRONG_MODIFIER_CONTAINING_DECLARATION] Modifier 'companion' is not applicable inside 'object'">companion</error> object {
|
||||
val x = 1
|
||||
}
|
||||
// error
|
||||
|
||||
+4
-4
@@ -1,15 +1,15 @@
|
||||
import kotlin.platform.platformStatic
|
||||
|
||||
<error descr="[WRONG_ANNOTATION_TARGET] This annotation is not applicable to target 'classifier'">platformStatic</error>
|
||||
<error descr="[WRONG_ANNOTATION_TARGET] This annotation is not applicable to target 'class'">platformStatic</error>
|
||||
class A {
|
||||
<error descr="[WRONG_ANNOTATION_TARGET] This annotation is not applicable to target 'classifier'">platformStatic</error>
|
||||
<error descr="[WRONG_ANNOTATION_TARGET] This annotation is not applicable to target 'object'">platformStatic</error>
|
||||
companion object {
|
||||
platformStatic fun a1() {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
<error descr="[WRONG_ANNOTATION_TARGET] This annotation is not applicable to target 'classifier'">platformStatic</error>
|
||||
<error descr="[WRONG_ANNOTATION_TARGET] This annotation is not applicable to target 'object'">platformStatic</error>
|
||||
object A {
|
||||
platformStatic fun a2() {
|
||||
|
||||
@@ -29,7 +29,7 @@ class A {
|
||||
}
|
||||
}
|
||||
|
||||
<error descr="[WRONG_ANNOTATION_TARGET] This annotation is not applicable to target 'classifier'">platformStatic</error>
|
||||
<error descr="[WRONG_ANNOTATION_TARGET] This annotation is not applicable to target 'interface'">platformStatic</error>
|
||||
interface B {
|
||||
companion object {
|
||||
<error descr="[PLATFORM_STATIC_NOT_IN_OBJECT] Only functions in named objects and companion objects of classes can be annotated with 'platformStatic'">platformStatic fun a1()</error> {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// ERROR: Body is not allowed for annotation class
|
||||
// ERROR: Modifier 'companion' is not applicable inside 'annotation class'
|
||||
annotation class Anon(public val value: String) {
|
||||
|
||||
public enum class E {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
// This test was adapted from compiler/testData/codegen/box/classes
|
||||
package foo
|
||||
|
||||
open trait First {
|
||||
interface First {
|
||||
public open fun foo(): Int
|
||||
}
|
||||
|
||||
open trait Second : First {
|
||||
interface Second : First {
|
||||
public open fun bar(): Int
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ public class Output(val d: Data) : Closeable {
|
||||
public fun doOutput(data: Int): Int = data
|
||||
}
|
||||
|
||||
public open trait Closeable {
|
||||
public interface Closeable {
|
||||
open public fun close() {}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ public class Output(val d: Data) : Closeable {
|
||||
public fun doOutput(data: Int): Int = data
|
||||
}
|
||||
|
||||
public open trait Closeable {
|
||||
public interface Closeable {
|
||||
open public fun close() {}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user