Solution for EA-66870: Foo<in *> and Foo<out *> types are now treated as incorrect.

#EA-66870  Fixed.
This commit is contained in:
Mikhail Glukhikh
2015-05-26 15:56:57 +03:00
parent 9b50705a0e
commit 3ad06f169d
7 changed files with 63 additions and 7 deletions
@@ -64,6 +64,11 @@ public class JetTypeProjection extends JetModifierListOwnerStub<KotlinTypeProjec
@Nullable
public ASTNode getProjectionNode() {
PsiElement star = findChildByType(JetTokens.MUL);
if (star != null) {
return star.getNode();
}
JetModifierList modifierList = getModifierList();
if (modifierList != null) {
ASTNode node = modifierList.getModifierNode(JetTokens.IN_KEYWORD);
@@ -75,10 +80,6 @@ public class JetTypeProjection extends JetModifierListOwnerStub<KotlinTypeProjec
return node;
}
}
PsiElement star = findChildByType(JetTokens.MUL);
if (star != null) {
return star.getNode();
}
return null;
}
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.TypeLazinessToken
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
@@ -24,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.diagnostics.Errors.*
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.codeFragmentUtil.debugTypeInfo
import org.jetbrains.kotlin.psi.debugText.getDebugText
@@ -272,6 +272,8 @@ public class TypeResolver(
val projectionKind = argumentElement.getProjectionKind()
ModifiersChecker.checkIncompatibleVarianceModifiers(argumentElement.getModifierList(), c.trace)
if (projectionKind == JetProjectionKind.STAR) {
ModifiersChecker.reportIllegalModifiers(argumentElement.getModifierList(), listOf(JetTokens.IN_KEYWORD, JetTokens.OUT_KEYWORD), c.trace)
val parameters = constructor.getParameters()
if (parameters.size() > i) {
val parameterDescriptor = parameters[i]
@@ -282,8 +284,7 @@ public class TypeResolver(
}
}
else {
// TODO : handle the Foo<in *> case
val type = resolveType(c.noBareTypes(), argumentElement.getTypeReference())
val type = resolveType(c.noBareTypes(), argumentElement.getTypeReference()!!)
val kind = resolveProjectionKind(projectionKind)
if (constructor.getParameters().size() > i) {
val parameterDescriptor = constructor.getParameters()[i]
@@ -0,0 +1,11 @@
// Reproduces exception in TypeResolver.kt: EA-66870
import java.util.ArrayList
abstract class J {
public abstract fun <T : Collection<S>, S : List<<!ILLEGAL_MODIFIER!>in<!> *>> foo(x: T)
fun bar() {
val s = ArrayList<ArrayList<Int>>()
foo(s)
}
}
@@ -0,0 +1,10 @@
package
internal abstract class J {
public constructor J()
internal final fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun </*0*/ T : kotlin.Collection<S>, /*1*/ S : kotlin.List<*>> foo(/*0*/ x: T): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,11 @@
// Reproduces exception in TypeResolver.kt: EA-66870
import java.util.ArrayList
abstract class J {
public abstract fun <T : Collection<S>, S : List<<!ILLEGAL_MODIFIER!>out<!> *>> foo(x: T)
fun bar() {
val s = ArrayList<ArrayList<Int>>()
foo(s)
}
}
@@ -0,0 +1,10 @@
package
internal abstract class J {
public constructor J()
internal final fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun </*0*/ T : kotlin.Collection<S>, /*1*/ S : kotlin.List<*>> foo(/*0*/ x: T): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -35,6 +35,18 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("instar.kt")
public void testInstar() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/instar.kt");
doTest(fileName);
}
@TestMetadata("outstar.kt")
public void testOutstar() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/outstar.kt");
doTest(fileName);
}
@TestMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)