EA-36903 - ISE: JavaTypeTransformer$.visitClassType Fixed

This commit is contained in:
Andrey Breslav
2013-01-10 15:30:03 +04:00
parent 33a82da493
commit 9d538dad8a
5 changed files with 58 additions and 14 deletions
@@ -158,8 +158,8 @@ public class JavaTypeTransformer {
} }
List<TypeProjection> arguments = Lists.newArrayList(); List<TypeProjection> arguments = Lists.newArrayList();
if (classType.isRaw()) { List<TypeParameterDescriptor> parameters = classData.getTypeConstructor().getParameters();
List<TypeParameterDescriptor> parameters = classData.getTypeConstructor().getParameters(); if (isRaw(classType, !parameters.isEmpty())) {
for (TypeParameterDescriptor parameter : parameters) { for (TypeParameterDescriptor parameter : parameters) {
TypeProjection starProjection = SubstitutionUtils.makeStarProjection(parameter); TypeProjection starProjection = SubstitutionUtils.makeStarProjection(parameter);
if (howThisTypeIsUsed == SUPERTYPE) { if (howThisTypeIsUsed == SUPERTYPE) {
@@ -172,7 +172,6 @@ public class JavaTypeTransformer {
} }
} }
else { else {
List<TypeParameterDescriptor> parameters = classData.getTypeConstructor().getParameters();
PsiType[] psiArguments = classType.getParameters(); PsiType[] psiArguments = classType.getParameters();
if (parameters.size() != psiArguments.length) { if (parameters.size() != psiArguments.length) {
@@ -252,4 +251,12 @@ public class JavaTypeTransformer {
}); });
return result; return result;
} }
private static boolean isRaw(@NotNull PsiClassType classType, boolean argumentsExpected) {
// The second option is needed because sometimes we get weird versions of JDK classes in teh class path,
// such as collections with no generics, so the Java types are not raw, formally, but they don't match with
// their Kotlin analogs, so we treat them as raw to avoid exceptions
return classType.isRaw() || argumentsExpected && classType.getParameterCount() == 0;
}
} }
@@ -0,0 +1,24 @@
// FILE: java/util/Collection.java
package java.util;
public class Collection {
public void foo() {}
}
// FILE: test/Usage.java
package test;
import java.util.*;
public class Usage {
void foo(Collection c) {
c.foo();
}
}
// FILE: Kotlin.kt
package test
fun foo(u: Usage) {
u.foo(null)
}
@@ -26,10 +26,13 @@ import org.junit.Test;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import static org.jetbrains.jet.ConfigurationKind.ALL; import static org.jetbrains.jet.ConfigurationKind.ALL;
import static org.jetbrains.jet.ConfigurationKind.JDK_AND_ANNOTATIONS; import static org.jetbrains.jet.ConfigurationKind.JDK_AND_ANNOTATIONS;
import static org.jetbrains.jet.cli.jvm.JVMConfigurationKeys.*; import static org.jetbrains.jet.cli.jvm.JVMConfigurationKeys.ANNOTATIONS_PATH_KEY;
import static org.jetbrains.jet.cli.jvm.JVMConfigurationKeys.CLASSPATH_KEY;
public class CompileCompilerDependenciesTest { public class CompileCompilerDependenciesTest {
@@ -48,14 +51,22 @@ public class CompileCompilerDependenciesTest {
ForTestCompileRuntime.runtimeJarForTests(); ForTestCompileRuntime.runtimeJarForTests();
} }
@NotNull
public static CompilerConfiguration compilerConfigurationForTests(@NotNull ConfigurationKind configurationKind, public static CompilerConfiguration compilerConfigurationForTests(@NotNull ConfigurationKind configurationKind,
@NotNull TestJdkKind jdkKind, File... extraClasspath) { @NotNull TestJdkKind jdkKind, File... extraClasspath) {
return compilerConfigurationForTests(configurationKind, jdkKind, Arrays.asList(extraClasspath), Collections.<File>emptyList());
}
@NotNull
public static CompilerConfiguration compilerConfigurationForTests(@NotNull ConfigurationKind configurationKind,
@NotNull TestJdkKind jdkKind, @NotNull Collection<File> extraClasspath, @NotNull Collection<File> priorityClasspath) {
CompilerConfiguration configuration = new CompilerConfiguration(); CompilerConfiguration configuration = new CompilerConfiguration();
configuration.addAll(CLASSPATH_KEY, priorityClasspath);
configuration.add(CLASSPATH_KEY, jdkKind == TestJdkKind.MOCK_JDK ? JetTestUtils.findMockJdkRtJar() : PathUtil.findRtJar()); configuration.add(CLASSPATH_KEY, jdkKind == TestJdkKind.MOCK_JDK ? JetTestUtils.findMockJdkRtJar() : PathUtil.findRtJar());
if (configurationKind == ALL) { if (configurationKind == ALL) {
configuration.add(CLASSPATH_KEY, ForTestCompileRuntime.runtimeJarForTests()); configuration.add(CLASSPATH_KEY, ForTestCompileRuntime.runtimeJarForTests());
} }
configuration.addAll(CLASSPATH_KEY, Arrays.asList(extraClasspath)); configuration.addAll(CLASSPATH_KEY, extraClasspath);
if (configurationKind == ALL || configurationKind == JDK_AND_ANNOTATIONS) { if (configurationKind == ALL || configurationKind == JDK_AND_ANNOTATIONS) {
configuration.add(ANNOTATIONS_PATH_KEY, ForTestPackJdkAnnotations.jdkAnnotationsForTests()); configuration.add(ANNOTATIONS_PATH_KEY, ForTestPackJdkAnnotations.jdkAnnotationsForTests());
@@ -30,13 +30,13 @@ import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.utils.ExceptionUtils; import org.jetbrains.jet.utils.ExceptionUtils;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.List; import java.util.List;
public abstract class AbstractJetDiagnosticsTest extends JetLiteFixture { public abstract class AbstractJetDiagnosticsTest extends JetLiteFixture {
@@ -53,10 +53,10 @@ public abstract class AbstractJetDiagnosticsTest extends JetLiteFixture {
return new JetCoreEnvironment( return new JetCoreEnvironment(
getTestRootDisposable(), getTestRootDisposable(),
CompileCompilerDependenciesTest.compilerConfigurationForTests( CompileCompilerDependenciesTest.compilerConfigurationForTests(
ConfigurationKind.JDK_AND_ANNOTATIONS, ConfigurationKind.JDK_AND_ANNOTATIONS,
TestJdkKind.MOCK_JDK, TestJdkKind.MOCK_JDK,
JetTestUtils.getAnnotationsJar(), Arrays.asList(JetTestUtils.getAnnotationsJar()),
javaFilesDir Arrays.asList(javaFilesDir)
) )
); );
} }
@@ -15,16 +15,13 @@
*/ */
package org.jetbrains.jet.checkers; package org.jetbrains.jet.checkers;
import junit.framework.Assert;
import junit.framework.Test; import junit.framework.Test;
import junit.framework.TestSuite; import junit.framework.TestSuite;
import java.io.File;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.InnerTestClasses;
import org.jetbrains.jet.test.TestMetadata; import org.jetbrains.jet.test.TestMetadata;
import org.jetbrains.jet.checkers.AbstractDiagnosticsTestWithEagerResolve; import java.io.File;
/** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */
@InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class}) @InnerTestClasses({JetDiagnosticsTestGenerated.Tests.class, JetDiagnosticsTestGenerated.Script.class})
@@ -1839,6 +1836,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
doTest("compiler/testData/diagnostics/tests/generics/Projections.kt"); doTest("compiler/testData/diagnostics/tests/generics/Projections.kt");
} }
@TestMetadata("PseudoRawTypes.kt")
public void testPseudoRawTypes() throws Exception {
doTest("compiler/testData/diagnostics/tests/generics/PseudoRawTypes.kt");
}
@TestMetadata("RawTypeInIsExpression.kt") @TestMetadata("RawTypeInIsExpression.kt")
public void testRawTypeInIsExpression() throws Exception { public void testRawTypeInIsExpression() throws Exception {
doTest("compiler/testData/diagnostics/tests/generics/RawTypeInIsExpression.kt"); doTest("compiler/testData/diagnostics/tests/generics/RawTypeInIsExpression.kt");