diff --git a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt index 2daa39a2748..b767ff74e77 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/uast/kotlin/internal/kotlinInternalUastUtils.kt @@ -177,6 +177,9 @@ internal fun KotlinType.toPsiType(lightDeclaration: PsiModifierListOwner?, conte } (constructor.declarationDescriptor as? TypeParameterDescriptor)?.let { typeParameter -> + (typeParameter.containingDeclaration.toSource()?.getMaybeLightElement() as? PsiTypeParameterListOwner) + ?.typeParameterList?.typeParameters?.getOrNull(typeParameter.index) + ?.let { return PsiTypesUtil.getClassType(it) } return CommonSupertypes.commonSupertype(typeParameter.upperBounds).toPsiType(lightDeclaration, context, boxed) } @@ -249,15 +252,13 @@ internal fun KtClassOrObject.toPsiType(): PsiType { return PsiTypesUtil.getClassType(lightClass) } -internal fun PsiElement.getMaybeLightElement(context: UElement): PsiElement? { +internal fun PsiElement.getMaybeLightElement(context: UElement? = null /* TODO: remove */): PsiElement? { return when (this) { is KtDeclaration -> { val lightElement = toLightElements().firstOrNull() if (lightElement != null) return lightElement - val languagePlugin = context.getLanguagePlugin() - val uElement = languagePlugin.convertElementWithParent(this, null) - when (uElement) { + when (val uElement = this.toUElement()) { is UDeclaration -> uElement.javaPsi is UDeclarationsExpression -> uElement.declarations.firstOrNull()?.javaPsi is ULambdaExpression -> (uElement.uastParent as? KotlinLocalFunctionUVariable)?.javaPsi diff --git a/plugins/uast-kotlin/testData/TypeReferences.render.txt b/plugins/uast-kotlin/testData/TypeReferences.render.txt index dba88bbdea3..cdd782cf975 100644 --- a/plugins/uast-kotlin/testData/TypeReferences.render.txt +++ b/plugins/uast-kotlin/testData/TypeReferences.render.txt @@ -6,13 +6,13 @@ public final class TypeReferencesKt { return result } public static final fun parameterizedFoo(@org.jetbrains.annotations.Nullable arg: T) : void { - var a: java.lang.Object = arg - var at: java.lang.Object = elvis { - @org.jetbrains.annotations.Nullable var var708e1d08: java.lang.Object = arg + var a: T = arg + var at: T = elvis { + @org.jetbrains.annotations.Nullable var var708e1d08: T = arg if (var708e1d08 != null) var708e1d08 else return } var tl: java.util.List = listOf(at) - var tsl: java.util.List = tl.map({ + var tsl: java.util.List = tl.map({ it.toString() }) var lls: java.util.List> diff --git a/plugins/uast-kotlin/testData/TypeReferences.resolved.txt b/plugins/uast-kotlin/testData/TypeReferences.resolved.txt index 5e935e75450..564ade2c819 100644 --- a/plugins/uast-kotlin/testData/TypeReferences.resolved.txt +++ b/plugins/uast-kotlin/testData/TypeReferences.resolved.txt @@ -5,13 +5,13 @@ UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpres UBinaryExpression (operator = +) -> USimpleNameReferenceExpression (identifier = +) -> null: null UBinaryExpression (operator = +) -> USimpleNameReferenceExpression (identifier = varWithoutType) -> LightVariableBuilder:varWithoutType: varWithoutType UReturnExpression -> USimpleNameReferenceExpression (identifier = result) -> LightVariableBuilder:result: result -UTypeReferenceExpression (name = java.lang.Object) -> USimpleNameReferenceExpression (identifier = T) -> PsiClass:Object: Object +UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> KotlinLightTypeParameter:T: T ULocalVariable (name = a) -> USimpleNameReferenceExpression (identifier = arg) -> Light Parameter: arg - UTypeReferenceExpression (name = java.lang.Object) -> USimpleNameReferenceExpression (identifier = T) -> PsiClass:Object: Object + UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> KotlinLightTypeParameter:T: T ULocalVariable (name = var708e1d08) -> USimpleNameReferenceExpression (identifier = arg) -> Light Parameter: arg UExpressionList (elvis) -> USimpleNameReferenceExpression (identifier = ?:) -> null: null UTypeReferenceExpression (name = java.util.List) -> USimpleNameReferenceExpression (identifier = List) -> PsiClass:List: List - UTypeReferenceExpression (name = java.lang.Object) -> USimpleNameReferenceExpression (identifier = T) -> PsiClass:Object: Object + UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> KotlinLightTypeParameter:T: T UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) -> USimpleNameReferenceExpression (identifier = listOf) -> null: null UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) -> USimpleNameReferenceExpression (identifier = at) -> LightVariableBuilder:at: at UTypeReferenceExpression (name = java.util.List) -> USimpleNameReferenceExpression (identifier = List) -> PsiClass:List: List @@ -27,7 +27,7 @@ UTypeReferenceExpression (name = java.lang.Object) -> USimpleNameReferenceExpres UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String UTypeReferenceExpression (name = java.util.List>) -> USimpleNameReferenceExpression (identifier = List) -> PsiClass:List: List UTypeReferenceExpression (name = java.util.List) -> USimpleNameReferenceExpression (identifier = List) -> PsiClass:List: List - UTypeReferenceExpression (name = java.lang.Object) -> USimpleNameReferenceExpression (identifier = T) -> PsiClass:Object: Object + UTypeReferenceExpression (name = T) -> USimpleNameReferenceExpression (identifier = T) -> KotlinLightTypeParameter:T: T UCallExpression (kind = UastCallKind(name='method_call'), argCount = 1)) -> USimpleNameReferenceExpression (identifier = parameterizedFoo) -> KtLightMethodImpl:parameterizedFoo: parameterizedFoo UTypeReferenceExpression (name = java.util.List) -> USimpleNameReferenceExpression (identifier = List) -> PsiClass:List: List UTypeReferenceExpression (name = java.lang.String) -> USimpleNameReferenceExpression (identifier = String) -> PsiClass:String: String