Kapt: JeTypeElement getInterfaces() and getSuperClass() should provide reference type mirrors

(cherry picked from commit 5f50ab6)
This commit is contained in:
Yan Zhulanow
2016-08-23 19:50:08 +03:00
committed by Yan Zhulanow
parent cd44540965
commit ebcc762ae9
3 changed files with 34 additions and 2 deletions
@@ -0,0 +1,6 @@
@Deprecated("")
class A : B<Int>(), C<Int>
open class B<T>
interface C<T> {}
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.java.model.elements
import com.intellij.psi.*
import com.intellij.psi.impl.source.PsiClassReferenceType
import com.intellij.psi.util.ClassUtil
import com.intellij.psi.util.PsiTypesUtil
import org.jetbrains.kotlin.java.model.*
@@ -36,12 +37,28 @@ class JeTypeElement(override val psi: PsiClass) : JeElement, TypeElement, JeAnno
override fun getQualifiedName() = JeName(psi.qualifiedName)
private fun getSuperType(superTypes: Array<PsiClassType>, superClass: PsiClass): PsiClassType {
return superTypes.firstOrNull { it is PsiClassReferenceType && it.resolve() == superClass }
?: PsiTypesUtil.getClassType(superClass)
}
override fun getSuperclass(): TypeMirror {
val superClass = psi.superClass ?: return JeNoneType
return PsiTypesUtil.getClassType(superClass).toJeType(psi.manager)
val psiType = getSuperType(psi.superTypes, superClass)
return psiType.toJeType(psi.manager)
}
override fun getInterfaces() = psi.interfaces.map { PsiTypesUtil.getClassType(it).toJeType(psi.manager) }
override fun getInterfaces(): List<TypeMirror> {
val superTypes = psi.superTypes
val interfaces = mutableListOf<TypeMirror>()
for (intf in psi.interfaces) {
val psiType = getSuperType(superTypes, intf)
interfaces += psiType.toJeType(psi.manager)
}
return interfaces
}
override fun getTypeParameters() = psi.typeParameters.map { JeTypeParameterElement(it, this) }
@@ -119,4 +119,13 @@ class ProcessorTests : AbstractProcessorTest() {
assertNotNull(suppress)
assertEquals(listOf("Tom", "Mary"), suppress!!.names.toList())
}
fun testTypeArguments() = test("TypeArguments", "*") { set, roundEnv, env ->
val classA = env.findClass("A")
val superB = classA.superclass as JeDeclaredType
val interfaceC = classA.interfaces[0] as JeDeclaredType
assertTrue(superB.typeArguments.size == 1)
assertTrue(interfaceC.typeArguments.size == 1)
}
}