Don't report error for properties and functions without body that either external by themselves or are members of external classes
This commit is contained in:
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.diagnostics.Errors
|
|||||||
import org.jetbrains.kotlin.diagnostics.Errors.*
|
import org.jetbrains.kotlin.diagnostics.Errors.*
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
|
import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext.*
|
import org.jetbrains.kotlin.resolve.BindingContext.*
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveAbstractMembers
|
import org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveAbstractMembers
|
||||||
@@ -724,7 +725,8 @@ class DeclarationsChecker(
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val isUninitialized = trace.bindingContext.get(BindingContext.IS_UNINITIALIZED, propertyDescriptor) ?: false
|
val isUninitialized = trace.bindingContext.get(BindingContext.IS_UNINITIALIZED, propertyDescriptor) ?: false
|
||||||
if (backingFieldRequired && !inTrait && !propertyDescriptor.isLateInit && !isPlatform && isUninitialized) {
|
val isExternal = DescriptorUtils.isEffectivelyExternal(propertyDescriptor)
|
||||||
|
if (backingFieldRequired && !inTrait && !propertyDescriptor.isLateInit && !isPlatform && isUninitialized && !isExternal) {
|
||||||
if (containingDeclaration !is ClassDescriptor || hasAccessorImplementation) {
|
if (containingDeclaration !is ClassDescriptor || hasAccessorImplementation) {
|
||||||
trace.report(MUST_BE_INITIALIZED.on(property))
|
trace.report(MUST_BE_INITIALIZED.on(property))
|
||||||
}
|
}
|
||||||
@@ -760,7 +762,7 @@ class DeclarationsChecker(
|
|||||||
|
|
||||||
val containingDescriptor = functionDescriptor.containingDeclaration
|
val containingDescriptor = functionDescriptor.containingDeclaration
|
||||||
val hasAbstractModifier = function.hasModifier(KtTokens.ABSTRACT_KEYWORD)
|
val hasAbstractModifier = function.hasModifier(KtTokens.ABSTRACT_KEYWORD)
|
||||||
val hasExternalModifier = function.hasModifier(KtTokens.EXTERNAL_KEYWORD)
|
val hasExternalModifier = DescriptorUtils.isEffectivelyExternal(functionDescriptor)
|
||||||
|
|
||||||
if (containingDescriptor is ClassDescriptor) {
|
if (containingDescriptor is ClassDescriptor) {
|
||||||
val inInterface = containingDescriptor.kind == ClassKind.INTERFACE
|
val inInterface = containingDescriptor.kind == ClassKind.INTERFACE
|
||||||
|
|||||||
@@ -575,4 +575,16 @@ public class DescriptorUtils {
|
|||||||
public static Collection<DeclarationDescriptor> getAllDescriptors(@NotNull MemberScope scope) {
|
public static Collection<DeclarationDescriptor> getAllDescriptors(@NotNull MemberScope scope) {
|
||||||
return scope.getContributedDescriptors(DescriptorKindFilter.ALL, MemberScope.Companion.getALL_NAME_FILTER());
|
return scope.getContributedDescriptors(DescriptorKindFilter.ALL, MemberScope.Companion.getALL_NAME_FILTER());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isEffectivelyExternal(@NotNull MemberDescriptor descriptor) {
|
||||||
|
if (descriptor.isExternal()) return true;
|
||||||
|
|
||||||
|
if (descriptor instanceof PropertyAccessorDescriptor) {
|
||||||
|
PropertyDescriptor variableDescriptor = ((PropertyAccessorDescriptor) descriptor).getCorrespondingProperty();
|
||||||
|
if (isEffectivelyExternal(variableDescriptor)) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassDescriptor containingClass = getContainingClass(descriptor);
|
||||||
|
return containingClass != null && isEffectivelyExternal(containingClass);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,10 +133,7 @@ public final class AnnotationsUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isEffectivelyExternal(@NotNull DeclarationDescriptor descriptor) {
|
private static boolean isEffectivelyExternal(@NotNull DeclarationDescriptor descriptor) {
|
||||||
if (descriptor instanceof MemberDescriptor && ((MemberDescriptor) descriptor).isExternal()) return true;
|
return descriptor instanceof MemberDescriptor && DescriptorUtils.isEffectivelyExternal((MemberDescriptor) descriptor);
|
||||||
|
|
||||||
ClassDescriptor containingClass = DescriptorUtils.getContainingClass(descriptor);
|
|
||||||
return containingClass != null && isEffectivelyExternal(containingClass);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isLibraryObject(@NotNull DeclarationDescriptor descriptor) {
|
public static boolean isLibraryObject(@NotNull DeclarationDescriptor descriptor) {
|
||||||
|
|||||||
Reference in New Issue
Block a user