Add declaresOrInheritsDefaultValue, move hasDefaultValue to 'resolution'
'hasDefaultValue' needs to be adapted to support locating default values in 'expect' functions, and this is not possible in module 'descriptors', where it was originally declared. Therefore, move it to module 'resolution' and copy its current logic to a separate function 'declaresOrInheritsDefaultValue' which is used in 5 places. 'hasDefaultValue' itself is updated in subsequent commits. Besides changing imports, also use a simpler declaresDefaultValue in some places, which does not include default values inherited from supertypes: this is OK for constructors, and in LazyJavaClassMemberScope for functions from built-ins which do not have default argument values at all
This commit is contained in:
+1
-2
@@ -47,7 +47,6 @@ import org.jetbrains.kotlin.resolve.DescriptorFactory
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.OverridingUtil
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
|
||||
import org.jetbrains.kotlin.storage.NotNullLazyValue
|
||||
@@ -358,7 +357,7 @@ class LazyJavaClassMemberScope(
|
||||
override ->
|
||||
override.newCopyBuilder().apply {
|
||||
setValueParameters(copyValueParameters(
|
||||
overridden.valueParameters.map { ValueParameterData(it.type, it.hasDefaultValue()) },
|
||||
overridden.valueParameters.map { ValueParameterData(it.type, it.declaresDefaultValue()) },
|
||||
override.valueParameters, overridden))
|
||||
setSignatureChange()
|
||||
setPreserveSourceElement()
|
||||
|
||||
@@ -21,7 +21,7 @@ import org.jetbrains.kotlin.resolve.constants.ArrayValue
|
||||
import org.jetbrains.kotlin.resolve.constants.ConstantValue
|
||||
import org.jetbrains.kotlin.resolve.constants.KClassValue
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue
|
||||
import org.jetbrains.kotlin.types.*
|
||||
import org.jetbrains.kotlin.types.ErrorUtils.UninferredParameterTypeConstructor
|
||||
import org.jetbrains.kotlin.types.TypeUtils.CANT_INFER_FUNCTION_PARAM_TYPE
|
||||
@@ -761,7 +761,9 @@ internal class DescriptorRendererImpl(
|
||||
|
||||
renderVariable(valueParameter, includeName, builder, topLevel)
|
||||
|
||||
val withDefaultValue = defaultParameterValueRenderer != null && (if (debugMode) valueParameter.declaresDefaultValue() else valueParameter.hasDefaultValue())
|
||||
val withDefaultValue =
|
||||
defaultParameterValueRenderer != null &&
|
||||
(if (debugMode) valueParameter.declaresDefaultValue() else valueParameter.declaresOrInheritsDefaultValue())
|
||||
if (withDefaultValue) {
|
||||
builder.append(" = ${defaultParameterValueRenderer!!(valueParameter)}")
|
||||
}
|
||||
|
||||
@@ -190,16 +190,11 @@ fun CallableDescriptor.getOwnerForEffectiveDispatchReceiverParameter(): Declarat
|
||||
return dispatchReceiverParameter?.containingDeclaration
|
||||
}
|
||||
|
||||
/**
|
||||
* @return `true` iff the parameter has a default value, i.e. declares it or inherits by overriding a parameter which has a default value.
|
||||
*/
|
||||
fun ValueParameterDescriptor.hasDefaultValue(): Boolean {
|
||||
fun ValueParameterDescriptor.declaresOrInheritsDefaultValue(): Boolean {
|
||||
return DFS.ifAny(
|
||||
listOf(this),
|
||||
DFS.Neighbors<ValueParameterDescriptor> { current ->
|
||||
current.overriddenDescriptors.map(ValueParameterDescriptor::getOriginal)
|
||||
},
|
||||
ValueParameterDescriptor::declaresDefaultValue
|
||||
listOf(this),
|
||||
{ current -> current.overriddenDescriptors.map(ValueParameterDescriptor::getOriginal) },
|
||||
ValueParameterDescriptor::declaresDefaultValue
|
||||
)
|
||||
}
|
||||
|
||||
@@ -397,12 +392,6 @@ fun computeSealedSubclasses(sealedClass: ClassDescriptor): Collection<ClassDescr
|
||||
return result
|
||||
}
|
||||
|
||||
fun ClassDescriptor.getNoArgsConstructor(): ClassConstructorDescriptor? =
|
||||
constructors.find { it.valueParameters.isEmpty() }
|
||||
|
||||
fun ClassDescriptor.getConstructorForEmptyArgumentsList(): List<ClassConstructorDescriptor> =
|
||||
constructors.filter { it.valueParameters.all { it.hasDefaultValue() || it.varargElementType != null } }
|
||||
|
||||
fun DeclarationDescriptor.isPublishedApi(): Boolean {
|
||||
val descriptor = if (this is CallableMemberDescriptor) DescriptorUtils.getDirectMember(this) else this
|
||||
return descriptor.annotations.hasAnnotation(KotlinBuiltIns.FQ_NAMES.publishedApi)
|
||||
|
||||
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf
|
||||
@@ -94,12 +94,7 @@ sealed class ValueParameterCountCheck(override val description: String) : Check
|
||||
private object NoDefaultAndVarargsCheck : Check {
|
||||
override val description = "should not have varargs or parameters with default values"
|
||||
override fun check(functionDescriptor: FunctionDescriptor) =
|
||||
functionDescriptor.valueParameters.all { !it.hasDefaultValue() && it.varargElementType == null }
|
||||
}
|
||||
|
||||
private object NoTypeParametersCheck : Check {
|
||||
override val description = "should not have type parameters"
|
||||
override fun check(functionDescriptor: FunctionDescriptor) = functionDescriptor.typeParameters.isEmpty()
|
||||
functionDescriptor.valueParameters.all { !it.declaresOrInheritsDefaultValue() && it.varargElementType == null }
|
||||
}
|
||||
|
||||
private object IsKPropertyCheck : Check {
|
||||
@@ -178,7 +173,8 @@ object OperatorChecks : AbstractModifierChecks() {
|
||||
override val checks = listOf(
|
||||
Checks(GET, MemberOrExtension, ValueParameterCountCheck.AtLeast(1)),
|
||||
Checks(SET, MemberOrExtension, ValueParameterCountCheck.AtLeast(2)) {
|
||||
val lastIsOk = valueParameters.lastOrNull()?.let { !it.hasDefaultValue() && it.varargElementType == null } ?: false
|
||||
val lastIsOk =
|
||||
valueParameters.lastOrNull()?.let { !it.declaresOrInheritsDefaultValue() && it.varargElementType == null } == true
|
||||
ensure(lastIsOk) { "last parameter should not have a default value or be a vararg" }
|
||||
},
|
||||
Checks(GET_VALUE, MemberOrExtension, NoDefaultAndVarargsCheck, ValueParameterCountCheck.AtLeast(2), IsKPropertyCheck),
|
||||
|
||||
@@ -18,7 +18,7 @@ package kotlin.reflect.jvm.internal
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue
|
||||
import kotlin.reflect.KParameter
|
||||
import kotlin.reflect.KType
|
||||
|
||||
@@ -43,7 +43,7 @@ internal class KParameterImpl(
|
||||
get() = KTypeImpl(descriptor.type) { callable.caller.parameterTypes[index] }
|
||||
|
||||
override val isOptional: Boolean
|
||||
get() = (descriptor as? ValueParameterDescriptor)?.hasDefaultValue() ?: false
|
||||
get() = (descriptor as? ValueParameterDescriptor)?.declaresOrInheritsDefaultValue() ?: false
|
||||
|
||||
override val isVararg: Boolean
|
||||
get() = descriptor.let { it is ValueParameterDescriptor && it.varargElementType != null }
|
||||
|
||||
Reference in New Issue
Block a user