From ccb3e63638da051363365835108cf2967a1f5789 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 21 Nov 2011 13:37:25 +0400 Subject: [PATCH] fixed raw generic types fir KT-540 --- .../jet/j2k/visitors/TypeVisitor.java | 42 +++++++++++++++---- .../file/fullQualifiedName.kt | 2 +- .../file/fullQualifiedName2.kt | 2 +- testData/ast/rawGenerics/file/kt-540.jav | 12 ++++++ testData/ast/rawGenerics/file/kt-540.kt | 11 +++++ 5 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 testData/ast/rawGenerics/file/kt-540.jav create mode 100644 testData/ast/rawGenerics/file/kt-540.kt diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 31a100edb0d..d77ca625af0 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -6,6 +6,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; +import java.util.List; + import static org.jetbrains.jet.j2k.Converter.typeToType; import static org.jetbrains.jet.j2k.Converter.typesToTypeList; @@ -43,9 +46,23 @@ public class TypeVisitor extends PsiTypeVisitor { @Override public Type visitClassType(PsiClassType classType) { - String classTypeName = getClassTypeName(classType); + String classTypeName = createQualifiedName(classType); + if (classTypeName.equals("")) + classTypeName = getClassTypeName(classType); + List resolvedClassTypeParams = createRawTypesForResolvedReference(classType); - if (classType instanceof PsiClassReferenceType) { // TODO: simplify + final IdentifierImpl identifier = new IdentifierImpl(classTypeName); + if (classType.getParameterCount() == 0 && resolvedClassTypeParams.size() > 0) + myResult = new ClassType(identifier, resolvedClassTypeParams); + else + myResult = new ClassType(identifier, typesToTypeList(classType.getParameters())); + return super.visitClassType(classType); + } + + @NotNull + private static String createQualifiedName(@NotNull PsiClassType classType) { + String classTypeName = ""; + if (classType instanceof PsiClassReferenceType) { final PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType) classType).getReference(); if (reference.isQualified()) { String result = new IdentifierImpl(reference.getReferenceName()).toKotlin(); @@ -58,12 +75,23 @@ public class TypeVisitor extends PsiTypeVisitor { classTypeName = result; } } + return classTypeName; + } - myResult = new ClassType( - new IdentifierImpl(classTypeName), - typesToTypeList(classType.getParameters()) - ); - return super.visitClassType(classType); + @NotNull + private static List createRawTypesForResolvedReference(@NotNull PsiClassType classType) { + final List typeParams = new LinkedList(); + if (classType instanceof PsiClassReferenceType) { + final PsiJavaCodeReferenceElement reference = ((PsiClassReferenceType) classType).getReference(); + final PsiElement resolve = reference.resolve(); + if (resolve != null) { + if (resolve instanceof PsiClass) + //noinspection UnusedDeclaration + for (PsiTypeParameter p : ((PsiClass) resolve).getTypeParameters()) + typeParams.add(new StarProjectionType()); + } + } + return typeParams; } @NotNull diff --git a/testData/ast/newClassExpression/file/fullQualifiedName.kt b/testData/ast/newClassExpression/file/fullQualifiedName.kt index 4efc2e46426..18839b09afd 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName.kt @@ -2,7 +2,7 @@ namespace test { import java.util.List open class User() { open fun main() : Unit { -var list : List? = java.util.LinkedList() +var list : List<*>? = java.util.LinkedList() } } } \ No newline at end of file diff --git a/testData/ast/newClassExpression/file/fullQualifiedName2.kt b/testData/ast/newClassExpression/file/fullQualifiedName2.kt index 2196aa0fff2..474fda2fcd5 100644 --- a/testData/ast/newClassExpression/file/fullQualifiedName2.kt +++ b/testData/ast/newClassExpression/file/fullQualifiedName2.kt @@ -1,7 +1,7 @@ namespace test { open class User() { open fun main() : Unit { -var list : java.util.List? = java.util.LinkedList() +var list : java.util.List<*>? = java.util.LinkedList() } } } \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540.jav b/testData/ast/rawGenerics/file/kt-540.jav new file mode 100644 index 00000000000..6327874eab3 --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540.jav @@ -0,0 +1,12 @@ +package demo; + +import java.util.List; +import java.util.LinkedList; + +class Test { + void main() { + List common = new LinkedList(); + List raw = new LinkedList(); + List superRaw = new LinkedList(); + } +} \ No newline at end of file diff --git a/testData/ast/rawGenerics/file/kt-540.kt b/testData/ast/rawGenerics/file/kt-540.kt new file mode 100644 index 00000000000..7d2290afbf1 --- /dev/null +++ b/testData/ast/rawGenerics/file/kt-540.kt @@ -0,0 +1,11 @@ +namespace demo { +import java.util.List +import java.util.LinkedList +open class Test() { +open fun main() : Unit { +var common : List? = LinkedList() +var raw : List<*>? = LinkedList() +var superRaw : List<*>? = LinkedList() +} +} +} \ No newline at end of file