KT-1388 Parse static final fields from java binary classes as non-null

#KT-1388 Fixed
This commit is contained in:
Stepan Koltsov
2012-05-13 00:53:37 +04:00
parent ae58c1c888
commit 8c8ed3a1ee
28 changed files with 80 additions and 50 deletions
@@ -1368,6 +1368,10 @@ public class JavaDescriptorResolver {
if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
}
else if (members.getter == null && members.setter == null && members.field.getMember().isFinal() && members.field.getMember().isStatic()) {
// http://youtrack.jetbrains.com/issue/KT-1388
propertyType = TypeUtils.makeNotNullable(propertyType);
}
}
JetType receiverType;
@@ -151,9 +151,9 @@ fun html(init : HTML.() -> Unit) : HTML {
fun <K, V> Map<K, V>.set(key : K, value : V) = this.put(key, value)
fun println(message : Any?) {
System.out?.println(message)
System.out.println(message)
}
fun print(message : Any?) {
System.out?.print(message)
System.out.print(message)
}
@@ -26,6 +26,6 @@ val d = b.<!UNRESOLVED_REFERENCE!>x<!>
val s = <!NO_CLASS_OBJECT!>System<!> // error
fun test() {
System.out?.println()
java.lang.System.out?.println()
System.out.println()
java.lang.System.out.println()
}
@@ -8,8 +8,8 @@ fun test() {
a?.plus(1)
}
val out : java.io.PrintStream? = null//= System.out
val ins = System.`in`
val out : java.io.PrintStream? = null
val ins : java.io.InputStream? = null
out?.println()
ins?.read()
@@ -35,7 +35,7 @@ fun test(<!UNUSED_PARAMETER!>l<!> : java.util.List<Int>) {
// ...
}
catch(e: Exception) {
System.out?.println(e.getMessage())
System.out.println(e.getMessage())
}
PrintStream("sdf")
@@ -22,10 +22,10 @@ fun main(args : Array<String>) {
test(al, m)
}
fun test(a : List<Int>, m : Map<String, Int>) {
System.out?.println(
System.out.println(
a.get(0) + 1
)
HashMap<Int, Int>().get(0)
if (m.get("") != null)
System.out?.println(m.get("").sure().plus(1))
System.out.println(m.get("").sure().plus(1))
}
@@ -3,5 +3,5 @@
fun foo(maybe: Int?) {
val i : Int = maybe ?: throw RuntimeException("No value")
System.out?.println(i)
System.out.println(i)
}
@@ -15,7 +15,7 @@ fun foo(){
}
bar()
System.out?.println(local)
System.out.println(local)
}
fun <T> Iterable<T>.foreach(operation: (element: T) -> Unit) {
@@ -9,7 +9,7 @@ fun main(args : Array<String>) {
2 -> i = 2 // i is surrounded by a black border
else -> <!UNRESOLVED_REFERENCE!>j<!> = 2
}
System.out?.println(i)
System.out.println(i)
}
//KT-351 Distinguish statement and expression positions
@@ -57,7 +57,7 @@ import outer.*
fun main(args: Array<String>) {
System.out?.print(1)
System.out.print(1)
val command = parse("")
@@ -23,6 +23,6 @@ fun <T : Any> T?.iterator() = object {
fun main(args : Array<String>) {
val i : Int? = 1
for (x in i) {
System.out?.println(x)
System.out.println(x)
}
}
@@ -7,7 +7,7 @@ fun f(s: String?) {
if (s != null) {
s.length //ok
var <!UNUSED_VARIABLE!>i<!> = s.length //error: Only safe calls are allowed on a nullable receiver
System.out?.println(s.length) //error
System.out.println(s.length) //error
}
}
@@ -39,7 +39,7 @@ fun evaluate(expr: StringBuilder, numbers: ArrayList<Int>): Int {
}
fun main(args: Array<String>) {
System.out?.println("24 game")
System.out.println("24 game")
val numbers = ArrayList<Int>(4)
val rnd = Random();
val prompt = StringBuilder()
@@ -49,18 +49,18 @@ fun main(args: Array<String>) {
if (i > 0) prompt.append(" ");
prompt.append(n)
}
System.out?.println("Your numbers: " + prompt)
System.out?.println("Enter your expression:")
System.out.println("Your numbers: " + prompt)
System.out.println("Enter your expression:")
val reader = BufferedReader(InputStreamReader(System.`in`))
val expr = StringBuilder(reader.readLine())
try {
val result = evaluate(expr, numbers)
if (result != 24)
System.out?.println("Sorry, that's " + result)
System.out.println("Sorry, that's " + result)
else
System.out?.println("You won!");
System.out.println("You won!");
}
catch(e: Throwable) {
System.out?.println(e.getMessage())
System.out.println(e.getMessage())
}
}
@@ -11,7 +11,7 @@ val items: ArrayList<Item> = ArrayList<Item>
fun test(room : Object) {
for(val item: Item? in items) {
if (item?.room === room) {
System.out?.println("You see " + item?.name)
System.out.println("You see " + item?.name)
}
}
}
@@ -6,7 +6,7 @@ fun main(args : Array<String>)
{
val c = ArrayList<Int>()
c.add(3)
System.out?.println(++(c[0]))
System.out?.println((c[1])--)
System.out?.println(-(c[2]))
System.out.println(++(c[0]))
System.out.println((c[1])--)
System.out.println(-(c[2]))
}
@@ -25,8 +25,8 @@ fun <T> generic_invoker(gen : () -> T) : T {
return gen()
}
fun println(message : Int) { System.out?.println(message) }
fun println(message : Long) { System.out?.println(message) }
fun println(message : Int) { System.out.println(message) }
fun println(message : Long) { System.out.println(message) }
inline fun run<T>(body : () -> T) : T = body()
fun main(args : Array<String>) {
@@ -8,7 +8,7 @@ fun bar(list : List<Int>) {
for (i in 1..10) {
list += i // error
}
System.out?.println(list)
System.out.println(list)
}
fun <T> List<T>.plusAssign(t : T) {
@@ -12,6 +12,6 @@ package demo
fun main(args : Array<String>) {
for (a in filter(args, {it.length > 1})) {
System.out?.println("Hello, ${a}!")
System.out.println("Hello, ${a}!")
}
}
@@ -12,5 +12,5 @@ fun <T> TypeInfo<T>.getJavaClass() : java.lang.Class<T> {
fun getJavaClass<T>() = typeinfo<T>.getJavaClass()
fun main(args : Array<String>) {
System.out?.println(getJavaClass<String>)
System.out.println(getJavaClass<String>)
}
@@ -4,5 +4,5 @@ fun main(args : Array<String>) {
var s : Int? = Integer.valueOf(100)
val o = i .sure() + s.sure()
System.out?.println(o)
System.out.println(o)
}
@@ -0,0 +1,4 @@
class StaticFinal {
public static final String foo = "aaa";
}
@@ -20,14 +20,19 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.di.InjectorForJavaSemanticServices;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.resolve.FqName;
import org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode;
import org.jetbrains.jet.lang.resolve.java.DescriptorSearchRule;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.types.TypeProjection;
import org.junit.Assert;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.Set;
/**
* @author Stepan Koltsov
@@ -40,16 +45,33 @@ public class JavaDescriptorResolverTest extends TestCaseWithTmpdir {
compileFileResolveDescriptor("inner.java", new FqName("A"));
}
private void compileFileResolveDescriptor(@NotNull String fileRelativePath, @NotNull FqName fqName) throws IOException {
// We cannot declare class and namespace with same name in Kotlin
// http://youtrack.jetbrains.com/issue/KT-1388
public void testStaticFinal() throws Exception {
JavaDescriptorResolver javaDescriptorResolver = compileFileGetJavaDescriptorResolver("staticFinal.java");
NamespaceDescriptor ns = javaDescriptorResolver.resolveNamespace(new FqName("StaticFinal"), DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
Set<VariableDescriptor> foos = ns.getMemberScope().getProperties("foo");
Assert.assertEquals(1, foos.size());
VariableDescriptor foo = foos.iterator().next();
Assert.assertFalse(foo.getType().isNullable());
}
private ClassDescriptor compileFileResolveDescriptor(@NotNull String fileRelativePath, @NotNull FqName fqName) throws IOException {
JavaDescriptorResolver javaDescriptorResolver = compileFileGetJavaDescriptorResolver(fileRelativePath);
ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(fqName, DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
Assert.assertNotNull(classDescriptor);
return classDescriptor;
}
private JavaDescriptorResolver compileFileGetJavaDescriptorResolver(String fileRelativePath) throws IOException {
JetTestUtils.compileJavaFile(new File("compiler/testData/javaDescriptorResolver/" + fileRelativePath), tmpdir);
JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS);
JetCoreEnvironment jetCoreEnvironment = JetTestUtils.createEnvironmentWithMockJdkAndIdeaAnnotations(
myTestRootDisposable, CompilerSpecialMode.JDK_HEADERS);
jetCoreEnvironment.addToClasspath(tmpdir);
InjectorForJavaSemanticServices injector = new InjectorForJavaSemanticServices(
jetCoreEnvironment.getCompilerDependencies(), jetCoreEnvironment.getProject());
JavaDescriptorResolver javaDescriptorResolver = injector.getJavaDescriptorResolver();
ClassDescriptor classDescriptor = javaDescriptorResolver.resolveClass(fqName, DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN);
Assert.assertNotNull(classDescriptor);
return injector.getJavaDescriptorResolver();
}
}
+2 -2
View File
@@ -25,6 +25,6 @@ val d = b.<error>x</error>
val s = <error>System</error> // error
fun test() {
System.out?.println()
java.lang.System.out?.println()
System.out.println()
java.lang.System.out.println()
}
+1 -1
View File
@@ -52,7 +52,7 @@ fun Int.foo() = this
fun main(args: Array<String>) {
System.out?.print(1)
System.out.print(1)
val command = parse("")
+3 -3
View File
@@ -7,8 +7,8 @@ fun test() {
a?.plus(1)
}
val out : java.io.PrintStream? = null//= System.out
val ins = System.`in`
val out : java.io.PrintStream? = null
val ins : java.io.InputStream? = null
out?.println()
ins?.read()
@@ -277,4 +277,4 @@ fun f9(a : Int?) : Int {
if (a != null)
return a
return 1
}
}
+1 -1
View File
@@ -33,7 +33,7 @@ fun test(<warning>l</warning> : java.util.List<Int>) {
// ...
}
catch(e: Exception) {
System.out?.println(e.getMessage())
System.out.println(e.getMessage())
}
PrintStream("sdf")
@@ -38,7 +38,7 @@ fun evaluate(expr: StringBuilder, numbers: ArrayList<Int>): Int {
}
fun main(args: Array<String>) {
System.out?.println("24 game")
System.out.println("24 game")
val numbers = ArrayList<Int>(4)
val rnd = Random();
val prompt = StringBuilder()
@@ -48,18 +48,18 @@ fun main(args: Array<String>) {
if (i > 0) prompt.append(" ");
prompt.append(n)
}
System.out?.println("Your numbers: " + prompt)
System.out?.println("Enter your expression:")
System.out.println("Your numbers: " + prompt)
System.out.println("Enter your expression:")
val reader = BufferedReader(InputStreamReader(System.`in`))
val expr = StringBuilder(reader.readLine())
try {
val result = evaluate(expr, numbers)
if (result != 24)
System.out?.println("Sorry, that's " + result)
System.out.println("Sorry, that's " + result)
else
System.out?.println("You won!");
System.out.println("You won!");
}
catch(e: Throwable) {
System.out?.println(e.getMessage())
System.out.println(e.getMessage())
}
}
+1 -1
View File
@@ -11,7 +11,7 @@ val items: ArrayList<Item> = ArrayList<Item>
fun test(room : Object) {
for(val item: Item in items) {
if (item.room === room) {
System.out?.println("You see " + item.name)
System.out.println("You see " + item.name)
}
}
}