Reformat: ChangeMemberFunctionSignatureFix
This commit is contained in:
committed by
Mikhail Glukhikh
parent
2c59f96ca4
commit
0cb907d637
@@ -55,8 +55,8 @@ import java.util.*
|
||||
* Fix that changes member function's signature to match one of super functions' signatures.
|
||||
*/
|
||||
class ChangeMemberFunctionSignatureFix private constructor(
|
||||
element: KtNamedFunction,
|
||||
private val signatures: List<ChangeMemberFunctionSignatureFix.Signature>
|
||||
element: KtNamedFunction,
|
||||
private val signatures: List<ChangeMemberFunctionSignatureFix.Signature>
|
||||
) : KotlinQuickFixAction<KtNamedFunction>(element) {
|
||||
|
||||
init {
|
||||
@@ -100,15 +100,14 @@ class ChangeMemberFunctionSignatureFix private constructor(
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL)
|
||||
?: return emptyList()
|
||||
val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return emptyList()
|
||||
val superFunctions = getPossibleSuperFunctionsDescriptors(functionDescriptor)
|
||||
|
||||
return superFunctions
|
||||
.filter { it.kind.isReal }
|
||||
.map { signatureToMatch(functionDescriptor, it) }
|
||||
.distinctBy { it.sourceCode }
|
||||
.sortedBy { it.preview }
|
||||
.filter { it.kind.isReal }
|
||||
.map { signatureToMatch(functionDescriptor, it) }
|
||||
.distinctBy { it.sourceCode }
|
||||
.sortedBy { it.preview }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -128,13 +127,15 @@ class ChangeMemberFunctionSignatureFix private constructor(
|
||||
matchParameters(ParameterChooser.MatchTypes, superParameters, parameters, newParameters, matched, used)
|
||||
|
||||
val newFunction = replaceFunctionParameters(
|
||||
superFunction.copy(
|
||||
function.containingDeclaration,
|
||||
Modality.OPEN,
|
||||
findMemberWithMaxVisibility(listOf(superFunction, function)).visibility,
|
||||
CallableMemberDescriptor.Kind.DELEGATION,
|
||||
/* copyOverrides = */ true),
|
||||
newParameters)
|
||||
superFunction.copy(
|
||||
function.containingDeclaration,
|
||||
Modality.OPEN,
|
||||
findMemberWithMaxVisibility(listOf(superFunction, function)).visibility,
|
||||
CallableMemberDescriptor.Kind.DELEGATION,
|
||||
/* copyOverrides = */ true
|
||||
),
|
||||
newParameters
|
||||
)
|
||||
newFunction.setSingleOverridden(superFunction)
|
||||
|
||||
return Signature(newFunction)
|
||||
@@ -154,12 +155,12 @@ class ChangeMemberFunctionSignatureFix private constructor(
|
||||
* @param used - true iff this parameter in function is used to match some parameter in super function (may be modified by this function)
|
||||
*/
|
||||
private fun matchParameters(
|
||||
parameterChooser: ParameterChooser,
|
||||
superParameters: List<ValueParameterDescriptor>,
|
||||
parameters: List<ValueParameterDescriptor>,
|
||||
newParameters: MutableList<ValueParameterDescriptor>,
|
||||
matched: BitSet,
|
||||
used: BitSet
|
||||
parameterChooser: ParameterChooser,
|
||||
superParameters: List<ValueParameterDescriptor>,
|
||||
parameters: List<ValueParameterDescriptor>,
|
||||
newParameters: MutableList<ValueParameterDescriptor>,
|
||||
matched: BitSet,
|
||||
used: BitSet
|
||||
) {
|
||||
for (superParameter in superParameters) {
|
||||
if (!matched[superParameter.index]) {
|
||||
@@ -185,8 +186,8 @@ class ChangeMemberFunctionSignatureFix private constructor(
|
||||
|
||||
val name = functionDescriptor.name
|
||||
return containingClass.defaultType.supertypes()
|
||||
.flatMap { supertype -> supertype.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_IDE) }
|
||||
.filter { it.kind.isReal && it.isOverridable }
|
||||
.flatMap { supertype -> supertype.memberScope.getContributedFunctions(name, NoLookupLocation.FROM_IDE) }
|
||||
.filter { it.kind.isReal && it.isOverridable }
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -194,29 +195,29 @@ class ChangeMemberFunctionSignatureFix private constructor(
|
||||
* Note that parameters may belong to other methods or have incorrect "index" property -- it will be fixed by this function.
|
||||
*/
|
||||
private fun replaceFunctionParameters(
|
||||
function: FunctionDescriptor,
|
||||
newParameters: List<ValueParameterDescriptor>
|
||||
function: FunctionDescriptor,
|
||||
newParameters: List<ValueParameterDescriptor>
|
||||
): FunctionDescriptor {
|
||||
val descriptor = SimpleFunctionDescriptorImpl.create(
|
||||
function.containingDeclaration,
|
||||
function.annotations,
|
||||
function.name,
|
||||
function.kind,
|
||||
SourceElement.NO_SOURCE
|
||||
function.containingDeclaration,
|
||||
function.annotations,
|
||||
function.name,
|
||||
function.kind,
|
||||
SourceElement.NO_SOURCE
|
||||
)
|
||||
|
||||
val parameters = newParameters.withIndex().map { (index, parameter) ->
|
||||
ValueParameterDescriptorImpl(
|
||||
descriptor, null, index,
|
||||
parameter.annotations, parameter.name, parameter.returnType!!, parameter.declaresDefaultValue(),
|
||||
parameter.isCrossinline, parameter.isNoinline, parameter.varargElementType, SourceElement.NO_SOURCE
|
||||
descriptor, null, index,
|
||||
parameter.annotations, parameter.name, parameter.returnType!!, parameter.declaresDefaultValue(),
|
||||
parameter.isCrossinline, parameter.isNoinline, parameter.varargElementType, SourceElement.NO_SOURCE
|
||||
)
|
||||
}
|
||||
|
||||
return descriptor.apply {
|
||||
initialize(
|
||||
function.extensionReceiverParameter?.type, function.dispatchReceiverParameter,
|
||||
function.typeParameters, parameters, function.returnType, function.modality, function.visibility
|
||||
function.extensionReceiverParameter?.type, function.dispatchReceiverParameter,
|
||||
function.typeParameters, parameters, function.returnType, function.modality, function.visibility
|
||||
)
|
||||
isOperator = function.isOperator
|
||||
isInfix = function.isInfix
|
||||
@@ -264,8 +265,7 @@ class ChangeMemberFunctionSignatureFix private constructor(
|
||||
// TODO: support for generic functions
|
||||
return if (KotlinTypeChecker.DEFAULT.equalTypes(parameter.type, superParameter.type)) {
|
||||
superParameter.copy(parameter.containingDeclaration, parameter.name, parameter.index)
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}
|
||||
@@ -274,10 +274,10 @@ class ChangeMemberFunctionSignatureFix private constructor(
|
||||
}
|
||||
|
||||
private class MyAction(
|
||||
private val project: Project,
|
||||
private val editor: Editor?,
|
||||
private val function: KtNamedFunction,
|
||||
private val signatures: List<Signature>
|
||||
private val project: Project,
|
||||
private val editor: Editor?,
|
||||
private val function: KtNamedFunction,
|
||||
private val signatures: List<Signature>
|
||||
) {
|
||||
fun execute() {
|
||||
PsiDocumentManager.getInstance(project).commitAllDocuments()
|
||||
@@ -286,8 +286,7 @@ class ChangeMemberFunctionSignatureFix private constructor(
|
||||
|
||||
if (signatures.size == 1 || editor == null || !editor.component.isShowing) {
|
||||
changeSignature(signatures.first())
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
chooseSignatureAndChange()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user