From 78ce025ca3fdf041ba9b007e7b843e8733b57278 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 15 Mar 2016 20:33:44 +0300 Subject: [PATCH] Uast: Ability to get the default class type from UClass --- .../src/org/jetbrains/uast/declarations/UClass.kt | 6 +++++- .../src/org/jetbrains/uast/declarations/UType.kt | 9 +++++++++ .../uast/java/declarations/JavaUClass.kt | 3 +++ .../kotlin/uast/KotlinUastLanguagePlugin.kt | 4 ++-- .../kotlin/uast/declarations/KotlinUClass.kt | 5 +++++ .../kotlin/uast/declarations/KotlinUType.kt | 9 --------- .../kotlin/uast/declarations/KotlinUVariable.kt | 15 ++++++++------- 7 files changed, 32 insertions(+), 19 deletions(-) diff --git a/plugins/uast-common/src/org/jetbrains/uast/declarations/UClass.kt b/plugins/uast-common/src/org/jetbrains/uast/declarations/UClass.kt index 4c9d591cfc9..a92fdbd226e 100644 --- a/plugins/uast-common/src/org/jetbrains/uast/declarations/UClass.kt +++ b/plugins/uast-common/src/org/jetbrains/uast/declarations/UClass.kt @@ -18,9 +18,13 @@ package org.jetbrains.uast import org.jetbrains.uast.kinds.UastClassKind 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 visibility: UastVisibility val kind: UastClassKind + val defaultType: UType val companions: List @@ -78,7 +82,7 @@ object UClassNotResolved : UClass { override val declarations = emptyList() override fun isSubclassOf(name: String) = false override val companions = emptyList() - + override val defaultType = UastErrorType override val nameElement = null override val parent = null override val name = "" diff --git a/plugins/uast-common/src/org/jetbrains/uast/declarations/UType.kt b/plugins/uast-common/src/org/jetbrains/uast/declarations/UType.kt index d9fea3298fc..28d4e44cb35 100644 --- a/plugins/uast-common/src/org/jetbrains/uast/declarations/UType.kt +++ b/plugins/uast-common/src/org/jetbrains/uast/declarations/UType.kt @@ -34,4 +34,13 @@ interface UTypeReference : UDeclaration, UResolvable, NoTraverse { override fun resolve(context: UastContext): UClass? override fun resolveOrEmpty(context: UastContext) = resolve(context) ?: UClassNotResolved +} + +object UastErrorType : UType, NoAnnotations { + override val isInt = false + override val parent = null + override val name = "" + override val fqName = null + override val isBoolean = false + override fun resolve(context: UastContext) = null } \ No newline at end of file diff --git a/plugins/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClass.kt b/plugins/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClass.kt index 109c99fb623..3ca2cc02428 100644 --- a/plugins/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClass.kt +++ b/plugins/uast-java/src/org/jetbrains/uast/java/declarations/JavaUClass.kt @@ -16,6 +16,7 @@ package org.jetbrains.uast.java import com.intellij.psi.* +import com.intellij.psi.util.PsiTypesUtil import org.jetbrains.uast.* import org.jetbrains.uast.kinds.UastClassKind 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 get() = emptyList() diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/KotlinUastLanguagePlugin.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/KotlinUastLanguagePlugin.kt index 9560dcd1085..f75e882633f 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/KotlinUastLanguagePlugin.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/KotlinUastLanguagePlugin.kt @@ -169,9 +169,9 @@ internal object KotlinConverter : UastConverter { } 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 type = bindingContext[BindingContext.TYPE, typeReference] ?: return KotlinUErrorType + val type = bindingContext[BindingContext.TYPE, typeReference] ?: return UastErrorType return convert(type, typeReference.project, parent) } diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUClass.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUClass.kt index ea49b6ed5a3..b862cb74dfd 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUClass.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUClass.kt @@ -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 { (psi as? KtClass)?.getCompanionObjects()?.map { KotlinConverter.convert(it, this) } ?: emptyList() } diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUType.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUType.kt index 182d414509c..56b65697f4b 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUType.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUType.kt @@ -46,13 +46,4 @@ class KotlinUType( //TODO override val annotations = emptyList() -} - -object KotlinUErrorType : UType, NoAnnotations { - override val isInt = false - override val parent = null - override val name = "" - override val fqName = null - override val isBoolean = false - override fun resolve(context: UastContext) = null } \ No newline at end of file diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUVariable.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUVariable.kt index 0338f4c876f..b5e5a3a19c7 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUVariable.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinUVariable.kt @@ -37,8 +37,8 @@ open class KotlinUVariable( override val initializer by lz { KotlinConverter.convertOrEmpty(psi.initializer, this) } override val type by lz { - val descriptor = psi.resolveToDescriptorIfAny() as? CallableDescriptor ?: return@lz KotlinUErrorType - val type = descriptor.returnType ?: return@lz KotlinUErrorType + val descriptor = psi.resolveToDescriptorIfAny() as? CallableDescriptor ?: return@lz UastErrorType + val type = descriptor.returnType ?: return@lz UastErrorType KotlinConverter.convert(type, psi.project, this) } @@ -58,11 +58,12 @@ class KotlinDestructuredUVariable( parent: UElement ) : KotlinUVariable(entry, parent) { override lateinit var initializer: UExpression + internal set override val type by lz { val bindingContext = entry.analyze(BodyResolveMode.PARTIAL) - val resolvedCall = bindingContext[BindingContext.COMPONENT_RESOLVED_CALL, entry] ?: return@lz KotlinUErrorType - val returnType = resolvedCall.resultingDescriptor.returnType ?: return@lz KotlinUErrorType + val resolvedCall = bindingContext[BindingContext.COMPONENT_RESOLVED_CALL, entry] ?: return@lz UastErrorType + val returnType = resolvedCall.resultingDescriptor.returnType ?: return@lz UastErrorType KotlinConverter.convert(returnType, entry.project, this) } } @@ -75,7 +76,7 @@ class KotlinDestructuringUVariable( override val initializer by lz { KotlinConverter.convertOrEmpty(psi.initializer, this) } override val kind = UastVariableKind.LOCAL_VARIABLE override val type: UType - get() = initializer.getExpressionType() ?: KotlinUErrorType + get() = initializer.getExpressionType() ?: UastErrorType override val nameElement = null override fun hasModifier(modifier: UastModifier) = false @@ -91,13 +92,13 @@ class KotlinParameterUVariable( 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 type by lz { 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) }