Reformat: ChangeMemberFunctionSignatureFix

This commit is contained in:
Toshiaki Kameyama
2018-05-24 10:59:32 +03:00
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()
} }
} }