diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinParameterUTypeReference.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinParameterUTypeReference.kt index 4eb03dbf7ea..823dc45c0a9 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinParameterUTypeReference.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/KotlinParameterUTypeReference.kt @@ -18,12 +18,9 @@ package org.jetbrains.kotlin.uast import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.psi.KtTypeParameter import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.uast.KotlinPsiElementStub -import org.jetbrains.kotlin.uast.orAnonymous import org.jetbrains.uast.* import org.jetbrains.uast.psi.PsiElementBacked @@ -34,7 +31,7 @@ class KotlinParameterUTypeReference( override fun resolve(context: UastContext): UClass? { val descriptor = psi.analyze(BodyResolveMode.PARTIAL)[BindingContext.TYPE_PARAMETER, psi] ?.typeConstructor?.declarationDescriptor as? ClassDescriptor ?: return null - return context.convert(DescriptorToSourceUtilsIde.getAnyDeclaration(psi.project, descriptor)) as? UClass + return context.convert(descriptor.toSource(psi)) as? UClass } override val nameElement: UElement? 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 5c48a3c2fd3..182d414509c 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 @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.uast import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.isBooleanOrNullableBoolean @@ -38,7 +37,7 @@ class KotlinUType( override fun resolve(context: UastContext): UClass? { val descriptor = type.constructor.declarationDescriptor ?: return null - val sourceElement = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) ?: return null + val sourceElement = descriptor.toSource(project) ?: return null return context.convert(sourceElement) as? UClass } diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/kotlinUFunctions.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/kotlinUFunctions.kt index 476eed687ef..d5bf964020b 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/kotlinUFunctions.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/declarations/kotlinUFunctions.kt @@ -19,11 +19,8 @@ package org.jetbrains.kotlin.uast import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny -import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtAnonymousInitializer -import org.jetbrains.kotlin.psi.KtConstructor -import org.jetbrains.kotlin.psi.KtFunction +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.uast.* @@ -43,7 +40,7 @@ abstract class KotlinAbstractUFunction : UFunction, PsiElementBacked { val bindingContext = psi.analyze(BodyResolveMode.PARTIAL) val clazz = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, psi] as? FunctionDescriptor ?: return emptyList() return clazz.overriddenDescriptors.map { - context.convert(DescriptorToSourceUtilsIde.getAnyDeclaration(psi.getProject(), it)) as? UFunction + context.convert(it.toSource(psi)) as? UFunction }.filterNotNull() } diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/expressions/KotlinUFunctionCallExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/expressions/KotlinUFunctionCallExpression.kt index d3f37a1b407..37ca6973a57 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/expressions/KotlinUFunctionCallExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/expressions/KotlinUFunctionCallExpression.kt @@ -20,9 +20,9 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtSimpleNameExpression +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.uast.* import org.jetbrains.uast.psi.PsiElementBacked @@ -64,8 +64,16 @@ class KotlinUFunctionCallExpression( } override fun resolve(context: UastContext): UFunction? { - val resultingDescriptor = resolveCall()?.resultingDescriptor ?: return null - val source = DescriptorToSourceUtilsIde.getAnyDeclaration(psi.project, resultingDescriptor) ?: return null + val resolvedCall = resolveCall() + val descriptor = resolvedCall?.resultingDescriptor ?: return null + val source = descriptor.toSource(psi) ?: return null + + if (descriptor is ConstructorDescriptor && descriptor.isPrimary + && source is KtClassOrObject && source.getPrimaryConstructor() == null + && source.getSecondaryConstructors().isEmpty()) { + return (context.convert(source) as? UClass)?.constructors?.firstOrNull() + } + return context.convert(source) as? UFunction } diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/expressions/KotlinUSimpleReferenceExpression.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/expressions/KotlinUSimpleReferenceExpression.kt index 52687d1f817..1bcdd492fac 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/expressions/KotlinUSimpleReferenceExpression.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/expressions/KotlinUSimpleReferenceExpression.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.uast import com.intellij.psi.PsiElement import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze -import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode @@ -50,7 +49,7 @@ class KotlinClassViaConstructorUSimpleReferenceExpression( val resolvedCall = psi.getResolvedCall(psi.analyze(BodyResolveMode.PARTIAL)) val resultingDescriptor = resolvedCall?.resultingDescriptor as? ConstructorDescriptor ?: return null val clazz = resultingDescriptor.containingDeclaration - val source = DescriptorToSourceUtilsIde.getAnyDeclaration(psi.project, clazz) ?: return null + val source = clazz.toSource(psi) ?: return null return context.convert(source) as? UClass } } diff --git a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/internal/kotlinInternalUastUtils.kt b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/internal/kotlinInternalUastUtils.kt index b1bed24ade5..31dc6782da6 100644 --- a/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/internal/kotlinInternalUastUtils.kt +++ b/plugins/uast-kotlin/src/org/jetbrains/kotlin/uast/internal/kotlinInternalUastUtils.kt @@ -17,6 +17,9 @@ package org.jetbrains.kotlin.uast import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.lexer.KtTokens @@ -41,7 +44,11 @@ internal fun KtDeclaration.getVisibility() = when (visibilityModifierType()) { internal fun KtModifierListOwner.hasModifier(modifier: UastModifier): Boolean { if (modifier == UastModifier.STATIC) { - return this is KtObjectDeclaration || !hasModifier(KtTokens.INNER_KEYWORD) + // Object literals can't be static + if (this is KtObjectDeclaration && this.isObjectLiteral()) { + return false + } + return !hasModifier(KtTokens.INNER_KEYWORD) } if (modifier == UastModifier.FINAL) { @@ -61,7 +68,7 @@ internal fun runReadAction(action: () -> T): T { internal fun KtElement?.resolveCallToUDeclaration(context: UastContext): UDeclaration? { if (this == null) return null val resolvedCall = this.getResolvedCall(analyze(BodyResolveMode.PARTIAL)) ?: return null - val source = DescriptorToSourceUtilsIde.getAnyDeclaration(project, resolvedCall.resultingDescriptor) ?: return null + val source = (resolvedCall.resultingDescriptor).toSource(project) ?: return null return context.convert(source) as? UDeclaration } @@ -69,7 +76,7 @@ internal fun KtElement?.resolveElementToUDeclaration(context: UastContext): UDec if (this == null) return null val bindingContext = analyze(BodyResolveMode.PARTIAL) val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, this] ?: return null - val source = DescriptorToSourceUtilsIde.getAnyDeclaration(project, descriptor) ?: return null + val source = descriptor.toSource(project) ?: return null return context.convert(source) as? UDeclaration } @@ -80,4 +87,13 @@ internal inline fun String?.orAnonymous(kind: String = ""): String { internal fun KtAnnotated.getUastAnnotations(parent: UElement) = annotationEntries.map { KotlinUAnnotation(it, parent) } -internal fun singletonListOrEmpty(element: T?) = if (element != null) listOf(element) else emptyList() \ No newline at end of file +internal fun singletonListOrEmpty(element: T?) = if (element != null) listOf(element) else emptyList() + +@Suppress("NOTHING_TO_INLINE") +internal inline fun DeclarationDescriptor.toSource(element: PsiElement) = toSource(element.project) + +internal fun DeclarationDescriptor.toSource(project: Project) = try { + DescriptorToSourceUtilsIde.getAnyDeclaration(project, this) +} catch (e: Exception) { + null +} \ No newline at end of file