KT-864 wrong namespace class name generation

This commit is contained in:
Alex Tkachman
2012-01-04 12:12:02 +02:00
parent bf29d48772
commit 15fde646c1
6 changed files with 37 additions and 14 deletions
@@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter; import org.objectweb.asm.commons.InstructionAdapter;
@@ -86,10 +87,11 @@ public abstract class CodegenContext {
} }
public String getNamespaceClassName() { public String getNamespaceClassName() {
if(parentContext != STATIC) DeclarationDescriptor descriptor = contextType;
return parentContext.getNamespaceClassName(); while(!(descriptor instanceof NamespaceDescriptor)) {
descriptor = descriptor.getContainingDeclaration();
return NamespaceCodegen.getJVMClassName(contextType.getName()); }
return NamespaceCodegen.getJVMClassName(DescriptorUtils.getFQName(descriptor));
} }
public OwnerKind getContextKind() { public OwnerKind getContextKind() {
@@ -173,10 +173,10 @@ public class GenerationState {
final ClassFileFactory factory = getFactory(); final ClassFileFactory factory = getFactory();
List<String> files = factory.files(); List<String> files = factory.files();
for (String file : files) { for (String file : files) {
if (!file.startsWith("std/")) { // if (!file.startsWith("std/")) {
answer.append("@").append(file).append('\n'); answer.append("@").append(file).append('\n');
answer.append(factory.asText(file)); answer.append(factory.asText(file));
} // }
} }
return answer.toString(); return answer.toString();
@@ -119,7 +119,7 @@ public class NamespaceCodegen {
private void generateTypeInfoFields(JetFile file, CodegenContext context) { private void generateTypeInfoFields(JetFile file, CodegenContext context) {
if(context.typeInfoConstants != null) { if(context.typeInfoConstants != null) {
String jvmClassName = getJVMClassName(file.getNamespaceHeader().getName()); String jvmClassName = getJVMClassName(JetPsiUtil.getFQName(file));
for(int index = 0; index != context.typeInfoConstantsCount; index++) { for(int index = 0; index != context.typeInfoConstantsCount; index++) {
JetType type = context.reverseTypeInfoConstants.get(index); JetType type = context.reverseTypeInfoConstants.get(index);
String fieldName = "$typeInfoCache$" + index; String fieldName = "$typeInfoCache$" + index;
@@ -0,0 +1,20 @@
import std.io.*
import std.util.*
import java.io.*
import java.util.*
fun sample() : Reader {
return StringReader("""Hello
World""");
}
fun box() : String {
// TODO compiler error
// both these expressions causes java.lang.NoClassDefFoundError: collections/namespace
val list1 = sample().useLines{it.toArrayList()}
val list2 = sample().useLines<ArrayList<String>>{it.toArrayList()}
if(arrayList("Hello", "World") != list1) return "fail"
if(arrayList("Hello", "World") != list2) return "fail"
return "OK"
}
@@ -76,4 +76,8 @@ public class StdlibTest extends CodegenTestCase {
public void testKt715 () { public void testKt715 () {
blackBoxFile("regressions/kt715.kt"); blackBoxFile("regressions/kt715.kt");
} }
public void testKt864 () {
blackBoxFile("regressions/kt864.jet");
}
} }
+4 -7
View File
@@ -24,14 +24,11 @@ World""");
} }
fun testLineIterator() { fun testLineIterator() {
/* val list1 = sample().useLines{it.toArrayList()}
// TODO compiler error val list2 = sample().useLines<ArrayList<String>>{it.toArrayList()}
// both these expressions causes java.lang.NoClassDefFoundError: collections/namespace
val list = sample().useLines{it.toArrayList()}
val list = sample().useLines<ArrayList<String>>{it.toArrayList()}
assertEquals(arrayList("Hello", "World"), list) assertEquals(arrayList("Hello", "World"), list1)
*/ assertEquals(arrayList("Hello", "World"), list2)
} }
fun testUse() { fun testUse() {