Skip to content

Commit 986eaeb

Browse files
committed
Refactoring
1 parent d53aa28 commit 986eaeb

File tree

3 files changed

+32
-42
lines changed

3 files changed

+32
-42
lines changed

idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineFunctionHandler.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import org.jetbrains.kotlin.idea.KotlinLanguage
3232
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
3333
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
3434
import org.jetbrains.kotlin.idea.codeInliner.CallableUsageReplacementStrategy
35-
import org.jetbrains.kotlin.idea.codeInliner.PropertyUsageReplacementStrategy
3635
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
3736
import org.jetbrains.kotlin.psi.KtExpression
3837
import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -64,7 +63,14 @@ class KotlinInlineFunctionHandler: InlineActionHandler() {
6463
}
6564

6665
val descriptor = element.resolveToDescriptor() as SimpleFunctionDescriptor
67-
val codeToInline = buildCodeToInline(element, descriptor.returnType, editor) ?: return
66+
val codeToInline = buildCodeToInline(
67+
element,
68+
descriptor.returnType,
69+
element.hasDeclaredReturnType(),
70+
element.bodyExpression!!,
71+
element.hasBlockBody(),
72+
editor
73+
) ?: return
6874

6975
val replacementStrategy = CallableUsageReplacementStrategy(codeToInline)
7076

idea/src/org/jetbrains/kotlin/idea/refactoring/inline/KotlinInlineValHandler.kt

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,23 @@ import com.intellij.refactoring.HelpID
2929
import com.intellij.refactoring.RefactoringBundle
3030
import com.intellij.refactoring.util.CommonRefactoringUtil
3131
import com.intellij.util.containers.MultiMap
32-
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
33-
import org.jetbrains.kotlin.descriptors.VariableDescriptor
32+
import org.jetbrains.kotlin.descriptors.ValueDescriptor
3433
import org.jetbrains.kotlin.idea.KotlinLanguage
35-
import org.jetbrains.kotlin.idea.analysis.analyzeInContext
36-
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
3734
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
3835
import org.jetbrains.kotlin.idea.codeInliner.CodeToInline
39-
import org.jetbrains.kotlin.idea.codeInliner.CodeToInlineBuilder
4036
import org.jetbrains.kotlin.idea.codeInliner.PropertyUsageReplacementStrategy
41-
import org.jetbrains.kotlin.idea.core.copied
4237
import org.jetbrains.kotlin.idea.project.builtIns
4338
import org.jetbrains.kotlin.idea.refactoring.checkConflictsInteractively
4439
import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
4540
import org.jetbrains.kotlin.idea.references.ReferenceAccess
4641
import org.jetbrains.kotlin.idea.references.readWriteAccess
47-
import org.jetbrains.kotlin.idea.util.getResolutionScope
4842
import org.jetbrains.kotlin.lexer.KtTokens
4943
import org.jetbrains.kotlin.psi.KtBinaryExpression
5044
import org.jetbrains.kotlin.psi.KtElement
5145
import org.jetbrains.kotlin.psi.KtExpression
5246
import org.jetbrains.kotlin.psi.KtProperty
5347
import org.jetbrains.kotlin.psi.psiUtil.getAssignmentByLHS
5448
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis
55-
import org.jetbrains.kotlin.resolve.BindingContext
56-
import org.jetbrains.kotlin.types.TypeUtils
5749

