From 16000376258e253320896eba2ff4eb1652a49431 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 17 Oct 2016 12:32:27 +0300 Subject: [PATCH] KT-14307, KT-14377: Run declaration checks on local type aliases. --- .../kotlin/resolve/DeclarationsChecker.kt | 14 ++++++++++---- .../ExpressionTypingVisitorForStatements.java | 2 ++ .../tests/typealias/localTypeAliasModifiers.kt | 3 +++ .../tests/typealias/localTypeAliasModifiers.txt | 3 +++ .../tests/typealias/localTypeAliasRecursive.kt | 5 +++++ .../tests/typealias/localTypeAliasRecursive.txt | 3 +++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 12 ++++++++++++ 7 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.txt create mode 100644 compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.kt create mode 100644 compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index f975b1e2d27..0852f81a325 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -142,16 +142,22 @@ class DeclarationsChecker( } for ((declaration, typeAliasDescriptor) in bodiesResolveContext.typeAliases.entries) { - checkTypeAliasDeclaration(typeAliasDescriptor, declaration) + checkTypeAliasDeclaration(declaration, typeAliasDescriptor) modifiersChecker.checkModifiersForDeclaration(declaration, typeAliasDescriptor) exposedChecker.checkTypeAlias(declaration, typeAliasDescriptor) } } - private fun checkTypeAliasDeclaration(typeAliasDescriptor: TypeAliasDescriptor, declaration: KtTypeAlias) { + fun checkLocalTypeAliasDeclaration(declaration: KtTypeAlias, typeAliasDescriptor: TypeAliasDescriptor) { + checkTypeAliasDeclaration(declaration, typeAliasDescriptor) + modifiersChecker.checkModifiersForDeclaration(declaration, typeAliasDescriptor) + exposedChecker.checkTypeAlias(declaration, typeAliasDescriptor) + } + + private fun checkTypeAliasDeclaration(declaration: KtTypeAlias, typeAliasDescriptor: TypeAliasDescriptor) { val typeReference = declaration.getTypeReference() ?: return - checkTypeAliasExpansion(typeAliasDescriptor, declaration) + checkTypeAliasExpansion(declaration, typeAliasDescriptor) val expandedType = typeAliasDescriptor.expandedType if (expandedType.isError) return @@ -210,7 +216,7 @@ class DeclarationsChecker( } } - private fun checkTypeAliasExpansion(typeAliasDescriptor: TypeAliasDescriptor, declaration: KtTypeAlias) { + private fun checkTypeAliasExpansion(declaration: KtTypeAlias, typeAliasDescriptor: TypeAliasDescriptor) { val typeAliasExpansion = TypeAliasExpansion.createWithFormalArguments(typeAliasDescriptor) val reportStrategy = TypeAliasDeclarationCheckingReportStrategy(trace, typeAliasDescriptor, declaration) TypeAliasExpander(reportStrategy).expandWithoutAbbreviation(typeAliasExpansion, Annotations.EMPTY) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java index 3ddabffd652..59fba1693f3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingVisitorForStatements.java @@ -118,6 +118,8 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito scope.addClassifierDescriptor(typeAliasDescriptor); ForceResolveUtil.forceResolveAllContents(typeAliasDescriptor); + facade.getComponents().declarationsCheckerBuilder.withTrace(context.trace).checkLocalTypeAliasDeclaration(typeAlias, typeAliasDescriptor); + return TypeInfoFactoryKt.createTypeInfo(components.dataFlowAnalyzer.checkStatementType(typeAlias, context), context); } diff --git a/compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.kt b/compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.kt new file mode 100644 index 00000000000..d08d1b5e6aa --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.kt @@ -0,0 +1,3 @@ +fun outer() { + companion typealias TestLocal = Any +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.txt b/compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.txt new file mode 100644 index 00000000000..0d047ffeba1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.txt @@ -0,0 +1,3 @@ +package + +public fun outer(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.kt b/compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.kt new file mode 100644 index 00000000000..b84a1be05c5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.kt @@ -0,0 +1,5 @@ +fun outer() { + typealias Test1 = Test1 + typealias Test2 = List + typealias Test3 = List<Test3> +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.txt b/compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.txt new file mode 100644 index 00000000000..0d047ffeba1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.txt @@ -0,0 +1,3 @@ +package + +public fun outer(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index f0e7e4db4c2..78f75e20efa 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -20700,6 +20700,18 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("localTypeAliasModifiers.kt") + public void testLocalTypeAliasModifiers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/localTypeAliasModifiers.kt"); + doTest(fileName); + } + + @TestMetadata("localTypeAliasRecursive.kt") + public void testLocalTypeAliasRecursive() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/localTypeAliasRecursive.kt"); + doTest(fileName); + } + @TestMetadata("methodReference.kt") public void testMethodReference() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/methodReference.kt");