Extract method refactoring should order parameters by first usage

Fixes #KT-16198
This commit is contained in:
Kirill Rakhman
2017-03-05 13:26:04 +01:00
committed by asedunov
parent 1296c5444b
commit 646f50dd66
30 changed files with 76 additions and 79 deletions
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2016 JetBrains s.r.o. * Copyright 2010-2017 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.cfg.pseudocodeTraverser.traverseFollowingInstruction
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
@@ -65,7 +64,6 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsStatement import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsStatement
import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
@@ -694,7 +692,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult {
} }
} }
) )
val adjustedParameters = paramsInfo.parameters.filterTo(HashSet<Parameter>()) { it.refCount > 0 } val adjustedParameters = paramsInfo.parameters.filterTo(LinkedHashSet<Parameter>()) { it.refCount > 0 }
val receiverCandidates = adjustedParameters.filterTo(HashSet<Parameter>()) { it.receiverCandidate } val receiverCandidates = adjustedParameters.filterTo(HashSet<Parameter>()) { it.receiverCandidate }
val receiverParameter = if (receiverCandidates.size == 1 && !options.canWrapInWith) receiverCandidates.first() else null val receiverParameter = if (receiverCandidates.size == 1 && !options.canWrapInWith) receiverCandidates.first() else null
@@ -705,7 +703,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult {
bindingContext, bindingContext,
suggestFunctionNames(returnType), suggestFunctionNames(returnType),
getDefaultVisibility(), getDefaultVisibility(),
adjustedParameters.sortedBy { it.name }, adjustedParameters.toList(),
receiverParameter, receiverParameter,
paramsInfo.typeParameters.sortedBy { it.originalDeclaration.name!! }, paramsInfo.typeParameters.sortedBy { it.originalDeclaration.name!! },
paramsInfo.replacementMap, paramsInfo.replacementMap,
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2016 JetBrains s.r.o. * Copyright 2010-2017 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -26,8 +26,6 @@ import org.jetbrains.kotlin.cfg.pseudocode.getExpectedTypePredicate
import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.InstructionWithReceivers import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.InstructionWithReceivers
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.KotlinNameSuggester
import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator
@@ -47,7 +45,6 @@ import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
@@ -62,7 +59,7 @@ import java.util.*
internal class ParametersInfo { internal class ParametersInfo {
var errorMessage: AnalysisResult.ErrorMessage? = null var errorMessage: AnalysisResult.ErrorMessage? = null
val originalRefToParameter = MultiMap.create<KtSimpleNameExpression, MutableParameter>() val originalRefToParameter = MultiMap.create<KtSimpleNameExpression, MutableParameter>()
val parameters = HashSet<MutableParameter>() val parameters = LinkedHashSet<MutableParameter>()
val typeParameters = HashSet<TypeParameter>() val typeParameters = HashSet<TypeParameter>()
val nonDenotableTypes = HashSet<KotlinType>() val nonDenotableTypes = HashSet<KotlinType>()
val replacementMap = MultiMap.create<KtSimpleNameExpression, Replacement>() val replacementMap = MultiMap.create<KtSimpleNameExpression, Replacement>()
@@ -78,7 +75,7 @@ internal fun ExtractionData.inferParametersInfo(
): ParametersInfo { ): ParametersInfo {
val info = ParametersInfo() val info = ParametersInfo()
val extractedDescriptorToParameter = HashMap<DeclarationDescriptor, MutableParameter>() val extractedDescriptorToParameter = LinkedHashMap<DeclarationDescriptor, MutableParameter>()
for (refInfo in getBrokenReferencesInfo(virtualBlock)) { for (refInfo in getBrokenReferencesInfo(virtualBlock)) {
val ref = refInfo.refExpr val ref = refInfo.refExpr
@@ -1,8 +1,8 @@
// WITH_RUNTIME // WITH_RUNTIME
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
var b: Int = 1 var b: Int = 1
@@ -1,16 +1,16 @@
// WITH_RUNTIME // WITH_RUNTIME
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
var b: Int = 1 var b: Int = 1
return i(a, b) return i(b, a)
} }
private fun i(a: Int, b: Int): Int { private fun i(b: Int, a: Int): Int {
var b1 = b var b1 = b
b1 += a b1 += a
println(b1) println(b1)
@@ -2,8 +2,8 @@
// WITH_RUNTIME // WITH_RUNTIME
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
var b: Int = 1 var b: Int = 1
@@ -2,13 +2,13 @@
// WITH_RUNTIME // WITH_RUNTIME
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
var b: Int = 1 var b: Int = 1
val pair = pair(a, b) val pair = pair(b, a)
b = pair.second b = pair.second
val t = pair.first val t = pair.first
println(b) println(b)
@@ -16,7 +16,7 @@ fun foo(a: Int): Int {
return t return t
} }
private fun pair(a: Int, b: Int): Pair<Int, Int> { private fun pair(b: Int, a: Int): Pair<Int, Int> {
var b1 = b var b1 = b
return Pair({ b1 += a; b1 }(), b1) return Pair({ b1 += a; b1 }(), b1)
} }
@@ -2,8 +2,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
@@ -2,22 +2,22 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
var b: Int = 1 var b: Int = 1
var c: Int = 1 var c: Int = 1
val pair = pair(a, b, c) val pair = pair(b, a, c)
b = pair.first b = pair.first
c = pair.second c = pair.second
return b + c return b + c
} }
private fun pair(a: Int, b: Int, c: Int): Pair<Int, Int> { private fun pair(b: Int, a: Int, c: Int): Pair<Int, Int> {
var b1 = b var b1 = b
var c1 = c var c1 = c
b1 += a b1 += a
@@ -2,8 +2,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
@@ -2,8 +2,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
@@ -11,14 +11,14 @@ fun foo(a: Int): Int {
var c: Int = 1 var c: Int = 1
val pair = 2 val pair = 2
val pair1 = pair(a, b, c) val pair1 = pair(b, a, c)
b = pair1.first b = pair1.first
c = pair1.second c = pair1.second
return b + c return b + c
} }
private fun pair(a: Int, b: Int, c: Int): Pair<Int, Int> { private fun pair(b: Int, a: Int, c: Int): Pair<Int, Int> {
var b1 = b var b1 = b
var c1 = c var c1 = c
b1 += a b1 += a
@@ -1,7 +1,7 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
var b: Int = 1 var b: Int = 1
@@ -1,17 +1,17 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
var b: Int = 1 var b: Int = 1
b = i(a, b) b = i(b, a)
return b return b
} }
private fun i(a: Int, b: Int): Int { private fun i(b: Int, a: Int): Int {
var b1 = b var b1 = b
b1 += a b1 += a
println(b1) println(b1)
@@ -5,8 +5,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var e: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var e: kotlin.Int defined in foo
@@ -5,8 +5,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var e: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var e: kotlin.Int defined in foo
@@ -17,7 +17,7 @@ fun foo(a: Int): Int {
var d: Int = 1 var d: Int = 1
var e: Int = 1 var e: Int = 1
val list = list(a, b, c, d, e) val list = list(b, a, c, d, e)
b = list[0] b = list[0]
c = list[1] c = list[1]
d = list[2] d = list[2]
@@ -26,7 +26,7 @@ fun foo(a: Int): Int {
return b + c + d + e return b + c + d + e
} }
private fun list(a: Int, b: Int, c: Int, d: Int, e: Int): List<Int> { private fun list(b: Int, a: Int, c: Int, d: Int, e: Int): List<Int> {
var b1 = b var b1 = b
var c1 = c var c1 = c
var d1 = d var d1 = d
@@ -3,8 +3,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// SIBLING: // SIBLING:
@@ -3,8 +3,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// SIBLING: // SIBLING:
@@ -13,7 +13,7 @@ fun foo(a: Int): Int {
var c: Int = 1 var c: Int = 1
var d: Int = 1 var d: Int = 1
val triple = triple(a, b, c, d) val triple = triple(b, a, c, d)
b = triple.first b = triple.first
c = triple.second c = triple.second
d = triple.third d = triple.third
@@ -21,7 +21,7 @@ fun foo(a: Int): Int {
return b + c + d return b + c + d
} }
private fun triple(a: Int, b: Int, c: Int, d: Int): Triple<Int, Int, Int> { private fun triple(b: Int, a: Int, c: Int, d: Int): Triple<Int, Int, Int> {
var b1 = b var b1 = b
var c1 = c var c1 = c
var d1 = d var d1 = d
@@ -2,8 +2,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
@@ -2,20 +2,20 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var b: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo // PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING: // SIBLING:
fun foo(a: Int): Int { fun foo(a: Int): Int {
var b: Int = 1 var b: Int = 1
var c: Int = 1 var c: Int = 1
b = i(a, b, c) b = i(b, a, c)
return b return b
} }
private fun i(a: Int, b: Int, c: Int): Int { private fun i(b: Int, a: Int, c: Int): Int {
var b1 = b var b1 = b
var c1 = c var c1 = c
b1 += a b1 += a
@@ -1,7 +1,7 @@
// PARAM_TYPES: kotlin.String, kotlin.Comparable<kotlin.String>, kotlin.CharSequence, java.io.Serializable, kotlin.Any
// PARAM_TYPES: X<kotlin.Any> // PARAM_TYPES: X<kotlin.Any>
// PARAM_DESCRIPTOR: value-parameter s: kotlin.String? defined in foo // PARAM_TYPES: kotlin.String, kotlin.Comparable<kotlin.String>, kotlin.CharSequence, java.io.Serializable, kotlin.Any
// PARAM_DESCRIPTOR: value-parameter x: X<kotlin.Any> defined in foo // PARAM_DESCRIPTOR: value-parameter x: X<kotlin.Any> defined in foo
// PARAM_DESCRIPTOR: value-parameter s: kotlin.String? defined in foo
class X<T> { class X<T> {
fun add(t: T) { fun add(t: T) {
@@ -1,7 +1,7 @@
// PARAM_TYPES: kotlin.String, kotlin.Comparable<kotlin.String>, kotlin.CharSequence, java.io.Serializable, kotlin.Any
// PARAM_TYPES: X<kotlin.Any> // PARAM_TYPES: X<kotlin.Any>
// PARAM_DESCRIPTOR: value-parameter s: kotlin.String? defined in foo // PARAM_TYPES: kotlin.String, kotlin.Comparable<kotlin.String>, kotlin.CharSequence, java.io.Serializable, kotlin.Any
// PARAM_DESCRIPTOR: value-parameter x: X<kotlin.Any> defined in foo // PARAM_DESCRIPTOR: value-parameter x: X<kotlin.Any> defined in foo
// PARAM_DESCRIPTOR: value-parameter s: kotlin.String? defined in foo
class X<T> { class X<T> {
fun add(t: T) { fun add(t: T) {
@@ -11,10 +11,10 @@ class X<T> {
// SIBLING: // SIBLING:
fun foo(s: String?, x: X<Any>) { fun foo(s: String?, x: X<Any>) {
when { when {
s != null -> __dummyTestFun__(s, x) s != null -> __dummyTestFun__(x, s)
} }
} }
private fun __dummyTestFun__(s: String, x: X<Any>) { private fun __dummyTestFun__(x: X<Any>, s: String) {
x.add(s) x.add(s)
} }
@@ -1,7 +1,7 @@
// PARAM_TYPES: kotlin.String?, kotlin.Comparable<kotlin.String>?, kotlin.CharSequence?, java.io.Serializable?, kotlin.Any?
// PARAM_TYPES: X<kotlin.Any?> // PARAM_TYPES: X<kotlin.Any?>
// PARAM_DESCRIPTOR: value-parameter s: kotlin.String? defined in foo // PARAM_TYPES: kotlin.String?, kotlin.Comparable<kotlin.String>?, kotlin.CharSequence?, java.io.Serializable?, kotlin.Any?
// PARAM_DESCRIPTOR: value-parameter x: X<kotlin.Any?> defined in foo // PARAM_DESCRIPTOR: value-parameter x: X<kotlin.Any?> defined in foo
// PARAM_DESCRIPTOR: value-parameter s: kotlin.String? defined in foo
class X<T> { class X<T> {
fun add(t: T) { fun add(t: T) {
@@ -1,7 +1,7 @@
// PARAM_TYPES: kotlin.String?, kotlin.Comparable<kotlin.String>?, kotlin.CharSequence?, java.io.Serializable?, kotlin.Any?
// PARAM_TYPES: X<kotlin.Any?> // PARAM_TYPES: X<kotlin.Any?>
// PARAM_DESCRIPTOR: value-parameter s: kotlin.String? defined in foo // PARAM_TYPES: kotlin.String?, kotlin.Comparable<kotlin.String>?, kotlin.CharSequence?, java.io.Serializable?, kotlin.Any?
// PARAM_DESCRIPTOR: value-parameter x: X<kotlin.Any?> defined in foo // PARAM_DESCRIPTOR: value-parameter x: X<kotlin.Any?> defined in foo
// PARAM_DESCRIPTOR: value-parameter s: kotlin.String? defined in foo
class X<T> { class X<T> {
fun add(t: T) { fun add(t: T) {
@@ -11,10 +11,10 @@ class X<T> {
// SIBLING: // SIBLING:
fun foo(s: String?, x: X<Any?>) { fun foo(s: String?, x: X<Any?>) {
when { when {
s != null -> __dummyTestFun__(s, x) s != null -> __dummyTestFun__(x, s)
} }
} }
private fun __dummyTestFun__(s: String?, x: X<Any?>) { private fun __dummyTestFun__(x: X<Any?>, s: String?) {
x.add(s) x.add(s)
} }
@@ -1,8 +1,8 @@
// OPTIONS: true, false, false, false, true, false // OPTIONS: true, false, false, false, true, false
// PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int { fun foo(n: Int): Int {
fun Int.bar(m: Int) = this * m * n fun Int.bar(m: Int) = this * m * n
@@ -1,12 +1,12 @@
// OPTIONS: true, false, false, false, true, false // OPTIONS: true, false, false, false, true, false
// PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int { fun foo(n: Int): Int {
fun Int.bar(m: Int) = this * m * n fun Int.bar(m: Int) = this * m * n
return i(Int::bar, n) return i(n, Int::bar)
} }
private fun i(bar: Int.(m: Int) -> Int, n: Int) = n.bar(n + 1) private fun i(n: Int, bar: Int.(m: Int) -> Int) = n.bar(n + 1)
@@ -1,10 +1,11 @@
// OPTIONS: true, false, false, false, true, false // OPTIONS: true, false, false, false, true, false
// PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: local final fun kotlin.Int.bar1(m: kotlin.Int): kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar1(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_DESCRIPTOR: local final fun kotlin.Int.bar2(m: kotlin.Int): kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar2(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int { fun foo(n: Int): Int {
fun Int.bar1(m: Int) = this + m + n fun Int.bar1(m: Int) = this + m + n
fun Int.bar2(m: Int) = this * m * n fun Int.bar2(m: Int) = this * m * n
@@ -1,15 +1,16 @@
// OPTIONS: true, false, false, false, true, false // OPTIONS: true, false, false, false, true, false
// PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: local final fun kotlin.Int.bar1(m: kotlin.Int): kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar1(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_DESCRIPTOR: local final fun kotlin.Int.bar2(m: kotlin.Int): kotlin.Int defined in foo // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar2(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int { fun foo(n: Int): Int {
fun Int.bar1(m: Int) = this + m + n fun Int.bar1(m: Int) = this + m + n
fun Int.bar2(m: Int) = this * m * n fun Int.bar2(m: Int) = this * m * n
return i(Int::bar1, Int::bar2, n) return i(n, Int::bar1, Int::bar2)
} }
private fun i(bar1: Int.(m: Int) -> Int, bar2: Int.(m: Int) -> Int, n: Int) = n.bar1(n + 1).bar2(n + 2) private fun i(n: Int, bar1: Int.(m: Int) -> Int, bar2: Int.(m: Int) -> Int) = n.bar1(n + 1).bar2(n + 2)
@@ -1,8 +1,8 @@
// OPTIONS: true, false, false, false, true, false // OPTIONS: true, false, false, false, true, false
// PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int { fun foo(n: Int): Int {
fun Int.bar(m: Int) = this * m * n fun Int.bar(m: Int) = this * m * n
@@ -1,12 +1,12 @@
// OPTIONS: true, false, false, false, true, false // OPTIONS: true, false, false, false, true, false
// PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo // PARAM_DESCRIPTOR: value-parameter n: kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int // PARAM_DESCRIPTOR: local final fun kotlin.Int.bar(m: kotlin.Int): kotlin.Int defined in foo
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int { fun foo(n: Int): Int {
fun Int.bar(m: Int) = this * m * n fun Int.bar(m: Int) = this * m * n
return i(Int::bar, n) return i(n, Int::bar)
} }
private fun i(bar: Int.(m: Int) -> Int, n: Int) = n bar (n + 1) private fun i(n: Int, bar: Int.(m: Int) -> Int) = n bar (n + 1)
@@ -4,8 +4,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: A defined in foo // PARAM_DESCRIPTOR: value-parameter a: A defined in foo
// PARAM_DESCRIPTOR: val t: kotlin.Int defined in foo // PARAM_DESCRIPTOR: val t: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: val u: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter x: kotlin.Int defined in foo // PARAM_DESCRIPTOR: value-parameter x: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: val u: kotlin.Int defined in foo
// SIBLING: // SIBLING:
public class A() { public class A() {
fun bar(a: Int, b: Int): Int { fun bar(a: Int, b: Int): Int {
@@ -4,8 +4,8 @@
// PARAM_TYPES: kotlin.Int // PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: A defined in foo // PARAM_DESCRIPTOR: value-parameter a: A defined in foo
// PARAM_DESCRIPTOR: val t: kotlin.Int defined in foo // PARAM_DESCRIPTOR: val t: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: val u: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: value-parameter x: kotlin.Int defined in foo // PARAM_DESCRIPTOR: value-parameter x: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: val u: kotlin.Int defined in foo
// SIBLING: // SIBLING:
public class A() { public class A() {
fun bar(a: Int, b: Int): Int { fun bar(a: Int, b: Int): Int {
@@ -13,10 +13,10 @@ public class A() {
} }
} }
private fun i(a: A, t: Int, u: Int, x: Int) = a.bar(t - x, u + x) private fun i(a: A, t: Int, x: Int, u: Int) = a.bar(t - x, u + x)
fun foo(a: A, x: Int): Int { fun foo(a: A, x: Int): Int {
val t = 10 val t = 10
val u = 20 val u = 20
return i(a, t, u, x) return i(a, t, x, u)
} }