5850
class KotlinInlineValHandler : InlineActionHandler() {
5951

@@ -93,16 +85,21 @@ class KotlinInlineValHandler : InlineActionHandler() {
9385
val readReplacement: CodeToInline?
9486
val writeReplacement: CodeToInline?
9587
val assignmentToDelete: KtBinaryExpression?
88+
val descriptor = declaration.resolveToDescriptor() as ValueDescriptor
89+
val isTypeExplicit = declaration.typeReference != null
9690
if (getter == null && setter == null) {
9791
val initialization = extractInitialization(declaration, referenceExpressions, project, editor) ?: return
98-
readReplacement = buildCodeToInline(declaration, initialization.value)
92+
readReplacement = buildCodeToInline(declaration, descriptor.type, isTypeExplicit, initialization.value, false, editor) ?: return
9993
writeReplacement = null
10094
assignmentToDelete = initialization.assignment
10195
}
10296
else {
103-
val descriptor = declaration.resolveToDescriptor() as PropertyDescriptor
104-
readReplacement = getter?.let { buildCodeToInline(getter, descriptor.type, editor) ?: return }
105-
writeReplacement = setter?.let { buildCodeToInline(setter, setter.builtIns.unitType, editor) ?: return }
97+
readReplacement = getter?.let {
98+
buildCodeToInline(getter, descriptor.type, isTypeExplicit, getter.bodyExpression!!, getter.hasBlockBody(), editor) ?: return
99+
}
100+
writeReplacement = setter?.let {
101+
buildCodeToInline(setter, setter.builtIns.unitType, true, setter.bodyExpression!!, setter.hasBlockBody(), editor) ?: return
102+
}
106103
assignmentToDelete = null
107104
}
108105

@@ -175,24 +172,6 @@ class KotlinInlineValHandler : InlineActionHandler() {
175172
}
176173
}
177174

178-
private fun buildCodeToInline(declaration: KtProperty, initializer: KtExpression): CodeToInline {
179-
val descriptor = declaration.resolveToDescriptor() as VariableDescriptor
180-
val expectedType = if (declaration.typeReference != null)
181-
descriptor.returnType ?: TypeUtils.NO_EXPECTED_TYPE
182-
else
183-
TypeUtils.NO_EXPECTED_TYPE
184-
185-
val initializerCopy = initializer.copied()
186-
fun analyzeInitializerCopy(): BindingContext {
187-
return initializerCopy.analyzeInContext(initializer.getResolutionScope(),
188-
contextExpression = initializer,
189-
expectedType = expectedType)
190-
}
191-
192-
val codeToInlineBuilder = CodeToInlineBuilder(descriptor, declaration.getResolutionFacade())
193-
return codeToInlineBuilder.prepareCodeToInline(initializerCopy, emptyList(), ::analyzeInitializerCopy)
194-
}
195-
196175
private fun performRefactoring(
197176
declaration: KtProperty,
198177
readReplacement: CodeToInline?,

idea/src/org/jetbrains/kotlin/idea/refactoring/inline/inlineUtils.kt

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import com.intellij.refactoring.util.CommonRefactoringUtil
2929
import com.intellij.refactoring.util.RefactoringMessageDialog
3030
import com.intellij.usageView.UsageInfo
3131
import org.jetbrains.kotlin.descriptors.CallableDescriptor
32-
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
3332
import org.jetbrains.kotlin.idea.analysis.analyzeInContext
3433
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
3534
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
@@ -114,24 +113,30 @@ internal fun <E : KtElement> postProcessInternalReferences(inlinedElement: E): E
114113
return pointer.element
115114
}
116115

117-
internal fun buildCodeToInline(declaration: KtDeclarationWithBody, returnType: KotlinType?, editor: Editor?): CodeToInline? {
118-
val bodyExpression = declaration.bodyExpression!!
119-
val bodyCopy = bodyExpression.copied()
120-
121-
val expectedType = if (!declaration.hasBlockBody() && declaration.hasDeclaredReturnType())
116+
internal fun buildCodeToInline(
117+
declaration: KtDeclaration,
118+
returnType: KotlinType?,
119+
isReturnTypeExplicit: Boolean,
120+
bodyOrInitializer: KtExpression,
121+
isBlockBody: Boolean,
122+
editor: Editor?
123+
): CodeToInline? {
124+
val bodyCopy = bodyOrInitializer.copied()
125+
126+
val expectedType = if (!isBlockBody && isReturnTypeExplicit)
122127
returnType ?: TypeUtils.NO_EXPECTED_TYPE
123128
else
124129
TypeUtils.NO_EXPECTED_TYPE
125130

126131
fun analyzeBodyCopy(): BindingContext {
127-
return bodyCopy.analyzeInContext(bodyExpression.getResolutionScope(),
128-
contextExpression = bodyExpression,
132+
return bodyCopy.analyzeInContext(bodyOrInitializer.getResolutionScope(),
133+
contextExpression = bodyOrInitializer,
129134
expectedType = expectedType)
130135
}
131136

132137
val descriptor = declaration.resolveToDescriptor()
133138
val builder = CodeToInlineBuilder(descriptor as CallableDescriptor, declaration.getResolutionFacade())
134-
if (declaration.hasBlockBody()) {
139+
if (isBlockBody) {
135140
bodyCopy as KtBlockExpression
136141
val statements = bodyCopy.statements
137142

0 commit comments

Comments
 (0)