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");
* 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.impl.LocalVariableDescriptor
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.findModuleDescriptor
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.bindingContextUtil.isUsedAsStatement
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.types.*
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 receiverParameter = if (receiverCandidates.size == 1 && !options.canWrapInWith) receiverCandidates.first() else null
@@ -705,7 +703,7 @@ fun ExtractionData.performAnalysis(): AnalysisResult {
bindingContext,
suggestFunctionNames(returnType),
getDefaultVisibility(),
adjustedParameters.sortedBy { it.name },
adjustedParameters.toList(),
receiverParameter,
paramsInfo.typeParameters.sortedBy { it.originalDeclaration.name!! },
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");
* 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.descriptors.*
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.core.KotlinNameSuggester
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.fqNameSafe
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.receivers.ExpressionReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
@@ -62,7 +59,7 @@ import java.util.*
internal class ParametersInfo {
var errorMessage: AnalysisResult.ErrorMessage? = null
val originalRefToParameter = MultiMap.create<KtSimpleNameExpression, MutableParameter>()
val parameters = HashSet<MutableParameter>()
val parameters = LinkedHashSet<MutableParameter>()
val typeParameters = HashSet<TypeParameter>()
val nonDenotableTypes = HashSet<KotlinType>()
val replacementMap = MultiMap.create<KtSimpleNameExpression, Replacement>()
@@ -78,7 +75,7 @@ internal fun ExtractionData.inferParametersInfo(
): ParametersInfo {
val info = ParametersInfo()
val extractedDescriptorToParameter = HashMap<DeclarationDescriptor, MutableParameter>()
val extractedDescriptorToParameter = LinkedHashMap<DeclarationDescriptor, MutableParameter>()
for (refInfo in getBrokenReferencesInfo(virtualBlock)) {
val ref = refInfo.refExpr
@@ -1,8 +1,8 @@
// WITH_RUNTIME
// 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: value-parameter a: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
@@ -1,16 +1,16 @@
// WITH_RUNTIME
// 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: value-parameter a: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
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
b1 += a
println(b1)
@@ -2,8 +2,8 @@
// WITH_RUNTIME
// 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: value-parameter a: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
@@ -2,13 +2,13 @@
// WITH_RUNTIME
// 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: value-parameter a: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
val pair = pair(a, b)
val pair = pair(b, a)
b = pair.second
val t = pair.first
println(b)
@@ -16,7 +16,7 @@ fun foo(a: Int): Int {
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
return Pair({ b1 += a; b1 }(), b1)
}
@@ -2,8 +2,8 @@
// 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: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
@@ -2,22 +2,22 @@
// 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: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
val pair = pair(a, b, c)
val pair = pair(b, a, c)
b = pair.first
c = pair.second
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 c1 = c
b1 += a
@@ -2,8 +2,8 @@
// 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: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
@@ -2,8 +2,8 @@
// 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: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
@@ -11,14 +11,14 @@ fun foo(a: Int): Int {
var c: Int = 1
val pair = 2
val pair1 = pair(a, b, c)
val pair1 = pair(b, a, c)
b = pair1.first
c = pair1.second
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 c1 = c
b1 += a
@@ -1,7 +1,7 @@
// 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: value-parameter a: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
@@ -1,17 +1,17 @@
// 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: value-parameter a: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
b = i(a, b)
b = i(b, a)
return b
}
private fun i(a: Int, b: Int): Int {
private fun i(b: Int, a: Int): Int {
var b1 = b
b1 += a
println(b1)
@@ -5,8 +5,8 @@
// 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: value-parameter a: 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 e: kotlin.Int defined in foo
@@ -5,8 +5,8 @@
// 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: value-parameter a: 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 e: kotlin.Int defined in foo
@@ -17,7 +17,7 @@ fun foo(a: Int): Int {
var d: 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]
c = list[1]
d = list[2]
@@ -26,7 +26,7 @@ fun foo(a: Int): Int {
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 c1 = c
var d1 = d
@@ -3,8 +3,8 @@
// 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: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// SIBLING:
@@ -3,8 +3,8 @@
// 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: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var d: kotlin.Int defined in foo
// SIBLING:
@@ -13,7 +13,7 @@ fun foo(a: Int): Int {
var c: Int = 1
var d: Int = 1
val triple = triple(a, b, c, d)
val triple = triple(b, a, c, d)
b = triple.first
c = triple.second
d = triple.third
@@ -21,7 +21,7 @@ fun foo(a: Int): Int {
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 c1 = c
var d1 = d
@@ -2,8 +2,8 @@
// 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: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
@@ -2,20 +2,20 @@
// 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: value-parameter a: kotlin.Int defined in foo
// PARAM_DESCRIPTOR: var c: kotlin.Int defined in foo
// SIBLING:
fun foo(a: Int): Int {
var b: Int = 1
var c: Int = 1
b = i(a, b, c)
b = i(b, a, c)
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 c1 = c
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_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 s: kotlin.String? defined in foo
class X<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_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 s: kotlin.String? defined in foo
class X<T> {
fun add(t: T) {
@@ -11,10 +11,10 @@ class X<T> {
// SIBLING:
fun foo(s: String?, x: X<Any>) {
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)
}
@@ -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_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 s: kotlin.String? defined in foo
class X<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_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 s: kotlin.String? defined in foo
class X<T> {
fun add(t: T) {
@@ -11,10 +11,10 @@ class X<T> {
// SIBLING:
fun foo(s: String?, x: X<Any?>) {
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)
}
@@ -1,8 +1,8 @@
// 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_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.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int {
fun Int.bar(m: Int) = this * m * n
@@ -1,12 +1,12 @@
// 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_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.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int {
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
// 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.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.(m: kotlin.Int) -> kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int {
fun Int.bar1(m: Int) = this + m + n
fun Int.bar2(m: Int) = this * m * n
@@ -1,15 +1,16 @@
// 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.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.(m: kotlin.Int) -> kotlin.Int
// PARAM_TYPES: kotlin.Int.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int {
fun Int.bar1(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
// 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_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.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int {
fun Int.bar(m: Int) = this * m * n
@@ -1,12 +1,12 @@
// 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_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.(m: kotlin.Int) -> kotlin.Int
fun foo(n: Int): Int {
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_DESCRIPTOR: value-parameter a: A 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: val u: kotlin.Int defined in foo
// SIBLING:
public class A() {
fun bar(a: Int, b: Int): Int {
@@ -4,8 +4,8 @@
// PARAM_TYPES: kotlin.Int
// PARAM_DESCRIPTOR: value-parameter a: A 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: val u: kotlin.Int defined in foo
// SIBLING:
public class A() {
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 {
val t = 10
val u = 20
return i(a, t, u, x)
return i(a, t, x, u)
}