Raw FIR: use lambda parameter type if available

This commit is contained in:
Jinseong Jeon
2021-01-18 00:18:38 -08:00
committed by Mikhail Glukhikh
parent fa0b933bc8
commit 2e660ef62a
7 changed files with 19 additions and 20 deletions
@@ -38,7 +38,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.fir.types.FirTypeProjection import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.builder.buildImplicitTypeRef
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType import org.jetbrains.kotlin.psi.stubs.elements.KtConstantExpressionElementType
@@ -155,7 +154,7 @@ class ExpressionsConverter(
val multiParameter = buildValueParameter { val multiParameter = buildValueParameter {
session = baseSession session = baseSession
origin = FirDeclarationOrigin.Source origin = FirDeclarationOrigin.Source
returnTypeRef = buildImplicitTypeRef() returnTypeRef = valueParameter.firValueParameter.returnTypeRef
this.name = name this.name = name
symbol = FirVariableSymbol(name) symbol = FirVariableSymbol(name)
defaultValue = null defaultValue = null
@@ -1106,7 +1106,7 @@ class RawFirBuilder(
source = valueParameter.toFirSourceElement() source = valueParameter.toFirSourceElement()
session = baseSession session = baseSession
origin = FirDeclarationOrigin.Source origin = FirDeclarationOrigin.Source
returnTypeRef = buildImplicitTypeRef { returnTypeRef = valueParameter.typeReference?.convertSafe() ?: buildImplicitTypeRef {
source = multiDeclaration.toFirSourceElement(FirFakeSourceElementKind.ImplicitTypeRef) source = multiDeclaration.toFirSourceElement(FirFakeSourceElementKind.ImplicitTypeRef)
} }
this.name = name this.name = name
@@ -1124,7 +1124,7 @@ class RawFirBuilder(
) { toFirOrImplicitType() } ) { toFirOrImplicitType() }
multiParameter multiParameter
} else { } else {
val typeRef = buildImplicitTypeRef { val typeRef = valueParameter.typeReference?.convertSafe() ?: buildImplicitTypeRef {
source = implicitTypeRefSource source = implicitTypeRefSource
} }
valueParameter.toFirValueParameter(typeRef) valueParameter.toFirValueParameter(typeRef)
@@ -9,9 +9,9 @@ fun <X, Y> foo(y: Y, x: (X, Y) -> Unit) {}
fun bar(aInstance: A, bInstance: B) { fun bar(aInstance: A, bInstance: B) {
foo("") { foo("") {
<!COMPONENT_FUNCTION_MISSING, COMPONENT_FUNCTION_MISSING!>(a, b): A<!>, c -> (a, b): A, c ->
a <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() } a checkType { _<Int>() }
b <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!INAPPLICABLE_CANDIDATE!>_<!><String>() } b checkType { _<String>() }
c checkType { _<String>() } c checkType { _<String>() }
} }
@@ -27,7 +27,7 @@ fun bar(aList: List<A>) {
b checkType { _<String>() } b checkType { _<String>() }
} }
aList.foo { (a, b): B -> aList.<!INAPPLICABLE_CANDIDATE!>foo<!> { (a, b): B ->
b checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() } b checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() }
a checkType { <!INAPPLICABLE_CANDIDATE!>_<!><String>() } a checkType { <!INAPPLICABLE_CANDIDATE!>_<!><String>() }
} }
@@ -4,23 +4,23 @@
data class A(val x: Int, val y: String) data class A(val x: Int, val y: String)
fun bar() { fun bar() {
val x = { <!COMPONENT_FUNCTION_MISSING, COMPONENT_FUNCTION_MISSING!>(a, b): A<!> -> val x = { (a, b): A ->
a <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() } a checkType { _<Int>() }
b <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!INAPPLICABLE_CANDIDATE!>_<!><String>() } b checkType { _<String>() }
} }
x checkType { _<(A) -> Unit>() } x checkType { _<(A) -> Unit>() }
val y = { <!COMPONENT_FUNCTION_MISSING, COMPONENT_FUNCTION_MISSING!>(a: Int, b): A<!> -> val y = { (a: Int, b): A ->
a checkType { _<Int>() } a checkType { _<Int>() }
b <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!INAPPLICABLE_CANDIDATE!>_<!><String>() } b checkType { _<String>() }
} }
y checkType { _<(A) -> Unit>() } y checkType { _<(A) -> Unit>() }
val y2 = { <!COMPONENT_FUNCTION_MISSING, COMPONENT_FUNCTION_MISSING!>(a: Number, b): A<!> -> val y2 = { (a: Number, b): A ->
a checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() } a checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() }
b <!INAPPLICABLE_CANDIDATE!>checkType<!> { <!INAPPLICABLE_CANDIDATE!>_<!><String>() } b checkType { _<String>() }
} }
y2 checkType { _<(A) -> Unit>() } y2 checkType { _<(A) -> Unit>() }
@@ -47,8 +47,8 @@ fun bar() {
b checkType { _<String>() } b checkType { _<String>() }
} }
foo { (a, b): B -> <!INAPPLICABLE_CANDIDATE!>foo<!> { (a, b): B ->
a checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Double>() } a checkType { _<Double>() }
b checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Short>() } b checkType { _<Short>() }
} }
} }
@@ -56,8 +56,8 @@ fun bar() {
b checkType { _<String>() } b checkType { _<String>() }
} }
foo { (_, b): B -> <!INAPPLICABLE_CANDIDATE!>foo<!> { (_, b): B ->
<!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>() <!UNRESOLVED_REFERENCE!>_<!>.<!UNRESOLVED_REFERENCE!>hashCode<!>()
b checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Short>() } b checkType { _<Short>() }
} }
} }