使Intellij Idea插件与Kotlin文件一起使用

时间:2017-11-22 16:41:19

标签: intellij-idea kotlin intellij-plugin

我已经创建了这个非常简单的 Intellij Idea插件,它会折叠一些引用表达式。它适用于Java文件,但它对Kotlin不起作用。

以下是来源:https://github.com/nodes-android/nstack-translation-folding
我将在这里列出重要的部分:
plugin.xml中

</idea-plugin>
    <depends>com.intellij.modules.all</depends>

    <application-components>
        <component>
            <implementation-class>com.nodes.folding.TranslationFoldingBuilder</implementation-class>
        </component>
    </application-components>

    <extensions defaultExtensionNs="com.intellij">
        <lang.foldingBuilder language="JAVA" implementationClass="com.nodes.folding.TranslationFoldingBuilder"/>
    </extensions>

</idea-plugin>

TranslationFoldingBuilder.kt

class TranslationFoldingBuilder : FoldingBuilderEx() {

    override fun buildFoldRegions(root: PsiElement, document: Document, quick: Boolean): Array<FoldingDescriptor> {
        if (root !is PsiJavaFile) {
            return FoldingDescriptor.EMPTY
        }

        val descriptors = ArrayList<FoldingDescriptor>()
        // Get all the reference expressions in this Java file
        val referenceExpressions = PsiTreeUtil.findChildrenOfType(root, PsiReferenceExpression::class.java)

        // Some logic

        return descriptors.toTypedArray()
    }
}

我的问题是,对于Kotlin文件,根本不会调用 buildFoldRegions()

2 个答案:

答案 0 :(得分:0)

当然,对于kotlin来说,它不适用于你的

  

if(root!是PsiJavaFile){               返回FoldingDescriptor.EMPTY           }

对于kotlin文件,该文件为org.jetbrains.kotlin.psi.KtFile实例,而不是PsiJavaFile

更新

  1. 您需要在 plugin.xml
  2. 中添加kotlin插件作为插件的依赖项
  3. Kotlin的psi api与Java不同(它们是不同的语言)。你需要写一个不同的类(但有些可以是相同的,我只是复制你的原始代码并进行编辑,所以在我的kt实现中有一些重复。
  4. 您可以在此处查看我的提交https://github.com/aristotll/nstack-translation-folding/commit/45286e6ec10d3b50defe25d55f8fbd8f122a148b

答案 1 :(得分:0)

就我而言,将kotlin-compiler库添加到项目中解决了缺少类KtFile和其他与 Kotlin Psi 相关的问题。