[FIR] Copy receiver of delegateProvider in fir building

There was a problem that receiver of `delegateProvider` and `expression` field
  of `FirWrappedDelegateExpression` was the same object, so after some changes in
  FirCallCompletionResultsWriterTransformer (where call was partially completed and then
  copied) there was a problem with resolve of `delegateProvider`, because reference of it's
  receiver had resolved reference, but type arguments were unsubstituted (see
  `testCommonCaseForInference`).

Maybe there is a better solution. E.g. we can transform type arguments in completion, so we don't need coping of function call at all
This commit is contained in:
Dmitriy Novozhilov
2019-12-10 11:59:07 +03:00
parent 51560f2f17
commit 00112d4227
4 changed files with 18 additions and 18 deletions
@@ -14,7 +14,10 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.builder.*
import org.jetbrains.kotlin.fir.builder.Context
import org.jetbrains.kotlin.fir.builder.generateAccessorsByDelegate
import org.jetbrains.kotlin.fir.builder.generateComponentFunctions
import org.jetbrains.kotlin.fir.builder.generateCopyFunction
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.*
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
@@ -819,6 +822,7 @@ class DeclarationsConverter(
val parentNode = property.getParent()
val isLocal = !(parentNode?.tokenType == KT_FILE || parentNode?.tokenType == CLASS_BODY)
return if (isLocal) {
val receiver = delegateExpression?.let { expressionConverter.getAsFirExpression<FirExpression>(it, "Incorrect delegate expression") }
FirPropertyImpl(
null,
session,
@@ -837,7 +841,7 @@ class DeclarationsConverter(
FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL)
).apply {
annotations += modifiers.annotations
this.generateAccessorsByDelegate(this@DeclarationsConverter.session, member = false, stubMode = stubMode)
this.generateAccessorsByDelegate(this@DeclarationsConverter.session, member = false, stubMode, receiver)
}
} else {
val status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply {
@@ -847,6 +851,9 @@ class DeclarationsConverter(
isConst = modifiers.isConst()
isLateInit = modifiers.hasLateinit()
}
val receiver = delegateExpression?.let {
expressionConverter.getAsFirExpression<FirExpression>(it, "Should have delegate")
}
FirPropertyImpl(
null,
session,
@@ -871,7 +878,7 @@ class DeclarationsConverter(
this.getter = getter ?: FirDefaultPropertyGetter(null, session, returnType, modifiers.getVisibility())
this.setter = if (isVar) setter ?: FirDefaultPropertySetter(null, session, returnType, modifiers.getVisibility()) else null
generateAccessorsByDelegate(
this@DeclarationsConverter.session, member = parentNode?.tokenType != KT_FILE, stubMode = stubMode
this@DeclarationsConverter.session, member = parentNode?.tokenType != KT_FILE, stubMode, receiver
)
}
}