From fe2251bfcaff013cc4780f9d6f52a9cea9380c04 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 2 Aug 2018 17:36:43 +0200 Subject: [PATCH] Run classifier usage checkers on function types --- .../checkers/ClassifierUsageChecker.kt | 23 +++++++++++++++---- .../sourceCompatibility/noBigFunctionTypes.kt | 5 +++- .../noBigFunctionTypes.txt | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt index 421c10ae65a..530f425afcb 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ClassifierUsageChecker.kt @@ -18,11 +18,12 @@ package org.jetbrains.kotlin.resolve.checkers import com.intellij.psi.PsiElement import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtNameReferenceExpression -import org.jetbrains.kotlin.psi.KtReferenceExpression -import org.jetbrains.kotlin.psi.KtTreeVisitorVoid +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.DeprecationResolver @@ -62,7 +63,19 @@ fun checkClassifierUsages( } } - private fun runCheckersWithTarget(target: ClassifierDescriptor, expression: KtReferenceExpression) { + override fun visitFunctionType(type: KtFunctionType) { + super.visitFunctionType(type) + + val kotlinType = context.trace.get(BindingContext.TYPE, type.parent as? KtTypeReference ?: return) + if (kotlinType != null) { + val descriptor = kotlinType.constructor.declarationDescriptor + if (descriptor is ClassifierDescriptor) { + runCheckersWithTarget(descriptor, type) + } + } + } + + private fun runCheckersWithTarget(target: ClassifierDescriptor, expression: KtElement) { for (checker in checkers) { checker.check(target, expression, context) } diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/noBigFunctionTypes.kt b/compiler/testData/diagnostics/tests/sourceCompatibility/noBigFunctionTypes.kt index 3495385462a..f313b667d52 100644 --- a/compiler/testData/diagnostics/tests/sourceCompatibility/noBigFunctionTypes.kt +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/noBigFunctionTypes.kt @@ -11,7 +11,10 @@ fun foo( fun bar(x: Any) {} -fun test(vararg x: Function30<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, Unit>) { +fun test( + w: (A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A) -> Unit, + vararg x: Function30<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, Unit> +) { bar(::foo) bar(x) } diff --git a/compiler/testData/diagnostics/tests/sourceCompatibility/noBigFunctionTypes.txt b/compiler/testData/diagnostics/tests/sourceCompatibility/noBigFunctionTypes.txt index 68ed64937d3..d50418dde5c 100644 --- a/compiler/testData/diagnostics/tests/sourceCompatibility/noBigFunctionTypes.txt +++ b/compiler/testData/diagnostics/tests/sourceCompatibility/noBigFunctionTypes.txt @@ -2,7 +2,7 @@ package public fun bar(/*0*/ x: kotlin.Any): kotlin.Unit public fun foo(/*0*/ p00: A, /*1*/ p01: A, /*2*/ p02: A, /*3*/ p03: A, /*4*/ p04: A, /*5*/ p05: A, /*6*/ p06: A, /*7*/ p07: A, /*8*/ p08: A, /*9*/ p09: A, /*10*/ p10: A, /*11*/ p11: A, /*12*/ p12: A, /*13*/ p13: A, /*14*/ p14: A, /*15*/ p15: A, /*16*/ p16: A, /*17*/ p17: A, /*18*/ p18: A, /*19*/ p19: A, /*20*/ p20: A, /*21*/ p21: A, /*22*/ p22: A, /*23*/ p23: A, /*24*/ p24: A, /*25*/ p25: A, /*26*/ p26: A, /*27*/ p27: A, /*28*/ p28: A, /*29*/ p29: A): kotlin.Unit -public fun test(/*0*/ vararg x: kotlin.Function30<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, kotlin.Unit> /*kotlin.Array>*/): kotlin.Unit +public fun test(/*0*/ w: (A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A, A) -> kotlin.Unit, /*1*/ vararg x: kotlin.Function30<*, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, *, kotlin.Unit> /*kotlin.Array>*/): kotlin.Unit public final class A { public constructor A()