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