[FE] Move type-related checks to TypeResolver
This commit is contained in:
committed by
TeamCityServer
parent
9896cbd2b8
commit
7ab9b68ad5
+6
@@ -10726,6 +10726,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
|||||||
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/typeParameterizedList.kt");
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/typeParameterizedList.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("unsupported.kt")
|
||||||
|
public void testUnsupported() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/unsupported.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("withExplicitReceiver.kt")
|
@TestMetadata("withExplicitReceiver.kt")
|
||||||
public void testWithExplicitReceiver() throws Exception {
|
public void testWithExplicitReceiver() throws Exception {
|
||||||
|
|||||||
+6
@@ -10726,6 +10726,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/typeParameterizedList.kt");
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/typeParameterizedList.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("unsupported.kt")
|
||||||
|
public void testUnsupported() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/unsupported.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("withExplicitReceiver.kt")
|
@TestMetadata("withExplicitReceiver.kt")
|
||||||
public void testWithExplicitReceiver() throws Exception {
|
public void testWithExplicitReceiver() throws Exception {
|
||||||
|
|||||||
+6
@@ -10726,6 +10726,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/typeParameterizedList.kt");
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/typeParameterizedList.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("unsupported.kt")
|
||||||
|
public void testUnsupported() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/unsupported.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("withExplicitReceiver.kt")
|
@TestMetadata("withExplicitReceiver.kt")
|
||||||
public void testWithExplicitReceiver() throws Exception {
|
public void testWithExplicitReceiver() throws Exception {
|
||||||
|
|||||||
@@ -348,10 +348,13 @@ class TypeResolver(
|
|||||||
val receiverTypeRef = type.receiverTypeReference
|
val receiverTypeRef = type.receiverTypeReference
|
||||||
val receiverType = if (receiverTypeRef?.typeElement == null) null else resolveType(c.noBareTypes(), receiverTypeRef)
|
val receiverType = if (receiverTypeRef?.typeElement == null) null else resolveType(c.noBareTypes(), receiverTypeRef)
|
||||||
|
|
||||||
val contextReceiversTypeRefs = type.contextReceiversTypeReferences
|
val contextReceiverList = type.contextReceiverList
|
||||||
val contextReceiversTypes = contextReceiversTypeRefs?.mapNotNull {
|
val contextReceiversTypes = if (contextReceiverList != null) {
|
||||||
resolveType(c.noBareTypes(), it)
|
checkContextReceiversAreEnabled(contextReceiverList)
|
||||||
} ?: emptyList()
|
contextReceiverList.typeReferences().map { typeRef ->
|
||||||
|
resolveType(c.noBareTypes(), typeRef)
|
||||||
|
}
|
||||||
|
} else emptyList()
|
||||||
|
|
||||||
val parameterDescriptors = resolveParametersOfFunctionType(type.parameters)
|
val parameterDescriptors = resolveParametersOfFunctionType(type.parameters)
|
||||||
checkParametersOfFunctionType(parameterDescriptors)
|
checkParametersOfFunctionType(parameterDescriptors)
|
||||||
@@ -430,6 +433,10 @@ class TypeResolver(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitContextReceiverList(contextReceiverList: KtContextReceiverList) {
|
||||||
|
checkContextReceiversAreEnabled(contextReceiverList)
|
||||||
|
}
|
||||||
|
|
||||||
override fun visitDynamicType(type: KtDynamicType) {
|
override fun visitDynamicType(type: KtDynamicType) {
|
||||||
result = type(dynamicCallableDescriptors.dynamicType.replaceAnnotations(annotations))
|
result = type(dynamicCallableDescriptors.dynamicType.replaceAnnotations(annotations))
|
||||||
if (!dynamicTypesSettings.dynamicTypesAllowed) {
|
if (!dynamicTypesSettings.dynamicTypesAllowed) {
|
||||||
@@ -469,6 +476,17 @@ class TypeResolver(
|
|||||||
c.trace.report(Errors.UNSUPPORTED.on(it, "val or var on parameter in function type"))
|
c.trace.report(Errors.UNSUPPORTED.on(it, "val or var on parameter in function type"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkContextReceiversAreEnabled(contextReceiverList: KtContextReceiverList) {
|
||||||
|
if (!languageVersionSettings.supportsFeature(LanguageFeature.ContextReceivers)) {
|
||||||
|
c.trace.report(
|
||||||
|
UNSUPPORTED_FEATURE.on(
|
||||||
|
contextReceiverList,
|
||||||
|
LanguageFeature.ContextReceivers to languageVersionSettings
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return result ?: type(ErrorUtils.createErrorType(typeElement?.getDebugText() ?: "No type element"))
|
return result ?: type(ErrorUtils.createErrorType(typeElement?.getDebugText() ?: "No type element"))
|
||||||
|
|||||||
-32
@@ -26,37 +26,5 @@ object ContextualDeclarationChecker : DeclarationChecker {
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
val types = mutableListOf<KtTypeReference?>()
|
|
||||||
when (declaration) {
|
|
||||||
is KtFunction -> {
|
|
||||||
types.addAll(declaration.valueParameters.mapNotNull { it.typeReference })
|
|
||||||
types.add(declaration.receiverTypeReference)
|
|
||||||
types.add(declaration.typeReference)
|
|
||||||
}
|
|
||||||
is KtProperty -> {
|
|
||||||
types.add(declaration.receiverTypeReference)
|
|
||||||
types.add(declaration.typeReference)
|
|
||||||
}
|
|
||||||
is KtClass -> {
|
|
||||||
types.addAll(declaration.primaryConstructor?.valueParameters?.map { it.typeReference } ?: emptyList())
|
|
||||||
}
|
|
||||||
is KtTypeAlias -> {
|
|
||||||
types.add(declaration.getTypeReference())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun KtTypeReference.isOrHasContextualType(): Boolean {
|
|
||||||
val typeElement = typeElement as? KtFunctionType ?: return false
|
|
||||||
return !typeElement.contextReceiversTypeReferences.isNullOrEmpty()
|
|
||||||
|| typeElement.typeArgumentsAsTypes.any(KtTypeReference::isOrHasContextualType)
|
|
||||||
}
|
|
||||||
|
|
||||||
types.filterNotNull().filter { it.isOrHasContextualType() }.forEach {
|
|
||||||
context.trace.report(
|
|
||||||
Errors.UNSUPPORTED_FEATURE.on(
|
|
||||||
it, LanguageFeature.ContextReceivers to context.languageVersionSettings
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,13 +93,18 @@ public class KtFunctionType extends KtElementImplStub<KotlinPlaceHolderStub<KtFu
|
|||||||
return receiverDeclaration.getTypeReference();
|
return receiverDeclaration.getTypeReference();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<KtTypeReference> getContextReceiversTypeReferences() {
|
@Nullable
|
||||||
|
public KtContextReceiverList getContextReceiverList() {
|
||||||
KtFunctionTypeReceiver receiverDeclaration = getReceiver();
|
KtFunctionTypeReceiver receiverDeclaration = getReceiver();
|
||||||
if (receiverDeclaration == null) {
|
if (receiverDeclaration == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
KtTypeReference receiverTypeRef = receiverDeclaration.getTypeReference();
|
KtTypeReference receiverTypeRef = receiverDeclaration.getTypeReference();
|
||||||
KtContextReceiverList contextReceiverList = receiverTypeRef.getStubOrPsiChild(KtStubElementTypes.CONTEXT_RECEIVER_LIST);
|
return receiverTypeRef.getStubOrPsiChild(KtStubElementTypes.CONTEXT_RECEIVER_LIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<KtTypeReference> getContextReceiversTypeReferences() {
|
||||||
|
KtContextReceiverList contextReceiverList = getContextReceiverList();
|
||||||
if (contextReceiverList != null) {
|
if (contextReceiverList != null) {
|
||||||
return contextReceiverList.typeReferences();
|
return contextReceiverList.typeReferences();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// !DIAGNOSTICS: -UNCHECKED_CAST
|
||||||
|
|
||||||
|
context(Any)
|
||||||
|
fun f(g: context(Any) () -> Unit, value: Any): context(A) () -> Unit {
|
||||||
|
return value as (context(A) () -> Unit)
|
||||||
|
}
|
||||||
|
|
||||||
|
context(String, Int)
|
||||||
|
class A {
|
||||||
|
context(Any)
|
||||||
|
val p: Any get() = 42
|
||||||
|
|
||||||
|
context(String, Int)
|
||||||
|
fun m() {}
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
// !DIAGNOSTICS: -UNCHECKED_CAST
|
||||||
|
|
||||||
|
<!UNSUPPORTED_FEATURE!>context(Any)<!>
|
||||||
|
fun f(g: <!UNSUPPORTED_FEATURE!>context(Any)<!> () -> Unit, value: Any): <!UNSUPPORTED_FEATURE!>context(A)<!> () -> Unit {
|
||||||
|
return value as (<!UNSUPPORTED_FEATURE!>context(A)<!> () -> Unit)
|
||||||
|
}
|
||||||
|
|
||||||
|
<!UNSUPPORTED_FEATURE!>context(String, Int)<!>
|
||||||
|
class A {
|
||||||
|
<!UNSUPPORTED_FEATURE!>context(Any)<!>
|
||||||
|
val p: Any get() = 42
|
||||||
|
|
||||||
|
<!UNSUPPORTED_FEATURE!>context(String, Int)<!>
|
||||||
|
fun m() {}
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public fun f(/*0*/ g: context(kotlin.Any) () -> kotlin.Unit, /*1*/ value: kotlin.Any): context(A) () -> kotlin.Unit
|
||||||
|
|
||||||
|
public final class A {
|
||||||
|
public constructor A()
|
||||||
|
public final val p: kotlin.Any
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public final fun m(): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
Generated
+6
@@ -10732,6 +10732,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/typeParameterizedList.kt");
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/typeParameterizedList.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("unsupported.kt")
|
||||||
|
public void testUnsupported() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/extensions/contextReceivers/unsupported.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("withExplicitReceiver.kt")
|
@TestMetadata("withExplicitReceiver.kt")
|
||||||
public void testWithExplicitReceiver() throws Exception {
|
public void testWithExplicitReceiver() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user