3

我正在使用 JavaParser(开源)来解析以下代码。

package testfiles.simple.tricky.before;

import testfiles.simple.before.InnerClassSample;

public class InnerClassReference {
    public void ref(InnerClassSample.MyInnerClass myInnerClass, java.util.List<Long> list) {
        int i = 0;
    }
}

在名为的 methodDeclaration 节点下ref,我得到参数节点层次结构如下:

// myInnerClass
Parameter
  ClassOrInterfaceType:
    ClassOrInterfaceType:
      SimpleName: InnerClassSample
    SimpleName: MyInnerClass
  SimpleName: myInnerClass
// list
Parameter
  ClassOrInterfaceType:
    ClassOrInterfaceType:
      ClassOrInterfaceType:
        SimpleName: java
      SimpleName: util
    SimpleName: List
  SimpleName: list

我需要找到每个参数的完全限定名称。所以myInnerClass我会得到testfiles.simple.before.InnerClassSample$MyInnerClass,因为list它会java.util.List

我知道通常人们会编写List<Long>并放置一个 import 语句而不是write java.util.List<Long>,但是,我需要处理将 FQN 写入参数的情况。

现在我的问题是,有没有一种方法可以静态区分这种解析树是嵌套类的类型,还是仅仅是类的完全限定名?

我曾考虑通过检查 SimpleName 是否以小写字母开头(这意味着它是一个包名称)来进行区分,但这只是一个约定,因此我们不能安全地假设开发人员总是以小写字母开头的包名称字母,或以大写字母开头的类名,因此我认为这不是一个好方法。

任何关于此事的想法或见解将不胜感激。

4

1 回答 1

2

遗憾的是,仅通过限定名称或仅分析单个源文件无法区分顶级类的名称和嵌套类的名称。至少不是在所有情况下。

要进行区分,您必须执行解析步骤,以找出名称引用的内容。这必然涉及多个源文件。

解决步骤可能涉及查看 AST 或引用元素的类文件中的信息。


注意:即使解决步骤涉及多个源文件,该信息仍然是静态信息。

于 2022-01-10T08:24:02.210 回答