Fix assertions generation for substituted members

This commit is contained in:
Alexander Udalov
2013-02-04 22:40:54 +04:00
parent 4fa3909eaf
commit 8eb6047972
5 changed files with 69 additions and 1 deletions
@@ -571,7 +571,7 @@ public class AsmUtil {
) {
if (!state.isGenerateNotNullAssertions()) return;
if (!Boolean.TRUE.equals(state.getBindingContext().get(BindingContext.IS_DECLARED_IN_JAVA, descriptor))) return;
if (!isDeclaredInJava(descriptor, state.getBindingContext())) return;
JetType type = descriptor.getReturnType();
if (type == null || type.isNullable()) return;
@@ -585,6 +585,19 @@ public class AsmUtil {
}
}
private static boolean isDeclaredInJava(@NotNull CallableDescriptor callableDescriptor, @NotNull BindingContext context) {
CallableDescriptor descriptor = callableDescriptor;
while (true) {
if (Boolean.TRUE.equals(context.get(BindingContext.IS_DECLARED_IN_JAVA, descriptor))) {
return true;
}
CallableDescriptor original = descriptor.getOriginal();
if (descriptor == original) break;
descriptor = original;
}
return false;
}
public static void pushDefaultValueOnStack(@NotNull Type type, @NotNull InstructionAdapter v) {
if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
v.aconst(null);
@@ -0,0 +1,9 @@
import java.util.ArrayList
fun foo() {
val a = ArrayList<String>()
a.get(0)
}
fun bar(a: ArrayList<String>) {
}
@@ -0,0 +1,18 @@
import org.jetbrains.annotations.NotNull;
class A<T, U> {
@NotNull
T foo() { return null; }
}
class B<T> extends A<T, Integer> {
@Override
@NotNull
T foo() { return null; }
}
class C extends B<String> {
@Override
@NotNull
String foo() { return null; }
}
@@ -0,0 +1,5 @@
fun bar(a: A<String, Int>, b: B<String>, c: C) {
val sa: String = a.foo()
val sb: String = b.foo()
val sc: String = c.foo()
}
@@ -17,6 +17,7 @@
package org.jetbrains.jet.codegen;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.asm4.ClassReader;
import org.jetbrains.asm4.ClassVisitor;
import org.jetbrains.asm4.MethodVisitor;
@@ -116,6 +117,28 @@ public class GenerateNotNullAssertionsTest extends CodegenTestCase {
assertNoIntrinsicsMethodIsCalled("A");
}
public void testArrayListGet() {
setUpEnvironment(true, true);
loadFile("notNullAssertions/arrayListGet.kt");
String text = generateToText();
assertTrue(text.contains("checkReturnedValueIsNotNull"));
assertTrue(text.contains("checkParameterIsNotNull"));
}
public void testJavaMultipleSubstitutions() {
File javaClassesTempDirectory = compileJava("notNullAssertions/javaMultipleSubstitutions.java");
setUpEnvironment(true, true, javaClassesTempDirectory);
loadFile("notNullAssertions/javaMultipleSubstitutions.kt");
String text = generateToText();
assertEquals(3, StringUtil.getOccurrenceCount(text, "checkReturnedValueIsNotNull"));
assertEquals(3, StringUtil.getOccurrenceCount(text, "checkParameterIsNotNull"));
}
private void assertNoIntrinsicsMethodIsCalled(String className) {
ClassFileFactory classes = generateClassesInFile();
ClassReader reader = new ClassReader(classes.asBytes(className + ".class"));