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
|
// 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> ILLEGAL_MODIFIER = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory1<PsiElement, JetModifierKeywordToken> REPEATED_MODIFIER = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<PsiElement, JetModifierKeywordToken> REPEATED_MODIFIER = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory2<PsiElement, JetModifierKeywordToken, JetModifierKeywordToken> REDUNDANT_MODIFIER = DiagnosticFactory2.create(WARNING);
|
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);
|
DiagnosticFactory0<PsiElement> INAPPLICABLE_PLATFORM_NAME = DiagnosticFactory0.create(ERROR);
|
||||||
DiagnosticFactory1<JetAnnotationEntry, String> WRONG_ANNOTATION_TARGET = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<JetAnnotationEntry, String> WRONG_ANNOTATION_TARGET = DiagnosticFactory1.create(ERROR);
|
||||||
DiagnosticFactory0<JetAnnotationEntry> REPEATED_ANNOTATION = DiagnosticFactory0.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(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(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>>() {
|
MAP.put(INCOMPATIBLE_MODIFIERS, "Modifier ''{0}'' is incompatible with ''{1}''", TO_STRING, TO_STRING);
|
||||||
@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(ILLEGAL_MODIFIER, "Illegal modifier ''{0}''", TO_STRING);
|
MAP.put(ILLEGAL_MODIFIER, "Illegal modifier ''{0}''", TO_STRING);
|
||||||
MAP.put(REPEATED_MODIFIER, "Repeated ''{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(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(WRONG_ANNOTATION_TARGET, "This annotation is not applicable to target ''{0}''", TO_STRING);
|
||||||
MAP.put(REPEATED_ANNOTATION, "This annotation is not repeatable");
|
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.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getAnnotationEntries
|
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.types.TypeUtils
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isRepeatableAnnotation
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isRepeatableAnnotation
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.*
|
||||||
|
|
||||||
public object AnnotationChecker {
|
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) {
|
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"))
|
trace.report(Errors.WRONG_ANNOTATION_TARGET.on(entry, actualTargets.firstOrNull()?.description ?: "unidentified target"))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getActualTargetList(annotated: JetAnnotated, descriptor: ClassDescriptor?): List<KotlinTarget> {
|
public fun getActualTargetList(annotated: JetElement, descriptor: ClassDescriptor?): List<KotlinTarget> {
|
||||||
if (annotated is JetClassOrObject) {
|
return when (annotated) {
|
||||||
if (annotated is JetEnumEntry) return listOf(KotlinTarget.PROPERTY, KotlinTarget.FIELD)
|
is JetClassOrObject -> descriptor?.let { KotlinTarget.classActualTargets(it) } ?: listOf(CLASSIFIER)
|
||||||
return if (descriptor?.kind == ClassKind.ANNOTATION_CLASS) {
|
is JetProperty ->
|
||||||
listOf(KotlinTarget.ANNOTATION_CLASS, KotlinTarget.CLASSIFIER)
|
if (annotated.isLocal) {
|
||||||
}
|
listOf(LOCAL_VARIABLE)
|
||||||
else {
|
}
|
||||||
listOf(KotlinTarget.CLASSIFIER)
|
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) {
|
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();
|
JetModifierList modifierList = owner.getModifierList();
|
||||||
if (modifierList == null) return;
|
if (modifierList == null) return;
|
||||||
|
|
||||||
annotationResolver.resolveAnnotationsWithArguments(scope, modifierList, trace);
|
annotationResolver.resolveAnnotationsWithArguments(scope, modifierList, trace);
|
||||||
|
|
||||||
modifiersChecker.withTrace(trace).reportIllegalModifiers(modifierList, Arrays.asList(JetTokens.MODIFIER_KEYWORDS_ARRAY));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resolvePrimaryConstructorParameters(@NotNull BodiesResolveContext c) {
|
private void resolvePrimaryConstructorParameters(@NotNull BodiesResolveContext c) {
|
||||||
|
|||||||
@@ -114,17 +114,9 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void checkConstructorDeclaration(ConstructorDescriptor constructorDescriptor, JetDeclaration declaration) {
|
private void checkConstructorDeclaration(ConstructorDescriptor constructorDescriptor, JetDeclaration declaration) {
|
||||||
modifiersChecker.reportIllegalModalityModifiers(declaration);
|
|
||||||
reportErrorIfHasIllegalModifier(declaration);
|
|
||||||
modifiersChecker.checkModifiersForDeclaration(declaration, constructorDescriptor);
|
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) {
|
private void checkModifiersAndAnnotationsInPackageDirective(JetFile file) {
|
||||||
JetPackageDirective packageDirective = file.getPackageDirective();
|
JetPackageDirective packageDirective = file.getPackageDirective();
|
||||||
if (packageDirective == null) return;
|
if (packageDirective == null) return;
|
||||||
@@ -142,8 +134,7 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
AnnotationChecker.INSTANCE$.check(packageDirective, trace, null);
|
AnnotationChecker.INSTANCE$.check(packageDirective, trace, null);
|
||||||
|
ModifierCheckerCore.INSTANCE$.check(packageDirective, trace, null);
|
||||||
modifiersChecker.reportIllegalModifiers(modifierList, Arrays.asList(JetTokens.MODIFIER_KEYWORDS_ARRAY));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkTypesInClassHeader(@NotNull JetClassOrObject classOrObject) {
|
private void checkTypesInClassHeader(@NotNull JetClassOrObject classOrObject) {
|
||||||
@@ -228,8 +219,8 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkObject(JetObjectDeclaration declaration, ClassDescriptor classDescriptor) {
|
private void checkObject(JetObjectDeclaration declaration, ClassDescriptor classDescriptor) {
|
||||||
reportErrorIfHasIllegalModifier(declaration);
|
|
||||||
if (declaration.isLocal() && !declaration.isCompanion() && !declaration.isObjectLiteral()) {
|
if (declaration.isLocal() && !declaration.isCompanion() && !declaration.isObjectLiteral()) {
|
||||||
trace.report(LOCAL_OBJECT_NOT_ALLOWED.on(declaration, classDescriptor));
|
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()));
|
trace.report(Errors.DEPRECATED_TRAIT_KEYWORD.on(traitKeyword.getPsi()));
|
||||||
}
|
}
|
||||||
|
|
||||||
checkTraitModifiers(aClass);
|
|
||||||
checkConstructorInTrait(aClass);
|
checkConstructorInTrait(aClass);
|
||||||
}
|
}
|
||||||
else if (aClass.isEnum()) {
|
else if (aClass.isEnum()) {
|
||||||
checkEnumModifiers(aClass);
|
|
||||||
if (aClass.isLocal()) {
|
if (aClass.isLocal()) {
|
||||||
trace.report(LOCAL_ENUM_NOT_ALLOWED.on(aClass, classDescriptor));
|
trace.report(LOCAL_ENUM_NOT_ALLOWED.on(aClass, classDescriptor));
|
||||||
}
|
}
|
||||||
@@ -263,9 +252,6 @@ public class DeclarationsChecker {
|
|||||||
checkAnnotationClassWithBody(aClass);
|
checkAnnotationClassWithBody(aClass);
|
||||||
checkValOnAnnotationParameter(aClass);
|
checkValOnAnnotationParameter(aClass);
|
||||||
}
|
}
|
||||||
else if (aClass.hasModifier(JetTokens.SEALED_KEYWORD)) {
|
|
||||||
checkSealedModifiers(aClass);
|
|
||||||
}
|
|
||||||
else if (aClass instanceof JetEnumEntry) {
|
else if (aClass instanceof JetEnumEntry) {
|
||||||
checkEnumEntry((JetEnumEntry) aClass, classDescriptor);
|
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) {
|
private void checkAnnotationClassWithBody(JetClassOrObject classOrObject) {
|
||||||
if (classOrObject.getBody() != null) {
|
if (classOrObject.getBody() != null) {
|
||||||
trace.report(ANNOTATION_CLASS_WITH_BODY.on(classOrObject.getBody()));
|
trace.report(ANNOTATION_CLASS_WITH_BODY.on(classOrObject.getBody()));
|
||||||
@@ -359,14 +327,10 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor) {
|
private void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor) {
|
||||||
reportErrorIfHasIllegalModifier(property);
|
|
||||||
DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration();
|
DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration();
|
||||||
if (containingDeclaration instanceof ClassDescriptor) {
|
if (containingDeclaration instanceof ClassDescriptor) {
|
||||||
checkPropertyAbstractness(property, propertyDescriptor, (ClassDescriptor) containingDeclaration);
|
checkPropertyAbstractness(property, propertyDescriptor, (ClassDescriptor) containingDeclaration);
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
modifiersChecker.reportIllegalModalityModifiers(property);
|
|
||||||
}
|
|
||||||
checkPropertyInitializer(property, propertyDescriptor);
|
checkPropertyInitializer(property, propertyDescriptor);
|
||||||
checkAccessors(property, propertyDescriptor);
|
checkAccessors(property, propertyDescriptor);
|
||||||
checkDeclaredTypeInPublicMember(property, propertyDescriptor);
|
checkDeclaredTypeInPublicMember(property, propertyDescriptor);
|
||||||
@@ -490,7 +454,6 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void checkFunction(JetNamedFunction function, SimpleFunctionDescriptor functionDescriptor) {
|
protected void checkFunction(JetNamedFunction function, SimpleFunctionDescriptor functionDescriptor) {
|
||||||
reportErrorIfHasIllegalModifier(function);
|
|
||||||
DeclarationDescriptor containingDescriptor = functionDescriptor.getContainingDeclaration();
|
DeclarationDescriptor containingDescriptor = functionDescriptor.getContainingDeclaration();
|
||||||
boolean hasAbstractModifier = function.hasModifier(JetTokens.ABSTRACT_KEYWORD);
|
boolean hasAbstractModifier = function.hasModifier(JetTokens.ABSTRACT_KEYWORD);
|
||||||
checkDeclaredTypeInPublicMember(function, functionDescriptor);
|
checkDeclaredTypeInPublicMember(function, functionDescriptor);
|
||||||
@@ -515,7 +478,6 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
modifiersChecker.reportIllegalModalityModifiers(function);
|
|
||||||
if (!function.hasBody() && !hasAbstractModifier) {
|
if (!function.hasBody() && !hasAbstractModifier) {
|
||||||
trace.report(NON_MEMBER_FUNCTION_NO_BODY.on(function, functionDescriptor));
|
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();
|
PropertyAccessorDescriptor propertyAccessorDescriptor = accessor.isGetter() ? propertyDescriptor.getGetter() : propertyDescriptor.getSetter();
|
||||||
assert propertyAccessorDescriptor != null : "No property accessor descriptor for " + property.getText();
|
assert propertyAccessorDescriptor != null : "No property accessor descriptor for " + property.getText();
|
||||||
modifiersChecker.checkModifiersForDeclaration(accessor, propertyAccessorDescriptor);
|
modifiersChecker.checkModifiersForDeclaration(accessor, propertyAccessorDescriptor);
|
||||||
modifiersChecker.reportIllegalModalityModifiers(accessor);
|
|
||||||
}
|
}
|
||||||
JetPropertyAccessor getter = property.getGetter();
|
JetPropertyAccessor getter = property.getGetter();
|
||||||
PropertyGetterDescriptor getterDescriptor = propertyDescriptor.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
|
// Temporary
|
||||||
// Returns true if deprecated constructor is in use, like
|
// Returns true if deprecated constructor is in use, like
|
||||||
// ENTRY: Enum(arguments) instead of
|
// ENTRY: Enum(arguments) instead of
|
||||||
|
|||||||
@@ -344,12 +344,8 @@ class FunctionDescriptorResolver(
|
|||||||
valueParameter,
|
valueParameter,
|
||||||
if (isConstructor) VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER else VAL_OR_VAR_ON_FUN_PARAMETER
|
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,
|
val valueParameterDescriptor = descriptorResolver.resolveValueParameterDescriptor(parameterScope, functionDescriptor,
|
||||||
valueParameter, i, type, trace)
|
valueParameter, i, type, trace)
|
||||||
@@ -358,11 +354,4 @@ class FunctionDescriptorResolver(
|
|||||||
}
|
}
|
||||||
return result
|
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.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.intellij.lang.ASTNode;
|
import com.intellij.lang.ASTNode;
|
||||||
import com.intellij.openapi.util.Pair;
|
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1;
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory1;
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors;
|
|
||||||
import org.jetbrains.kotlin.lexer.JetKeywordToken;
|
import org.jetbrains.kotlin.lexer.JetKeywordToken;
|
||||||
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken;
|
import org.jetbrains.kotlin.lexer.JetModifierKeywordToken;
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens;
|
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.diagnostics.Errors.*;
|
||||||
import static org.jetbrains.kotlin.lexer.JetTokens.*;
|
import static org.jetbrains.kotlin.lexer.JetTokens.*;
|
||||||
import static org.jetbrains.kotlin.psi.JetStubbedPsiUtil.getContainingDeclaration;
|
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 {
|
public class ModifiersChecker {
|
||||||
private static final Collection<JetModifierKeywordToken> MODALITY_MODIFIERS =
|
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) {
|
public void checkModifiersForDeclaration(@NotNull JetDeclaration modifierListOwner, @NotNull MemberDescriptor descriptor) {
|
||||||
if (modifierListOwner instanceof JetEnumEntry) {
|
checkNestedClassAllowed(modifierListOwner, descriptor);
|
||||||
reportIllegalModifiers(modifierListOwner.getModifierList(), Arrays.asList(MODIFIER_KEYWORDS_ARRAY));
|
ModifierCheckerCore.INSTANCE$.check(modifierListOwner, trace, descriptor);
|
||||||
}
|
checkTypeParametersModifiers(modifierListOwner);
|
||||||
else {
|
|
||||||
checkInnerModifier(modifierListOwner, descriptor);
|
|
||||||
checkCompanionModifier(modifierListOwner);
|
|
||||||
checkModalityModifiers(modifierListOwner);
|
|
||||||
checkVisibilityModifiers(modifierListOwner, descriptor);
|
|
||||||
checkVarianceModifiers(modifierListOwner);
|
|
||||||
checkVarargsModifiers(modifierListOwner, descriptor);
|
|
||||||
}
|
|
||||||
checkPlatformNameApplicability(descriptor);
|
checkPlatformNameApplicability(descriptor);
|
||||||
runDeclarationCheckers(modifierListOwner, descriptor);
|
runDeclarationCheckers(modifierListOwner, descriptor);
|
||||||
AnnotationChecker.INSTANCE$.check(modifierListOwner, trace,
|
ClassDescriptor classDescriptor = descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null;
|
||||||
descriptor instanceof ClassDescriptor ? (ClassDescriptor) descriptor : null);
|
AnnotationChecker.INSTANCE$.check(modifierListOwner, trace, classDescriptor);
|
||||||
}
|
|
||||||
|
|
||||||
private void checkVarargsModifiers(@NotNull JetDeclaration owner, @NotNull MemberDescriptor descriptor) {
|
|
||||||
if (!(owner instanceof JetParameter)) {
|
|
||||||
reportIllegalModifiers(owner.getModifierList(), Collections.singleton(VARARG_KEYWORD));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkModifiersForLocalDeclaration(
|
public void checkModifiersForLocalDeclaration(
|
||||||
@NotNull JetDeclaration modifierListOwner,
|
@NotNull JetDeclaration modifierListOwner,
|
||||||
@NotNull DeclarationDescriptor descriptor
|
@NotNull DeclarationDescriptor descriptor
|
||||||
) {
|
) {
|
||||||
reportIllegalModalityModifiers(modifierListOwner);
|
|
||||||
reportIllegalVisibilityModifiers(modifierListOwner);
|
|
||||||
checkPlatformNameApplicability(descriptor);
|
checkPlatformNameApplicability(descriptor);
|
||||||
runDeclarationCheckers(modifierListOwner, descriptor);
|
runDeclarationCheckers(modifierListOwner, descriptor);
|
||||||
AnnotationChecker.INSTANCE$.check(modifierListOwner, trace,
|
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) {
|
private void checkNestedClassAllowed(@NotNull JetModifierListOwner modifierListOwner, @NotNull DeclarationDescriptor descriptor) {
|
||||||
reportIllegalModifiers(modifierListOwner, MODALITY_MODIFIERS);
|
if (modifierListOwner.hasModifier(INNER_KEYWORD)) return;
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (modifierListOwner instanceof JetClass && !(modifierListOwner instanceof JetEnumEntry)) {
|
if (modifierListOwner instanceof JetClass && !(modifierListOwner instanceof JetEnumEntry)) {
|
||||||
JetClass aClass = (JetClass) modifierListOwner;
|
JetClass aClass = (JetClass) modifierListOwner;
|
||||||
boolean localEnumError = aClass.isLocal() && aClass.isEnum();
|
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) {
|
private void checkPlatformNameApplicability(@NotNull DeclarationDescriptor descriptor) {
|
||||||
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(new FqName("kotlin.platform.platformName"));
|
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(new FqName("kotlin.platform.platformName"));
|
||||||
if (annotation == null) return;
|
if (annotation == null) return;
|
||||||
@@ -411,28 +255,6 @@ public class ModifiersChecker {
|
|||||||
return containingDescriptor instanceof PackageFragmentDescriptor || containingDescriptor instanceof ClassDescriptor;
|
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
|
@NotNull
|
||||||
public Map<JetModifierKeywordToken, ASTNode> getNodesCorrespondingToModifiers(
|
public Map<JetModifierKeywordToken, ASTNode> getNodesCorrespondingToModifiers(
|
||||||
@NotNull JetModifierList modifierList,
|
@NotNull JetModifierList modifierList,
|
||||||
@@ -454,21 +276,13 @@ public class ModifiersChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkVarianceModifiers(@NotNull JetModifierListOwner modifierListOwner) {
|
public void checkTypeParametersModifiers(@NotNull JetModifierListOwner modifierListOwner) {
|
||||||
reportIllegalModifiers(modifierListOwner.getModifierList(), Arrays.asList(IN_KEYWORD, OUT_KEYWORD, REIFIED_KEYWORD));
|
|
||||||
if (!(modifierListOwner instanceof JetTypeParameterListOwner)) return;
|
if (!(modifierListOwner instanceof JetTypeParameterListOwner)) return;
|
||||||
List<JetTypeParameter> typeParameters = ((JetTypeParameterListOwner) modifierListOwner).getTypeParameters();
|
List<JetTypeParameter> typeParameters = ((JetTypeParameterListOwner) modifierListOwner).getTypeParameters();
|
||||||
for (JetTypeParameter typeParameter : typeParameters) {
|
for (JetTypeParameter typeParameter : typeParameters) {
|
||||||
JetModifierList modifierList = typeParameter.getModifierList();
|
ModifierCheckerCore.INSTANCE$.check(typeParameter, trace, null);
|
||||||
checkIncompatibleVarianceModifiers(modifierList);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkParameterHasNoModifier(
|
|
||||||
@NotNull JetParameter parameter
|
|
||||||
) {
|
|
||||||
reportIllegalModifiers(parameter.getModifierList(), MODIFIERS_ILLEGAL_ON_PARAMETERS);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@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 ->
|
return argumentElements.mapIndexed { i, argumentElement ->
|
||||||
|
|
||||||
val projectionKind = argumentElement.getProjectionKind()
|
val projectionKind = argumentElement.getProjectionKind()
|
||||||
modifiersChecker.withTrace(c.trace).checkIncompatibleVarianceModifiers(argumentElement.getModifierList())
|
ModifierCheckerCore.check(argumentElement, c.trace, null)
|
||||||
if (projectionKind == JetProjectionKind.STAR) {
|
if (projectionKind == JetProjectionKind.STAR) {
|
||||||
modifiersChecker.withTrace(c.trace).reportIllegalModifiers(argumentElement.getModifierList(), listOf(JetTokens.IN_KEYWORD, JetTokens.OUT_KEYWORD))
|
|
||||||
|
|
||||||
val parameters = constructor.getParameters()
|
val parameters = constructor.getParameters()
|
||||||
if (parameters.size() > i) {
|
if (parameters.size() > i) {
|
||||||
val parameterDescriptor = parameters[i]
|
val parameterDescriptor = parameters[i]
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ public class CandidateResolver(
|
|||||||
for (projection in jetTypeArguments) {
|
for (projection in jetTypeArguments) {
|
||||||
if (projection.getProjectionKind() != JetProjectionKind.NONE) {
|
if (projection.getProjectionKind() != JetProjectionKind.NONE) {
|
||||||
trace.report(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT.on(projection))
|
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(
|
val type = argumentTypeResolver.resolveTypeRefWithDefault(
|
||||||
projection.getTypeReference(), scope, trace,
|
projection.getTypeReference(), scope, trace,
|
||||||
|
|||||||
+1
-5
@@ -381,12 +381,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private JetClassLikeInfo getCompanionObjectInfo(@Nullable JetObjectDeclaration companionObject) {
|
private static JetClassLikeInfo getCompanionObjectInfo(@Nullable JetObjectDeclaration companionObject) {
|
||||||
if (companionObject != null) {
|
if (companionObject != null) {
|
||||||
if (!isCompanionObjectAllowed()) {
|
|
||||||
c.getTrace().report(COMPANION_OBJECT_NOT_ALLOWED.on(companionObject));
|
|
||||||
}
|
|
||||||
|
|
||||||
return JetClassInfoUtil.createClassLikeInfo(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.descriptors.*;
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors;
|
import org.jetbrains.kotlin.diagnostics.Errors;
|
||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
import org.jetbrains.kotlin.resolve.*;
|
||||||
import org.jetbrains.kotlin.resolve.BindingContextUtils;
|
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
|
|
||||||
import org.jetbrains.kotlin.resolve.ModifiersChecker;
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.MutableDataFlowInfoForArguments;
|
import org.jetbrains.kotlin.resolve.calls.model.MutableDataFlowInfoForArguments;
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo;
|
||||||
@@ -474,7 +471,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
if (catchParameter != null) {
|
if (catchParameter != null) {
|
||||||
ModifiersChecker.ModifiersCheckingProcedure modifiersChecking = components.modifiersChecker.withTrace(context.trace);
|
ModifiersChecker.ModifiersCheckingProcedure modifiersChecking = components.modifiersChecker.withTrace(context.trace);
|
||||||
modifiersChecking.checkParameterHasNoValOrVar(catchParameter, VAL_OR_VAR_ON_CATCH_PARAMETER);
|
modifiersChecking.checkParameterHasNoValOrVar(catchParameter, VAL_OR_VAR_ON_CATCH_PARAMETER);
|
||||||
modifiersChecking.checkParameterHasNoModifier(catchParameter);
|
ModifierCheckerCore.INSTANCE$.check(catchParameter, context.trace, null);
|
||||||
|
|
||||||
VariableDescriptor variableDescriptor = components.descriptorResolver.resolveLocalVariableDescriptor(
|
VariableDescriptor variableDescriptor = components.descriptorResolver.resolveLocalVariableDescriptor(
|
||||||
context.scope, catchParameter, context.trace);
|
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'
|
compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.kt:6:14: error: cannot weaken access privilege 'public' for 'c' in 'A'
|
||||||
override protected private val c: Int
|
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
|
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
|
override protected private val c: Int
|
||||||
^
|
^
|
||||||
COMPILATION_ERROR
|
COMPILATION_ERROR
|
||||||
|
|||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
open interface First {
|
interface First {
|
||||||
public open fun foo() : Int
|
public open fun foo() : Int
|
||||||
}
|
}
|
||||||
|
|
||||||
open interface Second : First {
|
interface Second : First {
|
||||||
public open fun bar() : Int
|
public open fun bar() : Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
fun box(): String {
|
fun box(): String {
|
||||||
open interface L1 {
|
interface L1 {
|
||||||
fun foo(): String
|
fun foo(): String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@ public class Output(val d: Data) : Closeable {
|
|||||||
public fun doOutput(data: Int): Int = data
|
public fun doOutput(data: Int): Int = data
|
||||||
}
|
}
|
||||||
|
|
||||||
public open interface Closeable {
|
public interface Closeable {
|
||||||
open public fun close() {}
|
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 fun doOutput(data: Int): Int = data
|
||||||
}
|
}
|
||||||
|
|
||||||
public open interface Closeable {
|
public interface Closeable {
|
||||||
open public fun close() {}
|
open public fun close() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
-19
@@ -3,44 +3,44 @@ package MyPackage
|
|||||||
//properties
|
//properties
|
||||||
<!MUST_BE_INITIALIZED!>val a: Int<!>
|
<!MUST_BE_INITIALIZED!>val a: Int<!>
|
||||||
val a1: Int = 1
|
val a1: Int = 1
|
||||||
<!MUST_BE_INITIALIZED!><!ILLEGAL_MODIFIER!>abstract<!> val a2: Int<!>
|
<!MUST_BE_INITIALIZED!><!WRONG_MODIFIER_TARGET!>abstract<!> val a2: Int<!>
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> val a3: Int = 1
|
<!WRONG_MODIFIER_TARGET!>abstract<!> val a3: Int = 1
|
||||||
|
|
||||||
<!MUST_BE_INITIALIZED!>var b: Int<!> private set
|
<!MUST_BE_INITIALIZED!>var b: Int<!> private set
|
||||||
var b1: Int = 0; private set
|
var b1: Int = 0; private set
|
||||||
<!MUST_BE_INITIALIZED!><!ILLEGAL_MODIFIER!>abstract<!> var b2: Int<!> private set
|
<!MUST_BE_INITIALIZED!><!WRONG_MODIFIER_TARGET!>abstract<!> var b2: Int<!> private set
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> var b3: Int = 0; private set
|
<!WRONG_MODIFIER_TARGET!>abstract<!> var b3: Int = 0; private set
|
||||||
|
|
||||||
<!MUST_BE_INITIALIZED!>var c: Int<!> set(v: Int) { $c = v }
|
<!MUST_BE_INITIALIZED!>var c: Int<!> set(v: Int) { $c = v }
|
||||||
var c1: Int = 0; set(v: Int) { $c1 = v }
|
var c1: Int = 0; set(v: Int) { $c1 = v }
|
||||||
<!MUST_BE_INITIALIZED!><!ILLEGAL_MODIFIER!>abstract<!> var c2: Int<!> set(v: Int) { $c2 = v }
|
<!MUST_BE_INITIALIZED!><!WRONG_MODIFIER_TARGET!>abstract<!> var c2: Int<!> set(v: Int) { $c2 = v }
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> var c3: Int = 0; set(v: Int) { $c3 = v }
|
<!WRONG_MODIFIER_TARGET!>abstract<!> var c3: Int = 0; set(v: Int) { $c3 = v }
|
||||||
|
|
||||||
val e: Int get() = a
|
val e: Int get() = a
|
||||||
val e1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = a
|
val e1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = a
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> val e2: Int get() = a
|
<!WRONG_MODIFIER_TARGET!>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 e3: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = a
|
||||||
|
|
||||||
//methods
|
//methods
|
||||||
<!NON_MEMBER_FUNCTION_NO_BODY!>fun f()<!>
|
<!NON_MEMBER_FUNCTION_NO_BODY!>fun f()<!>
|
||||||
fun g() {}
|
fun g() {}
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> fun h()
|
<!WRONG_MODIFIER_TARGET!>abstract<!> fun h()
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> fun j() {}
|
<!WRONG_MODIFIER_TARGET!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
var i: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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 j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!ILLEGAL_MODIFIER!>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
|
<!MUST_BE_INITIALIZED!>var k: Int<!> <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var k1: Int = 0; <!ILLEGAL_MODIFIER!>abstract<!> set
|
var k1: Int = 0; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
|
|
||||||
var l: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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
|
// FILE: c.kt
|
||||||
//creating an instance
|
//creating an instance
|
||||||
|
|||||||
@@ -29,17 +29,17 @@ abstract class MyAbstractClass() {
|
|||||||
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
var i: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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 j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var j1: Int get() = i; <!ILLEGAL_MODIFIER!>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
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var k1: Int = 0; <!ILLEGAL_MODIFIER!>abstract<!> set
|
var k1: Int = 0; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
|
|
||||||
var l: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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() {}
|
<!ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS, ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
var i: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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 j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!ILLEGAL_MODIFIER!>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
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var k1: Int = 0; <!ILLEGAL_MODIFIER!>abstract<!> set
|
var k1: Int = 0; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
|
|
||||||
var l: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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() {}
|
<!ABSTRACT_MODIFIER_IN_TRAIT, ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
var i: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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 j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var j1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; get() = i; <!ILLEGAL_MODIFIER!>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 k: Int <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var k1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; <!ILLEGAL_MODIFIER!>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 l: Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var l1: Int = <!PROPERTY_INITIALIZER_IN_TRAIT!>0<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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!>{
|
annotation class Annotation5() <!ANNOTATION_CLASS_WITH_BODY!>{
|
||||||
companion object {}
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {}
|
||||||
}<!>
|
}<!>
|
||||||
|
|
||||||
annotation class Annotation6() <!ANNOTATION_CLASS_WITH_BODY!>{
|
annotation class Annotation6() <!ANNOTATION_CLASS_WITH_BODY!>{
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
class A {
|
class A {
|
||||||
<!WRONG_ANNOTATION_TARGET!>ann<!> init {}
|
<!WRONG_ANNOTATION_TARGET!>ann<!> init {}
|
||||||
<!WRONG_ANNOTATION_TARGET!>@ann<!> init {}
|
<!WRONG_ANNOTATION_TARGET!>@ann<!> init {}
|
||||||
<!UNRESOLVED_REFERENCE, WRONG_ANNOTATION_TARGET!>aaa<!> init {}
|
<!WRONG_ANNOTATION_TARGET, UNRESOLVED_REFERENCE!>aaa<!> init {}
|
||||||
<!UNRESOLVED_REFERENCE, WRONG_ANNOTATION_TARGET!>@aaa<!> init {}
|
<!WRONG_ANNOTATION_TARGET, UNRESOLVED_REFERENCE!>@aaa<!> init {}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface T {
|
interface T {
|
||||||
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!WRONG_ANNOTATION_TARGET!>ann<!> init {}<!>
|
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!WRONG_ANNOTATION_TARGET!>ann<!> init {}<!>
|
||||||
<!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!><!WRONG_ANNOTATION_TARGET, UNRESOLVED_REFERENCE!>aaa<!> init {}<!>
|
||||||
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!UNRESOLVED_REFERENCE, WRONG_ANNOTATION_TARGET!>@aaa<!> init {}<!>
|
<!ANONYMOUS_INITIALIZER_IN_TRAIT!><!WRONG_ANNOTATION_TARGET, UNRESOLVED_REFERENCE!>@aaa<!> init {}<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
annotation class ann
|
annotation class ann
|
||||||
@@ -26,7 +26,7 @@ class B() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object b {
|
object b {
|
||||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {
|
||||||
val x = 1
|
val x = 1
|
||||||
} // error
|
} // error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
class A {
|
class A {
|
||||||
inner class B {
|
inner class B {
|
||||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object { }
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,9 +1,9 @@
|
|||||||
fun test() {
|
fun test() {
|
||||||
class A {
|
class A {
|
||||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {}
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {}
|
||||||
}
|
}
|
||||||
|
|
||||||
object {
|
object {
|
||||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {}
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+6
-6
@@ -1,17 +1,17 @@
|
|||||||
class A {
|
class A {
|
||||||
inner class I {
|
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 {
|
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 {}
|
<!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 {}
|
<!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!>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 {}
|
<!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
|
// KT-3464 Front-end shouldn't allow override modifier in class declaration
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>override<!> class A {
|
<!WRONG_MODIFIER_TARGET!>override<!> class A {
|
||||||
<!ILLEGAL_MODIFIER!>override<!> companion object {}
|
<!WRONG_MODIFIER_TARGET!>override<!> companion object {}
|
||||||
<!ILLEGAL_MODIFIER!>open<!> companion object {}
|
<!WRONG_MODIFIER_TARGET!>open<!> companion object {}
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> companion object {}
|
<!WRONG_MODIFIER_TARGET!>abstract<!> companion object {}
|
||||||
<!ILLEGAL_MODIFIER!>final<!> companion object {}
|
<!WRONG_MODIFIER_TARGET!>final<!> companion object {}
|
||||||
}
|
}
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>override<!> object B1 {}
|
<!WRONG_MODIFIER_TARGET!>override<!> object B1 {}
|
||||||
<!ILLEGAL_MODIFIER!>open<!> object B2 {}
|
<!WRONG_MODIFIER_TARGET!>open<!> object B2 {}
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> object B3 {}
|
<!WRONG_MODIFIER_TARGET!>abstract<!> object B3 {}
|
||||||
<!ILLEGAL_MODIFIER!>final<!> object B4 {}
|
<!WRONG_MODIFIER_TARGET!>final<!> object B4 {}
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>override<!> enum class C {}
|
<!WRONG_MODIFIER_TARGET!>override<!> enum class C {}
|
||||||
<!ILLEGAL_MODIFIER!>override<!> interface D {}
|
<!WRONG_MODIFIER_TARGET!>override<!> interface D {}
|
||||||
<!ILLEGAL_MODIFIER!>override<!> annotation class E
|
<!WRONG_MODIFIER_TARGET!>override<!> annotation class E
|
||||||
+4
-4
@@ -5,8 +5,8 @@ class T {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
<!ILLEGAL_MODIFIER!>public<!> val <!UNUSED_VARIABLE!>i<!> = 11
|
<!WRONG_MODIFIER_TARGET!>public<!> val <!UNUSED_VARIABLE!>i<!> = 11
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> val <!VARIABLE_WITH_NO_TYPE_NO_INITIALIZER, UNUSED_VARIABLE!>j<!>
|
<!WRONG_MODIFIER_TARGET!>abstract<!> val <!VARIABLE_WITH_NO_TYPE_NO_INITIALIZER, UNUSED_VARIABLE!>j<!>
|
||||||
<!ILLEGAL_MODIFIER!>override<!> fun T.baz() = 2
|
<!WRONG_MODIFIER_TARGET!>override<!> fun T.baz() = 2
|
||||||
<!ILLEGAL_MODIFIER!>private<!> fun bar() = 2
|
<!WRONG_MODIFIER_TARGET!>private<!> fun bar() = 2
|
||||||
}
|
}
|
||||||
+2
-2
@@ -4,10 +4,10 @@ class T {
|
|||||||
fun baz() = 1
|
fun baz() = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>override<!> fun zzz() {}
|
<!WRONG_MODIFIER_TARGET!>override<!> fun zzz() {}
|
||||||
|
|
||||||
fun foo(t: T) {
|
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"
|
// was "Visibility is unknown yet exception"
|
||||||
t.baz()
|
t.baz()
|
||||||
|
|||||||
+5
-6
@@ -1,13 +1,12 @@
|
|||||||
package d
|
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 {}
|
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
|
package d
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>override<!> val f : ()-> Int = { 12 }
|
<!WRONG_MODIFIER_TARGET!>override<!> val f : ()-> Int = { 12 }
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
f()
|
f()
|
||||||
}
|
}
|
||||||
|
|
||||||
var g: Int = 1
|
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() {}
|
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val packagePublicProperty<!> = object : MyClass() {}
|
||||||
|
|
||||||
@@ -164,7 +164,7 @@ fun testProperties() {
|
|||||||
|
|
||||||
private fun privateFunction() = object : MyClass() {fun invisible() {}}
|
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() {}
|
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public fun publicFunction()<!> = object : MyClass() {}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ interface T {}
|
|||||||
|
|
||||||
class Br(t : T) : T by t {}
|
class Br(t : T) : T by t {}
|
||||||
|
|
||||||
<!OPEN_MODIFIER_IN_ENUM!>open<!> enum class EN() {
|
<!WRONG_MODIFIER_TARGET!>open<!> enum class EN() {
|
||||||
A
|
A
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
package abstract
|
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() {}
|
<!ABSTRACT_FUNCTION_WITH_BODY!>abstract<!> fun j() {}
|
||||||
|
|
||||||
//property accessors
|
//property accessors
|
||||||
var i: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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 j: Int get() = i; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var j1: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>0<!>; get() = i; <!ILLEGAL_MODIFIER!>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
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var k: Int<!> <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
var k1: Int = 0; <!ILLEGAL_MODIFIER!>abstract<!> set
|
var k1: Int = 0; <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
|
|
||||||
var l: Int <!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<!>; <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>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,
|
FIRST,
|
||||||
|
|
||||||
SECOND {
|
SECOND {
|
||||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {
|
||||||
fun foo() = 42
|
fun foo() = 42
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
enum class B {}
|
enum class B {}
|
||||||
|
|
||||||
class A {
|
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 {}
|
public enum MyJavaEnum {}
|
||||||
|
|
||||||
// FILE: test.kt
|
// FILE: test.kt
|
||||||
<!OPEN_MODIFIER_IN_ENUM!>open<!> enum class MyEnum() {
|
<!WRONG_MODIFIER_TARGET!>open<!> enum class MyEnum() {
|
||||||
A()
|
A()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!> interface Some {
|
<!WRONG_MODIFIER_TARGET!>enum<!> interface Some {
|
||||||
// Enum part
|
// Enum part
|
||||||
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED, ENUM_ENTRY_USES_DEPRECATED_OR_NO_DELIMITER!>D<!>
|
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED, ENUM_ENTRY_USES_DEPRECATED_OR_NO_DELIMITER!>D<!>
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
enum class E {
|
enum class E {
|
||||||
<!ILLEGAL_MODIFIER!>public<!> <!ILLEGAL_MODIFIER!>final<!> SUBCLASS {
|
<!WRONG_MODIFIER_TARGET!>public<!> <!WRONG_MODIFIER_TARGET!>final<!> SUBCLASS {
|
||||||
fun foo() {}
|
fun foo() {}
|
||||||
},
|
},
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>public<!> PUBLIC,
|
<!WRONG_MODIFIER_TARGET!>public<!> PUBLIC,
|
||||||
<!ILLEGAL_MODIFIER!>protected<!> PROTECTED,
|
<!WRONG_MODIFIER_TARGET!>protected<!> PROTECTED,
|
||||||
<!ILLEGAL_MODIFIER!>private<!> PRIVATE,
|
<!WRONG_MODIFIER_TARGET!>private<!> PRIVATE,
|
||||||
<!ILLEGAL_MODIFIER!>internal<!> INTERNAL,
|
<!WRONG_MODIFIER_TARGET!>internal<!> INTERNAL,
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> ABSTRACT,
|
<!WRONG_MODIFIER_TARGET!>abstract<!> ABSTRACT,
|
||||||
<!ILLEGAL_MODIFIER!>open<!> OPEN,
|
<!WRONG_MODIFIER_TARGET!>open<!> OPEN,
|
||||||
<!ILLEGAL_MODIFIER!>override<!> OVERRIDE,
|
<!WRONG_MODIFIER_TARGET!>override<!> OVERRIDE,
|
||||||
<!ILLEGAL_MODIFIER!>final<!> FINAL,
|
<!WRONG_MODIFIER_TARGET!>final<!> FINAL,
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> INNER,
|
<!WRONG_MODIFIER_TARGET!>inner<!> INNER,
|
||||||
<!ENUM_ENTRY_USES_DEPRECATED_OR_NO_DELIMITER!>annotation<!> ANNOTATION,
|
<!ENUM_ENTRY_USES_DEPRECATED_OR_NO_DELIMITER!>annotation<!> ANNOTATION,
|
||||||
<!ILLEGAL_MODIFIER!>enum<!> ENUM,
|
<!WRONG_MODIFIER_TARGET!>enum<!> ENUM,
|
||||||
<!ILLEGAL_MODIFIER!>out<!> OUT,
|
<!WRONG_MODIFIER_TARGET!>out<!> OUT,
|
||||||
<!ILLEGAL_MODIFIER!>in<!> IN,
|
<!WRONG_MODIFIER_TARGET!>in<!> IN,
|
||||||
<!ILLEGAL_MODIFIER!>vararg<!> VARARG,
|
<!WRONG_MODIFIER_TARGET!>vararg<!> VARARG,
|
||||||
<!ILLEGAL_MODIFIER!>reified<!> REIFIED
|
<!WRONG_MODIFIER_TARGET!>reified<!> REIFIED
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ abstract class Test() {
|
|||||||
abstract var v8 : Int get set
|
abstract var v8 : Int get set
|
||||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var v9 : Int<!> set
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var v9 : Int<!> set
|
||||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var v10 : Int<!> get
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var v10 : Int<!> get
|
||||||
abstract val v11 : Int <!ILLEGAL_MODIFIER!>abstract<!> get
|
abstract val v11 : Int <!WRONG_MODIFIER_TARGET!>abstract<!> get
|
||||||
abstract var v12 : Int <!ILLEGAL_MODIFIER!>abstract<!> get <!ILLEGAL_MODIFIER!>abstract<!> set
|
abstract var v12 : Int <!WRONG_MODIFIER_TARGET!>abstract<!> get <!WRONG_MODIFIER_TARGET!>abstract<!> set
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ class A<T> {
|
|||||||
class B {
|
class B {
|
||||||
fun test() {
|
fun test() {
|
||||||
class C<W>() : P<W, <!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>T<!>> {
|
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<!>>
|
inner class D : P<W, <!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>T<!>>
|
||||||
|
|||||||
+14
-14
@@ -1,21 +1,21 @@
|
|||||||
<!ILLEGAL_MODIFIER!>inner<!> fun foo() {}
|
<!WRONG_MODIFIER_TARGET!>inner<!> fun foo() {}
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> val prop = 42
|
<!WRONG_MODIFIER_TARGET!>inner<!> val prop = 42
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> class A
|
<!WRONG_MODIFIER_TARGET!>inner<!> class A
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> interface B
|
<!WRONG_MODIFIER_TARGET!>inner<!> interface B
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> object C
|
<!WRONG_MODIFIER_TARGET!>inner<!> object C
|
||||||
|
|
||||||
class D {
|
class D {
|
||||||
inner class E
|
inner class E
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> interface F
|
<!WRONG_MODIFIER_TARGET!>inner<!> interface F
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> object G
|
<!WRONG_MODIFIER_TARGET!>inner<!> object G
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> enum class R
|
<!WRONG_MODIFIER_TARGET!>inner<!> enum class R
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> annotation class S
|
<!WRONG_MODIFIER_TARGET!>inner<!> annotation class S
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> companion object
|
<!WRONG_MODIFIER_TARGET!>inner<!> companion object
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class H {
|
enum class H {
|
||||||
<!ILLEGAL_MODIFIER!>inner<!> I {
|
<!WRONG_MODIFIER_TARGET!>inner<!> I {
|
||||||
inner class II
|
inner class II
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -23,16 +23,16 @@ enum class H {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface K {
|
interface K {
|
||||||
<!INNER_CLASS_IN_TRAIT!>inner<!> class L
|
<!WRONG_MODIFIER_TARGET!>inner<!> class L
|
||||||
}
|
}
|
||||||
|
|
||||||
object N {
|
object N {
|
||||||
<!INNER_CLASS_IN_OBJECT!>inner<!> class O
|
<!WRONG_MODIFIER_TARGET!>inner<!> class O
|
||||||
}
|
}
|
||||||
|
|
||||||
class P {
|
class P {
|
||||||
companion object {
|
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() {
|
abstract class A() {
|
||||||
<!INCOMPATIBLE_MODIFIERS!>abstract<!> <!INCOMPATIBLE_MODIFIERS!>final<!> fun f()
|
<!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<!>
|
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>open var r: String<!>
|
||||||
get
|
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() {
|
class FinalClass() {
|
||||||
<!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> fun foo() {}
|
<!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> fun foo() {}
|
||||||
val i: Int = 1
|
val i: Int = 1
|
||||||
<!ILLEGAL_MODIFIER!>open<!> get(): Int = $i
|
<!WRONG_MODIFIER_TARGET!>open<!> get(): Int = $i
|
||||||
var j: Int = 1
|
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
|
<!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
|
//Check illegal modifier in constructor parameters
|
||||||
class IllegalModifiers1(
|
class IllegalModifiers1(
|
||||||
<!ILLEGAL_MODIFIER!>in<!>
|
<!WRONG_MODIFIER_TARGET!>in<!>
|
||||||
<!ILLEGAL_MODIFIER!>out<!>
|
<!INCOMPATIBLE_MODIFIERS!>out<!>
|
||||||
<!ILLEGAL_MODIFIER!>reified<!>
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||||
<!ILLEGAL_MODIFIER!>enum<!>
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||||
<!ILLEGAL_MODIFIER!>private<!>
|
<!WRONG_MODIFIER_TARGET!>private<!>
|
||||||
<!UNUSED_PARAMETER!>a<!>: Int)
|
<!UNUSED_PARAMETER!>a<!>: Int)
|
||||||
|
|
||||||
//Check multiple illegal modifiers in constructor
|
//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
|
//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
|
//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
|
//Check illegal modifiers for functions and catch block
|
||||||
abstract class IllegalModifiers5() {
|
abstract class IllegalModifiers5() {
|
||||||
|
|
||||||
//Check illegal modifier in function parameter
|
//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
|
//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
|
//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() {
|
private fun qux() {
|
||||||
|
|
||||||
//Check illegal modifier in catch block
|
//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
|
//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
|
//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
|
//Check illegal modifiers on anonymous initializers
|
||||||
abstract class IllegalModifiers6() {
|
abstract class IllegalModifiers6() {
|
||||||
<!ILLEGAL_MODIFIER!>public<!> init {}
|
<!WRONG_MODIFIER_TARGET!>public<!> init {}
|
||||||
<!ILLEGAL_MODIFIER!>private<!> init {}
|
<!WRONG_MODIFIER_TARGET!>private<!> init {}
|
||||||
<!ILLEGAL_MODIFIER!>protected<!> init {}
|
<!WRONG_MODIFIER_TARGET!>protected<!> init {}
|
||||||
<!ILLEGAL_MODIFIER!>vararg<!> init {}
|
<!WRONG_MODIFIER_TARGET!>vararg<!> init {}
|
||||||
<!ILLEGAL_MODIFIER!>abstract<!> init {}
|
<!WRONG_MODIFIER_TARGET!>abstract<!> init {}
|
||||||
<!ILLEGAL_MODIFIER!>open<!> init {}
|
<!WRONG_MODIFIER_TARGET!>open<!> init {}
|
||||||
<!ILLEGAL_MODIFIER!>final<!> 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
|
// strange inappropriate modifiers usages
|
||||||
<!ILLEGAL_MODIFIER!>override<!>
|
<!WRONG_MODIFIER_TARGET!>override<!>
|
||||||
<!ILLEGAL_MODIFIER!>out<!>
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||||
<!ILLEGAL_MODIFIER!>in<!>
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||||
<!ILLEGAL_MODIFIER!>reified<!>
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||||
class IllegalModifiers7() {
|
class IllegalModifiers7() {
|
||||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!>
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||||
<!ILLEGAL_MODIFIER!>inner<!>
|
<!WRONG_MODIFIER_TARGET!>inner<!>
|
||||||
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
||||||
<!ILLEGAL_MODIFIER!>out<!>
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||||
<!ILLEGAL_MODIFIER!>in<!>
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||||
<!ILLEGAL_MODIFIER!>reified<!>
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||||
val x = 1
|
val x = 1
|
||||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!>
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||||
<!ILLEGAL_MODIFIER!>inner<!>
|
<!WRONG_MODIFIER_TARGET!>inner<!>
|
||||||
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
||||||
<!ILLEGAL_MODIFIER!>out<!>
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||||
<!ILLEGAL_MODIFIER!>in<!>
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||||
<!ILLEGAL_MODIFIER!>reified<!>
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||||
fun foo() {}
|
fun foo() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Secondary constructors
|
// Secondary constructors
|
||||||
class IllegalModifiers8 {
|
class IllegalModifiers8 {
|
||||||
<!ILLEGAL_MODIFIER, INCOMPATIBLE_MODIFIERS!>abstract<!>
|
<!WRONG_MODIFIER_TARGET!>abstract<!>
|
||||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!>
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||||
<!ILLEGAL_MODIFIER, REDUNDANT_MODIFIER, REDUNDANT_MODIFIER, INCOMPATIBLE_MODIFIERS!>open<!>
|
<!REDUNDANT_MODIFIER!>open<!>
|
||||||
<!ILLEGAL_MODIFIER!>inner<!>
|
<!WRONG_MODIFIER_TARGET!>inner<!>
|
||||||
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
||||||
<!ILLEGAL_MODIFIER!>override<!>
|
<!WRONG_MODIFIER_TARGET!>override<!>
|
||||||
<!ILLEGAL_MODIFIER!>out<!>
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||||
<!ILLEGAL_MODIFIER!>in<!>
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||||
<!ILLEGAL_MODIFIER, INCOMPATIBLE_MODIFIERS!>final<!>
|
<!INCOMPATIBLE_MODIFIERS!>final<!>
|
||||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||||
<!ILLEGAL_MODIFIER!>reified<!>
|
<!WRONG_MODIFIER_TARGET!>reified<!>
|
||||||
constructor() {}
|
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 {
|
class IllegalModifiers9 {
|
||||||
@@ -139,16 +139,16 @@ class IllegalModifiers9 {
|
|||||||
// Illegal modifiers on primary constructor
|
// Illegal modifiers on primary constructor
|
||||||
|
|
||||||
class IllegalModifiers10
|
class IllegalModifiers10
|
||||||
<!ILLEGAL_MODIFIER, INCOMPATIBLE_MODIFIERS!>abstract<!>
|
<!WRONG_MODIFIER_TARGET!>abstract<!>
|
||||||
<!ILLEGAL_ENUM_ANNOTATION!>enum<!>
|
<!WRONG_MODIFIER_TARGET!>enum<!>
|
||||||
<!ILLEGAL_MODIFIER, REDUNDANT_MODIFIER, REDUNDANT_MODIFIER, INCOMPATIBLE_MODIFIERS!>open<!>
|
<!REDUNDANT_MODIFIER!>open<!>
|
||||||
<!ILLEGAL_MODIFIER!>inner<!>
|
<!WRONG_MODIFIER_TARGET!>inner<!>
|
||||||
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
<!WRONG_ANNOTATION_TARGET!>annotation<!>
|
||||||
<!ILLEGAL_MODIFIER!>override<!>
|
<!WRONG_MODIFIER_TARGET!>override<!>
|
||||||
<!ILLEGAL_MODIFIER!>out<!>
|
<!WRONG_MODIFIER_TARGET!>out<!>
|
||||||
<!ILLEGAL_MODIFIER!>in<!>
|
<!INCOMPATIBLE_MODIFIERS!>in<!>
|
||||||
<!ILLEGAL_MODIFIER, INCOMPATIBLE_MODIFIERS!>final<!>
|
<!INCOMPATIBLE_MODIFIERS!>final<!>
|
||||||
<!ILLEGAL_MODIFIER!>vararg<!>
|
<!WRONG_MODIFIER_TARGET!>vararg<!>
|
||||||
<!ILLEGAL_MODIFIER!>reified<!> constructor()
|
<!WRONG_MODIFIER_TARGET!>reified<!> constructor()
|
||||||
|
|
||||||
class IllegalModifiers11 <!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>protected<!> 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 {
|
companion object {
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -18,38 +18,38 @@ class C {
|
|||||||
|
|
||||||
class D {
|
class D {
|
||||||
companion object A {
|
companion object A {
|
||||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object {
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>companion<!> object G {
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object G {
|
||||||
<!COMPANION_OBJECT_NOT_ALLOWED!>companion<!> object
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>companion<!> object
|
||||||
}
|
}
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>companion<!> interface H {
|
<!WRONG_MODIFIER_TARGET!>companion<!> interface H {
|
||||||
companion object
|
companion object
|
||||||
}
|
}
|
||||||
|
|
||||||
class J {
|
class J {
|
||||||
companion object C {
|
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,
|
E1,
|
||||||
E2;
|
E2;
|
||||||
|
|
||||||
companion object
|
companion object
|
||||||
}
|
}
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>companion<!> fun main() {
|
<!WRONG_MODIFIER_TARGET!>companion<!> fun main() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
<!ILLEGAL_MODIFIER!>companion<!> var prop: Int = 1
|
<!WRONG_MODIFIER_TARGET!>companion<!> var prop: Int = 1
|
||||||
<!ILLEGAL_MODIFIER!>companion<!> get
|
<!WRONG_MODIFIER_TARGET!>companion<!> get
|
||||||
<!ILLEGAL_MODIFIER!>companion<!> set
|
<!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 Foo<T>
|
||||||
interface Foo1<<!INCOMPATIBLE_MODIFIERS!>in<!> <!INCOMPATIBLE_MODIFIERS!>out<!> 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 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() {
|
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 {
|
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) {
|
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
|
abstract <!REPEATED_MODIFIER!>abstract<!> class Foo
|
||||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> class Bar
|
public <!REPEATED_MODIFIER!>public<!> class Bar
|
||||||
<!REPEATED_MODIFIER, INCOMPATIBLE_MODIFIERS!>open<!> <!REPEATED_MODIFIER!>open<!> <!INCOMPATIBLE_MODIFIERS!>final<!> class Baz {
|
<!INCOMPATIBLE_MODIFIERS!>open<!> <!REPEATED_MODIFIER!>open<!> <!INCOMPATIBLE_MODIFIERS!>final<!> class Baz {
|
||||||
<!REPEATED_MODIFIER!>private<!> <!REPEATED_MODIFIER!>private<!> fun foo() {}
|
private <!REPEATED_MODIFIER!>private<!> fun foo() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Bzz(<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val q: Int = 1) {
|
class Bzz(public <!REPEATED_MODIFIER!>public<!> val q: Int = 1) {
|
||||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val x: Int = 2
|
public <!REPEATED_MODIFIER!>public<!> val x: Int = 2
|
||||||
|
|
||||||
public val y: Int
|
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
|
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) {
|
public <!REPEATED_MODIFIER!>public<!> class B(public <!REPEATED_MODIFIER!>public<!> val z: Int = 1) {
|
||||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val y: Int = 2
|
public <!REPEATED_MODIFIER!>public<!> val y: Int = 2
|
||||||
|
|
||||||
public val x: Int
|
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 {
|
public <!REPEATED_MODIFIER!>public<!> object C {
|
||||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val y: Int = 1
|
public <!REPEATED_MODIFIER!>public<!> val y: Int = 1
|
||||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> fun z(): 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() {
|
fun test() {
|
||||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> class B(<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val z: Int = 1) {
|
public <!REPEATED_MODIFIER!>public<!> class B(public <!REPEATED_MODIFIER!>public<!> val z: Int = 1) {
|
||||||
<!REPEATED_MODIFIER!>public<!> <!REPEATED_MODIFIER!>public<!> val y: Int = 2
|
public <!REPEATED_MODIFIER!>public<!> val y: Int = 2
|
||||||
|
|
||||||
public val x: Int
|
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
|
//FILE:a.kt
|
||||||
package test_visibility
|
package test_visibility
|
||||||
|
|
||||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> class ProtectedClass
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> class ProtectedClass
|
||||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> interface ProtectedTrait
|
<!WRONG_MODIFIER_CONTAINING_DECLARATION!>protected<!> interface ProtectedTrait
|
||||||
|
|
||||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> val protected_val : Int = 4
|
<!WRONG_MODIFIER_TARGET!>protected<!> val protected_val : Int = 4
|
||||||
<!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> fun protected_fun() {}
|
<!WRONG_MODIFIER_TARGET!>protected<!> fun protected_fun() {}
|
||||||
|
|
||||||
private val private_val : Int = 4
|
private val private_val : Int = 4
|
||||||
private fun private_fun() {}
|
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,
|
FIRST,
|
||||||
SECOND;
|
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(
|
constructor(
|
||||||
<!VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER!>val<!> x: Int, y: Int,
|
<!VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER!>val<!> x: Int, y: Int,
|
||||||
<!VAL_OR_VAR_ON_SECONDARY_CONSTRUCTOR_PARAMETER!>var<!> z: 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
|
import java.util.ArrayList
|
||||||
|
|
||||||
abstract class J {
|
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() {
|
fun bar() {
|
||||||
val s = ArrayList<ArrayList<Int>>()
|
val s = ArrayList<ArrayList<Int>>()
|
||||||
foo(s)
|
foo(s)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
|
||||||
abstract class J {
|
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() {
|
fun bar() {
|
||||||
val s = ArrayList<ArrayList<Int>>()
|
val s = ArrayList<ArrayList<Int>>()
|
||||||
foo(s)
|
foo(s)
|
||||||
|
|||||||
@@ -16,26 +16,52 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.descriptors.annotations
|
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 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) {
|
public enum class KotlinTarget(val description: String, val isDefault: Boolean = true) {
|
||||||
PACKAGE("package"),
|
PACKAGE("package"),
|
||||||
CLASSIFIER("classifier"),
|
CLASSIFIER("classifier"), // includes CLASS, OBJECT, INTERFACE, *_CLASS but not ENUM_ENTRY
|
||||||
ANNOTATION_CLASS("annotation class"),
|
ANNOTATION_CLASS("annotation class"),
|
||||||
TYPE_PARAMETER("type parameter", false),
|
TYPE_PARAMETER("type parameter", false),
|
||||||
PROPERTY("property"),
|
PROPERTY("property"), // includes *_PROPERTY, PROPERTY_PARAMETER, ENUM_ENTRY
|
||||||
FIELD("field"),
|
FIELD("field"),
|
||||||
LOCAL_VARIABLE("local variable"),
|
LOCAL_VARIABLE("local variable"),
|
||||||
VALUE_PARAMETER("value parameter"),
|
VALUE_PARAMETER("value parameter"),
|
||||||
CONSTRUCTOR("constructor"),
|
CONSTRUCTOR("constructor"),
|
||||||
FUNCTION("function"),
|
FUNCTION("function"), // includes *_FUNCTION
|
||||||
PROPERTY_GETTER("getter"),
|
PROPERTY_GETTER("getter"),
|
||||||
PROPERTY_SETTER("setter"),
|
PROPERTY_SETTER("setter"),
|
||||||
TYPE("type usage", false),
|
TYPE("type usage", false),
|
||||||
EXPRESSION("expression", 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 {
|
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 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)
|
GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory)
|
||||||
REDUNDANT_MODIFIER_IN_GETTER.registerFactory(removeRedundantModifierFactory)
|
REDUNDANT_MODIFIER_IN_GETTER.registerFactory(removeRedundantModifierFactory)
|
||||||
ILLEGAL_MODIFIER.registerFactory(removeModifierFactory)
|
ILLEGAL_MODIFIER.registerFactory(removeModifierFactory)
|
||||||
|
WRONG_MODIFIER_TARGET.registerFactory(removeModifierFactory)
|
||||||
|
WRONG_MODIFIER_CONTAINING_DECLARATION.registerFactory(removeModifierFactory)
|
||||||
REPEATED_MODIFIER.registerFactory(removeModifierFactory)
|
REPEATED_MODIFIER.registerFactory(removeModifierFactory)
|
||||||
|
|
||||||
val removeInnerModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerFactory(INNER_KEYWORD)
|
val removeInnerModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerFactory(INNER_KEYWORD)
|
||||||
|
|||||||
+1
-1
@@ -14,7 +14,7 @@ class B() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
object 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
|
val x = 1
|
||||||
}
|
}
|
||||||
// error
|
// error
|
||||||
|
|||||||
+4
-4
@@ -1,15 +1,15 @@
|
|||||||
import kotlin.platform.platformStatic
|
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 {
|
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 {
|
companion object {
|
||||||
platformStatic fun a1() {
|
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 {
|
object A {
|
||||||
platformStatic fun a2() {
|
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 {
|
interface B {
|
||||||
companion object {
|
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> {
|
<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: Body is not allowed for annotation class
|
||||||
|
// ERROR: Modifier 'companion' is not applicable inside 'annotation class'
|
||||||
annotation class Anon(public val value: String) {
|
annotation class Anon(public val value: String) {
|
||||||
|
|
||||||
public enum class E {
|
public enum class E {
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
// This test was adapted from compiler/testData/codegen/box/classes
|
// This test was adapted from compiler/testData/codegen/box/classes
|
||||||
package foo
|
package foo
|
||||||
|
|
||||||
open trait First {
|
interface First {
|
||||||
public open fun foo(): Int
|
public open fun foo(): Int
|
||||||
}
|
}
|
||||||
|
|
||||||
open trait Second : First {
|
interface Second : First {
|
||||||
public open fun bar(): Int
|
public open fun bar(): Int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ public class Output(val d: Data) : Closeable {
|
|||||||
public fun doOutput(data: Int): Int = data
|
public fun doOutput(data: Int): Int = data
|
||||||
}
|
}
|
||||||
|
|
||||||
public open trait Closeable {
|
public interface Closeable {
|
||||||
open public fun close() {}
|
open public fun close() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ public class Output(val d: Data) : Closeable {
|
|||||||
public fun doOutput(data: Int): Int = data
|
public fun doOutput(data: Int): Int = data
|
||||||
}
|
}
|
||||||
|
|
||||||
public open trait Closeable {
|
public interface Closeable {
|
||||||
open public fun close() {}
|
open public fun close() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user