From ac5444ef7cb7c96e7293fd1b4566b7efd37eaea9 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 12 Jan 2018 17:00:33 +0100 Subject: [PATCH] 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 --- .../DefaultParameterValueSubstitutor.kt | 2 +- .../kotlin/resolve/BodyResolver.java | 15 +++++++++++++-- .../ValueArgumentsToParametersMapper.java | 4 ++-- .../resolve/inline/InlineAnalyzerExtension.kt | 2 +- .../lower/DefaultArgumentStubGenerator.kt | 12 +++++++++--- .../backend/jvm/codegen/ExpressionCodegen.kt | 2 +- .../kotlin/psi2ir/generators/BodyGenerator.kt | 8 +++----- .../components/ArgumentsToParametersMapper.kt | 1 - .../calls/components/ArgumentsUtils.kt | 9 ++++++++- .../resolve/calls/results/FlatSignature.kt | 2 +- .../descriptors/LazyJavaClassMemberScope.kt | 3 +-- .../kotlin/renderer/DescriptorRendererImpl.kt | 6 ++++-- .../kotlin/resolve/DescriptorUtils.kt | 19 ++++--------------- .../jetbrains/kotlin/util/modifierChecks.kt | 12 ++++-------- .../reflect/jvm/internal/KParameterImpl.kt | 4 ++-- .../kotlin/idea/highlighter/renderersUtil.kt | 2 +- .../idea/completion/InsertHandlerProvider.kt | 2 +- .../idea/completion/LookupElementFactory.kt | 2 +- .../smart/MultipleArgumentsItemProvider.kt | 2 +- .../kotlin/idea/core/ExpectedInfos.kt | 2 +- .../idea/core/OptionalParametersHelper.kt | 2 +- .../ConvertLambdaToReferenceIntention.kt | 2 +- .../KotlinFunctionParameterInfoHandler.kt | 2 +- .../DeprecatedSymbolUsageFixBase.kt | 2 +- .../diagnostics/JsInheritanceChecker.kt | 4 ++-- .../declaration/JsDataClassGenerator.java | 4 ++-- .../expression/FunctionTranslator.kt | 2 +- .../src/NoArgExpressionCodegenExtension.kt | 14 +++++++------- .../diagnostic/CliNoArgDeclarationChecker.kt | 8 ++------ 29 files changed, 77 insertions(+), 74 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt index 1de47c6265f..1ab1ef38f90 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DefaultParameterValueSubstitutor.kt @@ -23,7 +23,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtPureClassOrObject import org.jetbrains.kotlin.psi.KtPureElement -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOriginFromPure diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 947f089ec21..39ffdb75c9d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -22,6 +22,7 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.util.containers.Queue; import kotlin.Unit; +import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function1; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,7 +41,6 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults; import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; import org.jetbrains.kotlin.resolve.calls.util.CallMaker; -import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; import org.jetbrains.kotlin.resolve.scopes.*; import org.jetbrains.kotlin.types.*; @@ -441,7 +441,7 @@ public class BodyResolver { if (enumClassDescriptor.getKind() != ClassKind.ENUM_CLASS) return; if (enumClassDescriptor.isExpect()) return; - List applicableConstructors = DescriptorUtilsKt.getConstructorForEmptyArgumentsList(enumClassDescriptor); + List applicableConstructors = getConstructorForEmptyArgumentsList(enumClassDescriptor); if (applicableConstructors.size() != 1) { trace.report(ENUM_ENTRY_SHOULD_BE_INITIALIZED.on(ktEnumEntry)); return; @@ -459,6 +459,17 @@ public class BodyResolver { } } + @NotNull + private static List getConstructorForEmptyArgumentsList(@NotNull ClassDescriptor descriptor) { + return CollectionsKt.filter( + descriptor.getConstructors(), + (constructor) -> CollectionsKt.all( + constructor.getValueParameters(), + (parameter) -> parameter.declaresDefaultValue() || parameter.getVarargElementType() != null + ) + ); + } + // Returns a set of enum or sealed types of which supertypeOwner is an entry or a member @NotNull private Set getAllowedFinalSupertypes( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ValueArgumentsToParametersMapper.java index 1e479d4de95..ca31cb95228 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/ValueArgumentsToParametersMapper.java @@ -30,9 +30,9 @@ import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.psiUtil.KtPsiUtilKt; import org.jetbrains.kotlin.resolve.OverrideResolver; import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt; +import org.jetbrains.kotlin.resolve.calls.components.ArgumentsUtilsKt; import org.jetbrains.kotlin.resolve.calls.model.*; import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy; -import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; import java.util.Iterator; import java.util.List; @@ -311,7 +311,7 @@ public class ValueArgumentsToParametersMapper { private void reportUnmappedParameters() { for (ValueParameterDescriptor valueParameter : parameters) { if (!usedParameters.contains(valueParameter)) { - if (DescriptorUtilsKt.hasDefaultValue(valueParameter)) { + if (ArgumentsUtilsKt.hasDefaultValue(valueParameter)) { candidateCall.recordValueArgument(valueParameter, DefaultValueArgument.DEFAULT); } else if (valueParameter.getVarargElementType() != null) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt index 6a73b71c306..d99a0e497d9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/inline/InlineAnalyzerExtension.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.AnalyzerExtensions import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue class InlineAnalyzerExtension( private val reasonableInlineRules: Iterable, diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt index 87d7f02b727..0ec55b58ffd 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt @@ -36,16 +36,22 @@ import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl import org.jetbrains.kotlin.ir.descriptors.IrTemporaryVariableDescriptorImpl import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.expressions.impl.* -import org.jetbrains.kotlin.ir.symbols.* +import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl +import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl +import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol +import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrValueSymbol +import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.builtIns diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index a057b773c05..c5ab94f27d1 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -41,7 +41,7 @@ import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.inline.InlineUtil import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.AsmTypes.JAVA_THROWABLE_TYPE diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt index d12837de79e..3bf23a02df9 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt @@ -29,8 +29,6 @@ import org.jetbrains.kotlin.psi2ir.intermediate.VariableLValue import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue -import java.lang.AssertionError import java.util.* class BodyGenerator( @@ -297,8 +295,9 @@ class BodyGenerator( // Default enum entry constructor val enumClassConstructor = - enumClassDescriptor.constructors.singleOrNull { it.valueParameters.all { it.hasDefaultValue() } } - ?: throw AssertionError("Enum class $enumClassDescriptor should have a default constructor") + enumClassDescriptor.constructors.singleOrNull { constructor -> + constructor.valueParameters.all(ValueParameterDescriptor::declaresDefaultValue) + } ?: throw AssertionError("Enum class $enumClassDescriptor should have a default constructor") return IrEnumConstructorCallImpl( ktEnumEntry.startOffset, ktEnumEntry.endOffset, context.symbolTable.referenceConstructor(enumClassConstructor) @@ -315,4 +314,3 @@ class BodyGenerator( ) } - diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper.kt index fc779c082a8..d065ead6099 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.calls.model.* -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import java.util.* class ArgumentsToParametersMapper { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtils.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtils.kt index 47b27234bfa..081596cb96e 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtils.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsUtils.kt @@ -24,13 +24,13 @@ import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.resolve.calls.model.CollectionLiteralKotlinCallArgument import org.jetbrains.kotlin.resolve.calls.model.KotlinCallArgument import org.jetbrains.kotlin.resolve.calls.model.SimpleKotlinCallArgument +import org.jetbrains.kotlin.resolve.descriptorUtil.declaresOrInheritsDefaultValue import org.jetbrains.kotlin.resolve.descriptorUtil.isParameterOfAnnotation import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastInfo import org.jetbrains.kotlin.types.UnwrappedType import org.jetbrains.kotlin.types.checker.intersectWrappedTypes import org.jetbrains.kotlin.utils.addToStdlib.safeAs - internal fun unexpectedArgument(argument: KotlinCallArgument): Nothing = error("Unexpected argument type: $argument, ${argument.javaClass.canonicalName}.") @@ -58,6 +58,13 @@ internal fun KotlinCallArgument.getExpectedType(parameter: ParameterDescriptor, val ValueParameterDescriptor.isVararg: Boolean get() = varargElementType != null val ParameterDescriptor.isVararg: Boolean get() = this.safeAs()?.isVararg ?: false +/** + * @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 { + return declaresOrInheritsDefaultValue() +} + private fun KotlinCallArgument.isArrayAssignedAsNamedArgumentInAnnotation( parameter: ParameterDescriptor, languageVersionSettings: LanguageVersionSettings diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt index 4df725f9ee2..a78565f0e6f 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/results/FlatSignature.kt @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.checker.captureFromExpression diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt index e80ce2ba8ba..991ae71e83e 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/lazy/descriptors/LazyJavaClassMemberScope.kt @@ -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() diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index b5ef03bd433..1e876a63793 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -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)}") } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt index c06a882e8cb..9f8cc838968 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.kt @@ -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 { 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 = - 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) diff --git a/core/descriptors/src/org/jetbrains/kotlin/util/modifierChecks.kt b/core/descriptors/src/org/jetbrains/kotlin/util/modifierChecks.kt index cd720918e9e..17a71c8428a 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/util/modifierChecks.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/util/modifierChecks.kt @@ -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), diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KParameterImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KParameterImpl.kt index 4598d2f1598..5a024be5dde 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KParameterImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KParameterImpl.kt @@ -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 } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/renderersUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/renderersUtil.kt index 84aeb30994c..ac6307e1e26 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/renderersUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/renderersUtil.kt @@ -28,8 +28,8 @@ import org.jetbrains.kotlin.renderer.RenderingFormat import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.callUtil.hasTypeMismatchErrorOnParameter import org.jetbrains.kotlin.resolve.calls.callUtil.hasUnmappedArguments +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.types.ErrorUtils private val RED_TEMPLATE = "%s" diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/InsertHandlerProvider.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/InsertHandlerProvider.kt index c9a3d98a5b8..8acce6d1753 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/InsertHandlerProvider.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/InsertHandlerProvider.kt @@ -26,8 +26,8 @@ import org.jetbrains.kotlin.idea.core.ExpectedInfo import org.jetbrains.kotlin.idea.core.fuzzyType import org.jetbrains.kotlin.idea.util.CallType import org.jetbrains.kotlin.idea.util.fuzzyReturnType +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.calls.util.getValueParametersCountFromFunctionType -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.types.KotlinType import java.util.* diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt index 7f3d4b3e823..3a0636d0ca5 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/LookupElementFactory.kt @@ -34,8 +34,8 @@ import org.jetbrains.kotlin.idea.util.ReceiverType import org.jetbrains.kotlin.idea.util.toFuzzyType import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.render +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.calls.util.getValueParametersCountFromFunctionType -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.descriptorUtil.overriddenTreeUniqueAsSequence import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/MultipleArgumentsItemProvider.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/MultipleArgumentsItemProvider.kt index 817b47f0e17..5ab8f493817 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/MultipleArgumentsItemProvider.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/MultipleArgumentsItemProvider.kt @@ -37,7 +37,7 @@ import org.jetbrains.kotlin.psi.Call import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.utils.findVariable diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ExpectedInfos.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ExpectedInfos.kt index b80236f0516..3cafd26abfb 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ExpectedInfos.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ExpectedInfos.kt @@ -32,10 +32,10 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.getTargetFunctionDescript import org.jetbrains.kotlin.resolve.calls.CallTransformer import org.jetbrains.kotlin.resolve.calls.callUtil.allArgumentsMapped import org.jetbrains.kotlin.resolve.calls.callUtil.getCall +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.util.DelegatingCall import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.* import java.util.* diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/OptionalParametersHelper.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/OptionalParametersHelper.kt index 13e21077c55..ef8f53d5c62 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/OptionalParametersHelper.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/OptionalParametersHelper.kt @@ -30,10 +30,10 @@ import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getParameterForArgument import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import java.util.* diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index 57c54c354a5..31857f1ce5a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -34,7 +34,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.isDynamic diff --git a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt index f98b65cc2ad..1b8e1a8afcc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt @@ -44,9 +44,9 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getCall import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch import org.jetbrains.kotlin.resolve.calls.util.DelegatingCall -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.types.KotlinType diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt index 60508a68448..38fc53683c9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/replaceWith/DeprecatedSymbolUsageFixBase.kt @@ -43,11 +43,11 @@ import org.jetbrains.kotlin.psi.psiUtil.isCallee import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.annotations.argumentValue import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.calls.model.isReallySuccess import org.jetbrains.kotlin.resolve.constants.AnnotationValue import org.jetbrains.kotlin.resolve.constants.ArrayValue import org.jetbrains.kotlin.resolve.constants.StringValue -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.util.constructors import org.jetbrains.kotlin.utils.addToStdlib.safeAs diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsInheritanceChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsInheritanceChecker.kt index 462f12d7368..ad2b570d20f 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsInheritanceChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsInheritanceChecker.kt @@ -23,9 +23,9 @@ import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue +import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.types.typeUtil.immediateSupertypes diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java index 66d519379a7..d6e898298ea 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/JsDataClassGenerator.java @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtParameter; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingContextUtils; -import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt; +import org.jetbrains.kotlin.resolve.calls.components.ArgumentsUtilsKt; import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; import java.util.ArrayList; @@ -83,7 +83,7 @@ class JsDataClassGenerator extends DataClassMethodGenerator { JsExpression argumentValue; JsExpression parameterValue = new JsNameRef(paramName); if (!constructorParam.hasValOrVar()) { - assert !DescriptorUtilsKt.hasDefaultValue(function.getValueParameters().get(i)); + assert !ArgumentsUtilsKt.hasDefaultValue(function.getValueParameters().get(i)); // Caller cannot rely on default value and pass undefined here. argumentValue = parameterValue; } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt index 1c727186ddb..24ac029bd21 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/expression/FunctionTranslator.kt @@ -35,8 +35,8 @@ import org.jetbrains.kotlin.js.translate.utils.FunctionBodyTranslator.translateF import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.psi.KtDeclarationWithBody import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.source.PsiSourceFile import org.jetbrains.kotlin.resolve.source.getPsi diff --git a/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt b/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt index 9dc8c6c11c5..a6c9aa51f0f 100644 --- a/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt +++ b/plugins/noarg/noarg-cli/src/NoArgExpressionCodegenExtension.kt @@ -16,20 +16,20 @@ package org.jetbrains.kotlin.noarg -import org.jetbrains.kotlin.codegen.* +import org.jetbrains.kotlin.codegen.ExpressionCodegen +import org.jetbrains.kotlin.codegen.FunctionGenerationStrategy.CodegenBased +import org.jetbrains.kotlin.codegen.ImplementationBodyCodegen import org.jetbrains.kotlin.codegen.extensions.ExpressionCodegenExtension import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature -import org.jetbrains.kotlin.codegen.FunctionGenerationStrategy.CodegenBased -import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.org.objectweb.asm.Opcodes class NoArgExpressionCodegenExtension(val invokeInitializers: Boolean = false) : ExpressionCodegenExtension { @@ -93,7 +93,7 @@ class NoArgExpressionCodegenExtension(val invokeInitializers: Boolean = false) : private fun ClassConstructorDescriptor.isZeroParameterConstructor(): Boolean { val parameters = this.valueParameters - return parameters.isEmpty() - || (parameters.all { it.hasDefaultValue() } && (isPrimary || findJvmOverloadsAnnotation() != null)) + return parameters.isEmpty() || + (parameters.all { it.declaresDefaultValue() } && (isPrimary || findJvmOverloadsAnnotation() != null)) } -} \ No newline at end of file +} diff --git a/plugins/noarg/noarg-cli/src/org/jetbrains/kotlin/noarg/diagnostic/CliNoArgDeclarationChecker.kt b/plugins/noarg/noarg-cli/src/org/jetbrains/kotlin/noarg/diagnostic/CliNoArgDeclarationChecker.kt index 6be1da4167e..39597a1aff5 100644 --- a/plugins/noarg/noarg-cli/src/org/jetbrains/kotlin/noarg/diagnostic/CliNoArgDeclarationChecker.kt +++ b/plugins/noarg/noarg-cli/src/org/jetbrains/kotlin/noarg/diagnostic/CliNoArgDeclarationChecker.kt @@ -16,10 +16,7 @@ package org.jetbrains.kotlin.noarg.diagnostic -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.ConstructorDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.reportFromPlugin import org.jetbrains.kotlin.extensions.AnnotationBasedExtension import org.jetbrains.kotlin.noarg.NO_ARG_CLASS_KEY @@ -29,7 +26,6 @@ import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny -import org.jetbrains.kotlin.resolve.descriptorUtil.hasDefaultValue class CliNoArgDeclarationChecker(val noArgAnnotationFqNames: List) : AbstractNoArgDeclarationChecker() { override fun getAnnotationFqNames(modifierListOwner: KtModifierListOwner?) = noArgAnnotationFqNames @@ -52,5 +48,5 @@ abstract class AbstractNoArgDeclarationChecker : DeclarationChecker, AnnotationB } } - private fun ConstructorDescriptor.isNoArgConstructor() = (valueParameters.isEmpty()) || valueParameters.all { it.hasDefaultValue() } + private fun ConstructorDescriptor.isNoArgConstructor() = valueParameters.all(ValueParameterDescriptor::declaresDefaultValue) }