[FIR] Complete delegated constructor calls without proper constructed type
This is needed to definitely complete arguments of such calls
This commit is contained in:
committed by
teamcity
parent
1591518cf6
commit
aadfc59d0f
+3
@@ -0,0 +1,3 @@
|
|||||||
|
KtErrorCallInfo:
|
||||||
|
candidateCalls = []
|
||||||
|
diagnostic = ERROR<UNRESOLVED_REFERENCE: Unresolved reference: Unresolved>
|
||||||
Vendored
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
KtErrorCallInfo:
|
KtErrorCallInfo:
|
||||||
candidateCalls = []
|
candidateCalls = []
|
||||||
diagnostic = ERROR<UNRESOLVED_REFERENCE: Unresolved reference: Unresolved>
|
diagnostic = ERROR<OTHER_ERROR: Unknown (other) error>
|
||||||
|
|||||||
+6
@@ -1175,6 +1175,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis
|
|||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/constructors"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/constructors"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("erroneousDelegatedConstructorCall.kt")
|
||||||
|
public void testErroneousDelegatedConstructorCall() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/constructors/erroneousDelegatedConstructorCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("noSuperCallInSupertypes.kt")
|
@TestMetadata("noSuperCallInSupertypes.kt")
|
||||||
public void testNoSuperCallInSupertypes() throws Exception {
|
public void testNoSuperCallInSupertypes() throws Exception {
|
||||||
|
|||||||
+5
@@ -1019,6 +1019,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract
|
|||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/constructors"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/constructors"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("erroneousDelegatedConstructorCall.kt")
|
||||||
|
public void testErroneousDelegatedConstructorCall() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/constructors/erroneousDelegatedConstructorCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noSuperCallInSupertypes.kt")
|
@TestMetadata("noSuperCallInSupertypes.kt")
|
||||||
public void testNoSuperCallInSupertypes() throws Exception {
|
public void testNoSuperCallInSupertypes() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/constructors/noSuperCallInSupertypes.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/constructors/noSuperCallInSupertypes.kt");
|
||||||
|
|||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
FILE: erroneousDelegatedConstructorCall.kt
|
||||||
|
public final class A : <ERROR TYPE REF: Symbol not found for Undefined> {
|
||||||
|
public constructor(): R|A| {
|
||||||
|
super<<ERROR TYPE REF: Symbol not found for Undefined>>(R|/id|<R|ERROR CLASS: Cannot infer argument for type parameter K|>(R|/materialize|<R|ERROR CLASS: Cannot infer argument for type parameter K|>()))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Vendored
+2
@@ -0,0 +1,2 @@
|
|||||||
|
// INFERENCE_HELPERS
|
||||||
|
class A : <!UNRESOLVED_REFERENCE!>Undefined<!>(id(materialize()))
|
||||||
+6
@@ -1175,6 +1175,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest {
|
|||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/constructors"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/constructors"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("erroneousDelegatedConstructorCall.kt")
|
||||||
|
public void testErroneousDelegatedConstructorCall() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/constructors/erroneousDelegatedConstructorCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("noSuperCallInSupertypes.kt")
|
@TestMetadata("noSuperCallInSupertypes.kt")
|
||||||
public void testNoSuperCallInSupertypes() throws Exception {
|
public void testNoSuperCallInSupertypes() throws Exception {
|
||||||
|
|||||||
+6
@@ -1175,6 +1175,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
|||||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/constructors"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/analysis-tests/testData/resolve/constructors"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("erroneousDelegatedConstructorCall.kt")
|
||||||
|
public void testErroneousDelegatedConstructorCall() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/constructors/erroneousDelegatedConstructorCall.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("noSuperCallInSupertypes.kt")
|
@TestMetadata("noSuperCallInSupertypes.kt")
|
||||||
public void testNoSuperCallInSupertypes() throws Exception {
|
public void testNoSuperCallInSupertypes() throws Exception {
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField
|
|||||||
import org.jetbrains.kotlin.fir.declarations.utils.isInner
|
import org.jetbrains.kotlin.fir.declarations.utils.isInner
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isReferredViaField
|
import org.jetbrains.kotlin.fir.declarations.utils.isReferredViaField
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.ConeStubDiagnostic
|
import org.jetbrains.kotlin.fir.diagnostics.ConeStubDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
|
||||||
import org.jetbrains.kotlin.fir.expressions.*
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedReifiedParameterReference
|
import org.jetbrains.kotlin.fir.expressions.builder.buildResolvedReifiedParameterReference
|
||||||
import org.jetbrains.kotlin.fir.references.*
|
import org.jetbrains.kotlin.fir.references.*
|
||||||
@@ -436,15 +438,14 @@ class FirCallResolver(
|
|||||||
|
|
||||||
fun resolveDelegatingConstructorCall(
|
fun resolveDelegatingConstructorCall(
|
||||||
delegatedConstructorCall: FirDelegatedConstructorCall,
|
delegatedConstructorCall: FirDelegatedConstructorCall,
|
||||||
constructedType: ConeClassLikeType
|
constructedType: ConeClassLikeType?
|
||||||
): FirDelegatedConstructorCall {
|
): FirDelegatedConstructorCall {
|
||||||
val name = SpecialNames.INIT
|
val name = SpecialNames.INIT
|
||||||
val symbol = constructedType.lookupTag.toSymbol(components.session)
|
val symbol = constructedType?.lookupTag?.toSymbol(components.session)
|
||||||
val typeArguments =
|
val typeArguments = constructedType?.typeArguments
|
||||||
constructedType.typeArguments.take((symbol?.fir as? FirRegularClass)?.typeParameters?.count { it is FirTypeParameter } ?: 0)
|
?.take((symbol?.fir as? FirRegularClass)?.typeParameters?.count { it is FirTypeParameter } ?: 0)
|
||||||
.map {
|
?.map { it.toFirTypeProjection() }
|
||||||
it.toFirTypeProjection()
|
?: emptyList()
|
||||||
}
|
|
||||||
|
|
||||||
val callInfo = CallInfo(
|
val callInfo = CallInfo(
|
||||||
delegatedConstructorCall,
|
delegatedConstructorCall,
|
||||||
@@ -460,6 +461,17 @@ class FirCallResolver(
|
|||||||
)
|
)
|
||||||
towerResolver.reset()
|
towerResolver.reset()
|
||||||
|
|
||||||
|
if (constructedType == null) {
|
||||||
|
val errorReference = createErrorReferenceWithErrorCandidate(
|
||||||
|
callInfo,
|
||||||
|
ConeSimpleDiagnostic("Erroneous delegated constructor call", DiagnosticKind.UnresolvedSupertype),
|
||||||
|
delegatedConstructorCall.calleeReference.source,
|
||||||
|
transformer.resolutionContext,
|
||||||
|
components.resolutionStageRunner
|
||||||
|
)
|
||||||
|
return delegatedConstructorCall.transformCalleeReference(StoreNameReference, errorReference)
|
||||||
|
}
|
||||||
|
|
||||||
val result = towerResolver.runResolverForDelegatingConstructor(
|
val result = towerResolver.runResolverForDelegatingConstructor(
|
||||||
callInfo,
|
callInfo,
|
||||||
constructedType,
|
constructedType,
|
||||||
|
|||||||
+7
-11
@@ -1057,17 +1057,13 @@ open class FirExpressionsResolveTransformer(transformer: FirBodyResolveTransform
|
|||||||
}
|
}
|
||||||
|
|
||||||
val reference = delegatedConstructorCall.calleeReference
|
val reference = delegatedConstructorCall.calleeReference
|
||||||
val constructorType: ConeClassLikeType = when (reference) {
|
val constructorType: ConeClassLikeType? = when (reference) {
|
||||||
is FirThisReference -> {
|
is FirThisReference -> lastDispatchReceiver?.type as? ConeClassLikeType
|
||||||
lastDispatchReceiver?.type as? ConeClassLikeType ?: return delegatedConstructorCall
|
is FirSuperReference -> reference.superTypeRef
|
||||||
}
|
.coneTypeSafe<ConeClassLikeType>()
|
||||||
is FirSuperReference -> {
|
?.takeIf { it !is ConeErrorType }
|
||||||
// TODO: unresolved supertype
|
?.fullyExpandedType(session)
|
||||||
val supertype = reference.superTypeRef.coneTypeSafe<ConeClassLikeType>()
|
else -> null
|
||||||
?.takeIf { it !is ConeErrorType } ?: return delegatedConstructorCall
|
|
||||||
supertype.fullyExpandedType(session)
|
|
||||||
}
|
|
||||||
else -> return delegatedConstructorCall
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val resolvedCall = callResolver.resolveDelegatingConstructorCall(delegatedConstructorCall, constructorType)
|
val resolvedCall = callResolver.resolveDelegatingConstructorCall(delegatedConstructorCall, constructorType)
|
||||||
|
|||||||
Reference in New Issue
Block a user