[extract method with object] add type parameters to variable declaration

GitOrigin-RevId: 4b54ce2391e2d099800d887ccf433dde47e0114e
This commit is contained in:
Alexandr Suhinin
2023-01-30 21:35:34 +00:00
committed by intellij-monorepo-bot
parent a2193a2447
commit 17a785e6b6
2 changed files with 16 additions and 8 deletions
@@ -114,15 +114,16 @@ object ParameterObjectExtractor {
declaration: PsiVariable,
referencesToDeclaration: List<PsiReferenceExpression>): List<TemplateField> {
val file = introducedClass.containingFile
val classReference = (declaration.initializer as? PsiNewExpression)?.classReference?.element ?: throw IllegalStateException()
val variableName = declaration.nameIdentifier ?: throw IllegalStateException()
val classReference = (declaration.initializer as? PsiNewExpression)?.classReference?.referenceNameElement ?: throw IllegalStateException()
val constructorIdentifiers = introducedClass.constructors.mapNotNull { method -> method.nameIdentifier }
val typeIdentifiersToUpdate = listOfNotNull(declaration.typeElement, introducedClass.nameIdentifier) + constructorIdentifiers
val declarationTypeIdentifier = declaration.typeElement?.innermostComponentReferenceElement?.referenceNameElement
val typeIdentifiersToUpdate = listOfNotNull(declarationTypeIdentifier, introducedClass.nameIdentifier) + constructorIdentifiers
val typeNameField = TemplateField(
classReference.textRange,
typeIdentifiersToUpdate.map(PsiElement::getTextRange),
validator = { variableRange -> InplaceExtractUtils.checkClassReference(editor, file, variableRange) }
)
val variableName = declaration.nameIdentifier ?: throw IllegalStateException()
val variableNameField = TemplateField(
variableName.textRange,
referencesToDeclaration.map(PsiElement::getTextRange),
@@ -1,20 +1,27 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.refactoring.extractMethod.newImpl.parameterObject
import com.intellij.codeInsight.daemon.impl.analysis.HighlightingFeature
import com.intellij.psi.*
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.util.PsiUtil
import com.siyeh.ig.psiutils.TypeUtils
object ParameterObjectUtils {
fun createDeclaration(introducedClass: PsiClass): PsiDeclarationStatement {
val parameters = introducedClass.constructors.first().parameterList.parameters.map(PsiParameter::getName).joinToString(separator = ",")
val initializer = "new ${introducedClass.name}($parameters)"
val factory = PsiElementFactory.getInstance(introducedClass.project)
val expression = factory.createExpressionFromText(initializer, introducedClass)
return factory.createVariableDeclarationStatement("result", TypeUtils.getType(introducedClass), expression)
val typeParameters = introducedClass.typeParameters.map(factory::createType).toTypedArray()
val type = factory.createType(introducedClass, *typeParameters)
val typeElement = if (HighlightingFeature.DIAMOND_TYPES.isAvailable(introducedClass) && typeParameters.isNotEmpty()) {
"${type.name}<>"
} else {
type.canonicalText
}
val constructor = introducedClass.constructors.first()
val parameters = constructor.parameterList.parameters.joinToString(separator = ",") { it.name }
val expression = factory.createExpressionFromText("new $typeElement($parameters)", introducedClass)
return factory.createVariableDeclarationStatement("result", type, expression)
}
fun findAffectedReferences(variables: List<PsiVariable>, startingElement: PsiElement?): List<PsiReferenceExpression> {