From 6942570183354afabbb109ec874ead116606d27f Mon Sep 17 00:00:00 2001 From: Frank Wang Date: Thu, 25 Mar 2021 17:04:51 +0800 Subject: [PATCH] Use UAST instead of Kotlin plugin APIs Fixes #69 --- build.gradle | 2 +- gradle.properties | 2 +- .../codeinsight/references/BaseReference.java | 20 +++++------ .../mapstruct/intellij/util/MapstructUtil.kt | 34 ------------------- 4 files changed, 12 insertions(+), 46 deletions(-) delete mode 100644 src/main/java/org/mapstruct/intellij/util/MapstructUtil.kt diff --git a/build.gradle b/build.gradle index 999c271f..9c4163bd 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id "org.jetbrains.intellij" version "0.4.21" id "com.github.hierynomus.license" version "0.14.0" id "de.undercouch.download" version "4.0.4" - id 'org.jetbrains.kotlin.jvm' version '1.3.71' + id 'org.jetbrains.kotlin.jvm' version '1.4.31' } diff --git a/gradle.properties b/gradle.properties index d267fadb..62b22ef6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ # https://www.jetbrains.com/intellij-repository/releases # https://www.jetbrains.com/intellij-repository/snapshots -ideaVersion = 2019.1 +ideaVersion = 2020.3.3 ideaType = IC sources = true isEAP = false diff --git a/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java b/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java index 7c5eceb4..09341a14 100644 --- a/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java +++ b/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java @@ -7,13 +7,14 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiLiteral; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiReferenceBase; -import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.mapstruct.intellij.util.MapstructUtilKt; +import org.jetbrains.uast.ULiteralExpression; +import org.jetbrains.uast.UMethod; +import org.jetbrains.uast.UastContextKt; +import org.jetbrains.uast.UastUtils; /** * Base Reference for MapStruct. @@ -43,14 +44,13 @@ abstract class BaseReference extends PsiReferenceBase { @Nullable PsiMethod getMappingMethod() { PsiElement element = getElement(); - if ( element instanceof PsiLiteral ) { - return PsiTreeUtil.getParentOfType( element, PsiMethod.class ); + ULiteralExpression expression = UastContextKt.toUElement( element, ULiteralExpression.class ); + if ( expression != null ) { + UMethod parent = UastUtils.getParentOfType( expression, UMethod.class ); + if ( parent != null ) { + return parent.getJavaPsi(); + } } - else if ( "KtStringTemplateExpression".equals( element.getClass().getSimpleName() ) ) { - // We cannot do an instanceOf check here because the kotlin class is optional - return MapstructUtilKt.getPsiMethod( element ); - } - return null; } } diff --git a/src/main/java/org/mapstruct/intellij/util/MapstructUtil.kt b/src/main/java/org/mapstruct/intellij/util/MapstructUtil.kt deleted file mode 100644 index 78b98301..00000000 --- a/src/main/java/org/mapstruct/intellij/util/MapstructUtil.kt +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright MapStruct Authors. - * - * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 - */ -package org.mapstruct.intellij.util - -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod -import org.jetbrains.kotlin.asJava.classes.createGeneratedMethodFromDescriptor -import org.jetbrains.kotlin.idea.caches.resolve.IDELightClassGenerationSupport -import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny -import org.jetbrains.kotlin.psi.KtClass -import org.jetbrains.kotlin.psi.KtNamedFunction -import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode - - -/** - * @author Frank Wang - */ -fun PsiElement.getPsiMethod(): PsiMethod? { - return this.getNonStrictParentOfType() ?: this.getNonStrictParentOfType()?.toPsiMethod() -} - -private fun KtNamedFunction.toPsiMethod(): PsiMethod? { - // dealing with kotlin class - val ktClass = this.getNonStrictParentOfType(KtClass::class.java) ?: return null - val descriptor = - this.resolveToDescriptorIfAny(BodyResolveMode.PARTIAL_FOR_COMPLETION) ?: return null - return IDELightClassGenerationSupport(this.project) - .createUltraLightClass(ktClass) - ?.createGeneratedMethodFromDescriptor(descriptor, null) -}