【问题标题】:How to explore a PSITree in intellij API?如何在 intellij API 中探索 PSITree?
【发布时间】:2017-12-01 23:53:01
【问题描述】:

我想构建一个 Intellij 插件,用某些注释来识别 scala 类。

例如:

@RunWith(classOf[SimpleTestRunner])

当我使用 PSIViewer 插件为最后一个代码段构建 PSITree 时,我得到了这棵树

ScalaFile:Dummy.scala(0,36)
  PsiErrorElement:Wrong top statement declaration(0,0)
    <empty list>
  PsiElement(@)('@')(0,1)
  MethodCall(1,35)
    ReferenceExpression: RunWith(1,8)
      PsiElement(identifier)('RunWith')(1,8)
    ArgumentList(8,35)
      PsiElement(()('(')(8,9)
      GenericCall(9,34)
        ReferenceExpression: classOf(9,16)
          PsiElement(identifier)('classOf')(9,16)
        TypeArgumentsList(16,34)
          PsiElement([)('[')(16,17)
          SimpleType: SimpleTestRunner(17,33)
            CodeReferenceElement: SimpleTestRunner(17,33)
              PsiElement(identifier)('SimpleTestRunner')(17,33)
          PsiElement(])(']')(33,34)
      PsiElement())(')')(34,35)

现在,我正在尝试使用导航元素“ReferenceExpression,ArgumentList,GenericCall”访问子级,我知道如何递归访问树,但不知道要查找什么。

那么有人可以告诉我代表这些元素的接口是什么,或者是否有某种实用程序类可以帮助我这样做?

【问题讨论】:

    标签: java scala intellij-idea intellij-plugin


    【解决方案1】:

    我假设你有source code of the Scala plugin?

    接口(或实际上是 Scala 特征)在 org.jetbrains.plugins.scale.lang.psi.api 包中定义。例如,您可以在那里找到./expr/ScGenericCall.scala。树中的每个元素都有一个对应的 Sc.scala 文件,其中定义了它。

    【讨论】:

    • 感谢您的回复,但我正在使用 Java 开发此插件,并且我不想依赖 Scala 具体实现,因为此插件也适用于具有相同注释的 java 类,所以我正在寻找这些类实现的 Java 接口,以便依赖于我的插件适用于 java 和 scala
    • 抱歉,这些特性没有实现 Java 接口(PsiElement 除外)。您的插件必须对 Scala 插件有依赖关系 (can be optional)。我认为可以使用 Java 的特性,或者您可以选择在 Scala 中实现部分插件。
    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多