flutter-intellij icon indicating copy to clipboard operation
flutter-intellij copied to clipboard

How to detect that Dart PsiElement is a widget?

Open mdddj opened this issue 1 year ago • 0 comments

I am creating a Wrap with shortcut, but I don't want it to work on non Widgets. How can I determine? image image

this is my idea plugin code


import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Iconable
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import com.jetbrains.lang.dart.psi.impl.DartCallExpressionImpl
import com.jetbrains.lang.dart.psi.impl.DartReturnStatementImpl
import com.jetbrains.lang.dart.util.DartElementGenerator
import shop.itbug.fluttercheckversionx.icons.MyIcons
import javax.swing.Icon

abstract class WrapWithInternalBase : PsiElementBaseIntentionAction(), Iconable {

    abstract fun title(): String

    abstract fun getReplaceText(element: PsiElement): String


    override fun getIcon(flags: Int): Icon {
        return MyIcons.flutter
    }

    override fun getFamilyName(): String {
        return title()
    }

    override fun getText(): String {
        return familyName
    }

    override fun isAvailable(project: Project, editor: Editor?, element: PsiElement): Boolean {
        if (editor == null) return false
        val returnEle = DartPsiTreeUtil.findReturn(element)
        return returnEle != null && returnEle.expression != null && createElement(returnEle.expression!!) != null
    }

    override fun invoke(project: Project, editor: Editor?, element: PsiElement) {
        val returnEle: DartReturnStatementImpl = DartPsiTreeUtil.findReturn(element) ?: return
        val create = createElement(returnEle.expression!!)
        create?.let { returnEle.expression?.replace(it) }
    }


    private fun createElement(element: PsiElement): DartCallExpressionImpl? {
        val text = """
final widget = ${getReplaceText(element)}
        """.trimIndent()
        val file = DartElementGenerator.createDummyFile(element.project, text)
        return PsiTreeUtil.findChildOfType(file, DartCallExpressionImpl::class.java)
    }
}

mdddj avatar Aug 20 '24 06:08 mdddj