Allow open callable members in expect interfaces

#KT-42094 fixed
This commit is contained in:
sebastian.sellmair
2020-11-06 17:03:30 +01:00
committed by Sebastian Sellmair
parent bf0156f7c6
commit 06cb64bb51
20 changed files with 289 additions and 10 deletions
@@ -772,7 +772,7 @@ class DeclarationsChecker(
if (function.hasModifier(KtTokens.PRIVATE_KEYWORD)) {
trace.report(PRIVATE_FUNCTION_WITH_NO_BODY.on(function, functionDescriptor))
}
if (!hasAbstractModifier && function.hasModifier(KtTokens.OPEN_KEYWORD)) {
if (!containingDescriptor.isExpect && !hasAbstractModifier && function.hasModifier(KtTokens.OPEN_KEYWORD)) {
trace.report(REDUNDANT_OPEN_IN_INTERFACE.on(function))
}
}
@@ -80,7 +80,7 @@ public class ModifiersChecker {
boolean allowSealed
) {
KtModifierList modifierList = (modifierListOwner != null) ? modifierListOwner.getModifierList() : null;
Modality modality = resolveModalityFromModifiers(modifierList, defaultModality, allowSealed);
Modality modality = resolveModalityFromModifiers(containingDescriptor, modifierList, defaultModality, allowSealed);
if (modifierListOwner != null) {
Collection<DeclarationAttributeAltererExtension> extensions =
@@ -103,6 +103,7 @@ public class ModifiersChecker {
@NotNull
private static Modality resolveModalityFromModifiers(
@Nullable DeclarationDescriptor containingDescriptor,
@Nullable KtModifierList modifierList,
@NotNull Modality defaultModality,
boolean allowSealed
@@ -115,6 +116,12 @@ public class ModifiersChecker {
return Modality.SEALED;
}
if (modifierList.hasModifier(OPEN_KEYWORD)) {
if (containingDescriptor instanceof ClassDescriptor) {
ClassDescriptor classOrInterface = (ClassDescriptor) containingDescriptor;
if (classOrInterface.getKind() == ClassKind.INTERFACE && classOrInterface.isExpect()) {
return Modality.OPEN;
}
}
if (hasAbstractModifier || defaultModality == Modality.ABSTRACT) {
return Modality.ABSTRACT;
}
@@ -141,7 +148,10 @@ public class ModifiersChecker {
return resolveVisibilityFromModifiers(modifierListOwner.getModifierList(), defaultVisibility);
}
public static DescriptorVisibility resolveVisibilityFromModifiers(@Nullable KtModifierList modifierList, @NotNull DescriptorVisibility defaultVisibility) {
public static DescriptorVisibility resolveVisibilityFromModifiers(
@Nullable KtModifierList modifierList,
@NotNull DescriptorVisibility defaultVisibility
) {
if (modifierList == null) return defaultVisibility;
if (modifierList.hasModifier(PRIVATE_KEYWORD)) return DescriptorVisibilities.PRIVATE;
if (modifierList.hasModifier(PUBLIC_KEYWORD)) return DescriptorVisibilities.PUBLIC;
@@ -226,7 +236,7 @@ public class ModifiersChecker {
public void checkModifiersForDestructuringDeclaration(@NotNull KtDestructuringDeclaration multiDeclaration) {
annotationChecker.check(multiDeclaration, trace, null);
ModifierCheckerCore.INSTANCE.check(multiDeclaration, trace, null, languageVersionSettings);
for (KtDestructuringDeclarationEntry multiEntry: multiDeclaration.getEntries()) {
for (KtDestructuringDeclarationEntry multiEntry : multiDeclaration.getEntries()) {
annotationChecker.check(multiEntry, trace, null);
ModifierCheckerCore.INSTANCE.check(multiEntry, trace, null, languageVersionSettings);
UnderscoreChecker.INSTANCE.checkNamed(multiEntry, trace, languageVersionSettings, /* allowSingleUnderscore = */ true);