Do not report "header with no impl" on incorrect header
Descriptor for a 'header' member in a non-'header' class now has isHeader = false #KT-18442 Fixed
This commit is contained in:
@@ -836,7 +836,7 @@ public class DescriptorResolver {
|
||||
|
||||
@NotNull
|
||||
private PropertyDescriptor resolveAsPropertyDescriptor(
|
||||
@NotNull DeclarationDescriptor containingDeclaration,
|
||||
@NotNull DeclarationDescriptor container,
|
||||
@NotNull LexicalScope scopeForDeclarationResolution,
|
||||
@NotNull LexicalScope scopeForInitializerResolution,
|
||||
@NotNull KtVariableDeclaration variableDeclaration,
|
||||
@@ -847,11 +847,11 @@ public class DescriptorResolver {
|
||||
KtModifierList modifierList = variableDeclaration.getModifierList();
|
||||
boolean isVar = variableDeclaration.isVar();
|
||||
|
||||
Visibility visibility = resolveVisibilityFromModifiers(variableDeclaration, getDefaultVisibility(variableDeclaration, containingDeclaration));
|
||||
Modality modality = containingDeclaration instanceof ClassDescriptor
|
||||
Visibility visibility = resolveVisibilityFromModifiers(variableDeclaration, getDefaultVisibility(variableDeclaration, container));
|
||||
Modality modality = container instanceof ClassDescriptor
|
||||
? resolveMemberModalityFromModifiers(variableDeclaration,
|
||||
getDefaultModality(containingDeclaration, visibility, propertyInfo.getHasBody()),
|
||||
trace.getBindingContext(), containingDeclaration)
|
||||
getDefaultModality(container, visibility, propertyInfo.getHasBody()),
|
||||
trace.getBindingContext(), container)
|
||||
: Modality.FINAL;
|
||||
|
||||
AnnotationSplitter.PropertyWrapper wrapper = new AnnotationSplitter.PropertyWrapper(variableDeclaration);
|
||||
@@ -866,7 +866,7 @@ public class DescriptorResolver {
|
||||
annotationSplitter.getOtherAnnotations()));
|
||||
|
||||
PropertyDescriptorImpl propertyDescriptor = PropertyDescriptorImpl.create(
|
||||
containingDeclaration,
|
||||
container,
|
||||
propertyAnnotations,
|
||||
modality,
|
||||
visibility,
|
||||
@@ -876,8 +876,8 @@ public class DescriptorResolver {
|
||||
KotlinSourceElementKt.toSourceElement(variableDeclaration),
|
||||
modifierList != null && modifierList.hasModifier(KtTokens.LATEINIT_KEYWORD),
|
||||
modifierList != null && modifierList.hasModifier(KtTokens.CONST_KEYWORD),
|
||||
modifierList != null && modifierList.hasModifier(KtTokens.HEADER_KEYWORD) ||
|
||||
containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).isHeader(),
|
||||
modifierList != null && modifierList.hasModifier(KtTokens.HEADER_KEYWORD) && container instanceof PackageFragmentDescriptor ||
|
||||
container instanceof ClassDescriptor && ((ClassDescriptor) container).isHeader(),
|
||||
modifierList != null && modifierList.hasModifier(KtTokens.IMPL_KEYWORD),
|
||||
modifierList != null && modifierList.hasModifier(KtTokens.EXTERNAL_KEYWORD),
|
||||
propertyInfo.getHasDelegate()
|
||||
@@ -898,10 +898,10 @@ public class DescriptorResolver {
|
||||
}
|
||||
else {
|
||||
LexicalWritableScope writableScopeForDeclarationResolution = new LexicalWritableScope(
|
||||
scopeForDeclarationResolution, containingDeclaration, false, new TraceBasedLocalRedeclarationChecker(trace, overloadChecker),
|
||||
scopeForDeclarationResolution, container, false, new TraceBasedLocalRedeclarationChecker(trace, overloadChecker),
|
||||
LexicalScopeKind.PROPERTY_HEADER);
|
||||
LexicalWritableScope writableScopeForInitializerResolution = new LexicalWritableScope(
|
||||
scopeForInitializerResolution, containingDeclaration, false, LocalRedeclarationChecker.DO_NOTHING.INSTANCE,
|
||||
scopeForInitializerResolution, container, false, LocalRedeclarationChecker.DO_NOTHING.INSTANCE,
|
||||
LexicalScopeKind.PROPERTY_HEADER);
|
||||
typeParameterDescriptors = resolveTypeParametersForDescriptor(
|
||||
propertyDescriptor,
|
||||
@@ -951,8 +951,7 @@ public class DescriptorResolver {
|
||||
propertyDescriptor, scopeForInitializer, variableDeclaration, dataFlowInfo, type, trace
|
||||
);
|
||||
|
||||
propertyDescriptor.setType(type, typeParameterDescriptors, getDispatchReceiverParameterIfNeeded(containingDeclaration),
|
||||
receiverDescriptor);
|
||||
propertyDescriptor.setType(type, typeParameterDescriptors, getDispatchReceiverParameterIfNeeded(container), receiverDescriptor);
|
||||
|
||||
PropertySetterDescriptor setter = resolvePropertySetterDescriptor(
|
||||
scopeForDeclarationResolutionWithTypeParameters,
|
||||
|
||||
@@ -134,7 +134,7 @@ class FunctionDescriptorResolver(
|
||||
}
|
||||
|
||||
fun initializeFunctionDescriptorAndExplicitReturnType(
|
||||
containingDescriptor: DeclarationDescriptor,
|
||||
container: DeclarationDescriptor,
|
||||
scope: LexicalScope,
|
||||
function: KtFunction,
|
||||
functionDescriptor: SimpleFunctionDescriptorImpl,
|
||||
@@ -164,12 +164,12 @@ class FunctionDescriptorResolver(
|
||||
|
||||
val returnType = function.typeReference?.let { typeResolver.resolveType(headerScope, it, trace, true) }
|
||||
|
||||
val visibility = resolveVisibilityFromModifiers(function, getDefaultVisibility(function, containingDescriptor))
|
||||
val modality = resolveMemberModalityFromModifiers(function, getDefaultModality(containingDescriptor, visibility, function.hasBody()),
|
||||
trace.bindingContext, containingDescriptor)
|
||||
val visibility = resolveVisibilityFromModifiers(function, getDefaultVisibility(function, container))
|
||||
val modality = resolveMemberModalityFromModifiers(function, getDefaultModality(container, visibility, function.hasBody()),
|
||||
trace.bindingContext, container)
|
||||
functionDescriptor.initialize(
|
||||
receiverType,
|
||||
getDispatchReceiverParameterIfNeeded(containingDescriptor),
|
||||
getDispatchReceiverParameterIfNeeded(container),
|
||||
typeParameterDescriptors,
|
||||
valueParameterDescriptors,
|
||||
returnType,
|
||||
@@ -182,8 +182,8 @@ class FunctionDescriptorResolver(
|
||||
functionDescriptor.isInline = function.hasModifier(KtTokens.INLINE_KEYWORD)
|
||||
functionDescriptor.isTailrec = function.hasModifier(KtTokens.TAILREC_KEYWORD)
|
||||
functionDescriptor.isSuspend = function.hasModifier(KtTokens.SUSPEND_KEYWORD)
|
||||
functionDescriptor.isHeader = function.hasModifier(KtTokens.HEADER_KEYWORD) ||
|
||||
containingDescriptor is ClassDescriptor && containingDescriptor.isHeader
|
||||
functionDescriptor.isHeader = container is PackageFragmentDescriptor && function.hasModifier(KtTokens.HEADER_KEYWORD) ||
|
||||
container is ClassDescriptor && container.isHeader
|
||||
functionDescriptor.isImpl = function.hasModifier(KtTokens.IMPL_KEYWORD)
|
||||
|
||||
receiverType?.let { ForceResolveUtil.forceResolveAllContents(it.annotations) }
|
||||
|
||||
+3
@@ -80,6 +80,9 @@ object HeaderImplDeclarationChecker : DeclarationChecker {
|
||||
platformModule: ModuleDescriptor,
|
||||
checkImpl: Boolean
|
||||
) {
|
||||
// Only look for implementations of top level members; class members will be handled as a part of that header class
|
||||
if (descriptor is CallableMemberDescriptor && descriptor.containingDeclaration !is PackageFragmentDescriptor) return
|
||||
|
||||
val compatibility = findImplForHeader(descriptor, platformModule, checkImpl) ?: return
|
||||
|
||||
val shouldReportError =
|
||||
|
||||
Reference in New Issue
Block a user