KT-14307, KT-14377: Run declaration checks on local type aliases.

This commit is contained in:
Dmitry Petrov
2016-10-17 12:32:27 +03:00
parent 6a72cebe88
commit 1600037625
7 changed files with 38 additions and 4 deletions
@@ -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)
@@ -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);
}
@@ -0,0 +1,3 @@
fun outer() {
<!WRONG_MODIFIER_TARGET!>companion<!> typealias TestLocal = Any
}
@@ -0,0 +1,3 @@
package
public fun outer(): kotlin.Unit
@@ -0,0 +1,5 @@
fun outer() {
typealias Test1 = <!RECURSIVE_TYPEALIAS_EXPANSION!>Test1<!>
typealias Test2 = <!RECURSIVE_TYPEALIAS_EXPANSION!>List<Test2><!>
typealias Test3<T> = List<<!UNRESOLVED_REFERENCE!>Test3<!><T>>
}
@@ -0,0 +1,3 @@
package
public fun outer(): kotlin.Unit
@@ -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");