From 7a3000ccac0466ea2b875bac66c78d664dd847bb Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 10 Dec 2012 20:36:06 +0400 Subject: [PATCH] Forbid usage of outer's generic parameter in nested class #KT-1174 In Progress --- .../jetbrains/jet/lang/resolve/TypeResolver.java | 5 +++++ compiler/testData/codegen/traits/stdlib.jet | 4 ---- compiler/testData/codegen/typeInfo/inner.jet | 4 ++-- .../diagnostics/tests/PrimaryConstructors.kt | 2 +- .../diagnostics/tests/inner/outerGenericParam.kt | 13 +++++++++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 6 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inner/outerGenericParam.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java index c44a65ca455..b04e6b1d2f3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java @@ -124,6 +124,11 @@ public class TypeResolver { } resolveTypeProjections(scope, ErrorUtils.createErrorType("No type").getConstructor(), type.getTypeArguments(), trace, checkBounds); + + DeclarationDescriptor containing = typeParameterDescriptor.getContainingDeclaration(); + if (containing instanceof ClassDescriptor) { + DescriptorResolver.checkHasOuterClassInstance(scope, trace, referenceExpression, (ClassDescriptor) containing); + } } else if (classifierDescriptor instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) classifierDescriptor; diff --git a/compiler/testData/codegen/traits/stdlib.jet b/compiler/testData/codegen/traits/stdlib.jet index d73e18fd231..306d78264aa 100644 --- a/compiler/testData/codegen/traits/stdlib.jet +++ b/compiler/testData/codegen/traits/stdlib.jet @@ -19,10 +19,6 @@ class MyIterator(val array : ReadOnlyArray) : javaUtilIterator { trait ReadOnlyArray : ISized, Iterable { fun get(index : Int) : T - class Default { - fun check(v: Any) = v is T - } - override fun iterator() : Iterator = MyIterator(this) } diff --git a/compiler/testData/codegen/typeInfo/inner.jet b/compiler/testData/codegen/typeInfo/inner.jet index 96e465d633d..0285cf592eb 100644 --- a/compiler/testData/codegen/typeInfo/inner.jet +++ b/compiler/testData/codegen/typeInfo/inner.jet @@ -1,9 +1,9 @@ class Box() { - open class Inner () { + open inner class Inner () { fun isT(s : Any) = if(s is T) "OK" else "fail" } - class Inner2() : Inner() { + inner class Inner2() : Inner() { } fun inner() = Inner2() diff --git a/compiler/testData/diagnostics/tests/PrimaryConstructors.kt b/compiler/testData/diagnostics/tests/PrimaryConstructors.kt index 5699e3696e9..c83ebea6b85 100644 --- a/compiler/testData/diagnostics/tests/PrimaryConstructors.kt +++ b/compiler/testData/diagnostics/tests/PrimaryConstructors.kt @@ -19,7 +19,7 @@ class MyIterable : Iterable { override fun iterator(): Iterator = MyIterator() - class MyIterator : Iterator + inner class MyIterator : Iterator { override fun hasNext(): Boolean = false override fun next(): T { diff --git a/compiler/testData/diagnostics/tests/inner/outerGenericParam.kt b/compiler/testData/diagnostics/tests/inner/outerGenericParam.kt new file mode 100644 index 00000000000..81d6611e5ba --- /dev/null +++ b/compiler/testData/diagnostics/tests/inner/outerGenericParam.kt @@ -0,0 +1,13 @@ +class Outer { + class Nested { + fun foo(t: T) = t + } + + class Nested2 { + fun foo(t: T) = t + } + + inner class Inner { + fun foo(t: T) = t + } +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 3b22cbee93d..17a11037c32 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2459,6 +2459,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/inner/nestedVsInnerAccessOuterMember.kt"); } + @TestMetadata("outerGenericParam.kt") + public void testOuterGenericParam() throws Exception { + doTest("compiler/testData/diagnostics/tests/inner/outerGenericParam.kt"); + } + @TestMetadata("visibility.kt") public void testVisibility() throws Exception { doTest("compiler/testData/diagnostics/tests/inner/visibility.kt");