Uast: Ability to get the default class type from UClass
This commit is contained in:
@@ -18,9 +18,13 @@ package org.jetbrains.uast
|
|||||||
import org.jetbrains.uast.kinds.UastClassKind
|
import org.jetbrains.uast.kinds.UastClassKind
|
||||||
|
|
||||||
interface UClass : UDeclaration, UFqNamed, UModifierOwner, UAnnotated {
|
interface UClass : UDeclaration, UFqNamed, UModifierOwner, UAnnotated {
|
||||||
|
/* The simple class name is only for the debug purposes. Do not check against it in the production code */
|
||||||
|
override val name: String
|
||||||
|
|
||||||
val isAnonymous: Boolean
|
val isAnonymous: Boolean
|
||||||
val visibility: UastVisibility
|
val visibility: UastVisibility
|
||||||
val kind: UastClassKind
|
val kind: UastClassKind
|
||||||
|
val defaultType: UType
|
||||||
|
|
||||||
val companions: List<UClass>
|
val companions: List<UClass>
|
||||||
|
|
||||||
@@ -78,7 +82,7 @@ object UClassNotResolved : UClass {
|
|||||||
override val declarations = emptyList<UDeclaration>()
|
override val declarations = emptyList<UDeclaration>()
|
||||||
override fun isSubclassOf(name: String) = false
|
override fun isSubclassOf(name: String) = false
|
||||||
override val companions = emptyList<UClass>()
|
override val companions = emptyList<UClass>()
|
||||||
|
override val defaultType = UastErrorType
|
||||||
override val nameElement = null
|
override val nameElement = null
|
||||||
override val parent = null
|
override val parent = null
|
||||||
override val name = "<class not resolved>"
|
override val name = "<class not resolved>"
|
||||||
|
|||||||
@@ -35,3 +35,12 @@ interface UTypeReference : UDeclaration, UResolvable, NoTraverse {
|
|||||||
override fun resolve(context: UastContext): UClass?
|
override fun resolve(context: UastContext): UClass?
|
||||||
override fun resolveOrEmpty(context: UastContext) = resolve(context) ?: UClassNotResolved
|
override fun resolveOrEmpty(context: UastContext) = resolve(context) ?: UClassNotResolved
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object UastErrorType : UType, NoAnnotations {
|
||||||
|
override val isInt = false
|
||||||
|
override val parent = null
|
||||||
|
override val name = "<error>"
|
||||||
|
override val fqName = null
|
||||||
|
override val isBoolean = false
|
||||||
|
override fun resolve(context: UastContext) = null
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
package org.jetbrains.uast.java
|
package org.jetbrains.uast.java
|
||||||
|
|
||||||
import com.intellij.psi.*
|
import com.intellij.psi.*
|
||||||
|
import com.intellij.psi.util.PsiTypesUtil
|
||||||
import org.jetbrains.uast.*
|
import org.jetbrains.uast.*
|
||||||
import org.jetbrains.uast.kinds.UastClassKind
|
import org.jetbrains.uast.kinds.UastClassKind
|
||||||
import org.jetbrains.uast.psi.PsiElementBacked
|
import org.jetbrains.uast.psi.PsiElementBacked
|
||||||
@@ -50,6 +51,8 @@ class JavaUClass(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override val defaultType by lz { JavaConverter.convert(PsiTypesUtil.getClassType(psi), this) }
|
||||||
|
|
||||||
override val companions: List<UClass>
|
override val companions: List<UClass>
|
||||||
get() = emptyList()
|
get() = emptyList()
|
||||||
|
|
||||||
|
|||||||
@@ -169,9 +169,9 @@ internal object KotlinConverter : UastConverter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal fun convert(typeReference: KtTypeReference?, parent: UElement): UType {
|
internal fun convert(typeReference: KtTypeReference?, parent: UElement): UType {
|
||||||
if (typeReference == null) return KotlinUErrorType
|
if (typeReference == null) return UastErrorType
|
||||||
val bindingContext = typeReference.analyze(BodyResolveMode.PARTIAL)
|
val bindingContext = typeReference.analyze(BodyResolveMode.PARTIAL)
|
||||||
val type = bindingContext[BindingContext.TYPE, typeReference] ?: return KotlinUErrorType
|
val type = bindingContext[BindingContext.TYPE, typeReference] ?: return UastErrorType
|
||||||
return convert(type, typeReference.project, parent)
|
return convert(type, typeReference.project, parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,6 +66,11 @@ class KotlinUClass(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override val defaultType by lz {
|
||||||
|
val type = resolveToDescriptor()?.defaultType ?: return@lz UastErrorType
|
||||||
|
KotlinConverter.convert(type, psi.project, this)
|
||||||
|
}
|
||||||
|
|
||||||
override val companions by lz {
|
override val companions by lz {
|
||||||
(psi as? KtClass)?.getCompanionObjects()?.map { KotlinConverter.convert(it, this) } ?: emptyList()
|
(psi as? KtClass)?.getCompanionObjects()?.map { KotlinConverter.convert(it, this) } ?: emptyList()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,12 +47,3 @@ class KotlinUType(
|
|||||||
//TODO
|
//TODO
|
||||||
override val annotations = emptyList<UAnnotation>()
|
override val annotations = emptyList<UAnnotation>()
|
||||||
}
|
}
|
||||||
|
|
||||||
object KotlinUErrorType : UType, NoAnnotations {
|
|
||||||
override val isInt = false
|
|
||||||
override val parent = null
|
|
||||||
override val name = "<error>"
|
|
||||||
override val fqName = null
|
|
||||||
override val isBoolean = false
|
|
||||||
override fun resolve(context: UastContext) = null
|
|
||||||
}
|
|
||||||
@@ -37,8 +37,8 @@ open class KotlinUVariable(
|
|||||||
override val initializer by lz { KotlinConverter.convertOrEmpty(psi.initializer, this) }
|
override val initializer by lz { KotlinConverter.convertOrEmpty(psi.initializer, this) }
|
||||||
|
|
||||||
override val type by lz {
|
override val type by lz {
|
||||||
val descriptor = psi.resolveToDescriptorIfAny() as? CallableDescriptor ?: return@lz KotlinUErrorType
|
val descriptor = psi.resolveToDescriptorIfAny() as? CallableDescriptor ?: return@lz UastErrorType
|
||||||
val type = descriptor.returnType ?: return@lz KotlinUErrorType
|
val type = descriptor.returnType ?: return@lz UastErrorType
|
||||||
KotlinConverter.convert(type, psi.project, this)
|
KotlinConverter.convert(type, psi.project, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,11 +58,12 @@ class KotlinDestructuredUVariable(
|
|||||||
parent: UElement
|
parent: UElement
|
||||||
) : KotlinUVariable(entry, parent) {
|
) : KotlinUVariable(entry, parent) {
|
||||||
override lateinit var initializer: UExpression
|
override lateinit var initializer: UExpression
|
||||||
|
internal set
|
||||||
|
|
||||||
override val type by lz {
|
override val type by lz {
|
||||||
val bindingContext = entry.analyze(BodyResolveMode.PARTIAL)
|
val bindingContext = entry.analyze(BodyResolveMode.PARTIAL)
|
||||||
val resolvedCall = bindingContext[BindingContext.COMPONENT_RESOLVED_CALL, entry] ?: return@lz KotlinUErrorType
|
val resolvedCall = bindingContext[BindingContext.COMPONENT_RESOLVED_CALL, entry] ?: return@lz UastErrorType
|
||||||
val returnType = resolvedCall.resultingDescriptor.returnType ?: return@lz KotlinUErrorType
|
val returnType = resolvedCall.resultingDescriptor.returnType ?: return@lz UastErrorType
|
||||||
KotlinConverter.convert(returnType, entry.project, this)
|
KotlinConverter.convert(returnType, entry.project, this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +76,7 @@ class KotlinDestructuringUVariable(
|
|||||||
override val initializer by lz { KotlinConverter.convertOrEmpty(psi.initializer, this) }
|
override val initializer by lz { KotlinConverter.convertOrEmpty(psi.initializer, this) }
|
||||||
override val kind = UastVariableKind.LOCAL_VARIABLE
|
override val kind = UastVariableKind.LOCAL_VARIABLE
|
||||||
override val type: UType
|
override val type: UType
|
||||||
get() = initializer.getExpressionType() ?: KotlinUErrorType
|
get() = initializer.getExpressionType() ?: UastErrorType
|
||||||
|
|
||||||
override val nameElement = null
|
override val nameElement = null
|
||||||
override fun hasModifier(modifier: UastModifier) = false
|
override fun hasModifier(modifier: UastModifier) = false
|
||||||
@@ -91,13 +92,13 @@ class KotlinParameterUVariable(
|
|||||||
|
|
||||||
override val nameElement by lz { KotlinConverter.asSimpleReference(psi.nameIdentifier, this) }
|
override val nameElement by lz { KotlinConverter.asSimpleReference(psi.nameIdentifier, this) }
|
||||||
|
|
||||||
override val initializer by lz { KotlinConverter.convertOrEmpty(psi.defaultValue, this) }
|
override val initializer by lz { KotlinConverter.convert(psi.defaultValue, this) as? UExpression }
|
||||||
|
|
||||||
override val kind = UastVariableKind.VALUE_PARAMETER
|
override val kind = UastVariableKind.VALUE_PARAMETER
|
||||||
|
|
||||||
override val type by lz {
|
override val type by lz {
|
||||||
val bindingContext = psi.analyze(BodyResolveMode.PARTIAL)
|
val bindingContext = psi.analyze(BodyResolveMode.PARTIAL)
|
||||||
val param = bindingContext[BindingContext.VALUE_PARAMETER, psi] ?: return@lz KotlinUErrorType
|
val param = bindingContext[BindingContext.VALUE_PARAMETER, psi] ?: return@lz UastErrorType
|
||||||
KotlinConverter.convert(param.type, psi.project, this)
|
KotlinConverter.convert(param.type, psi.project, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user