是否可以静态区分完全限定名称和嵌套 class 类型?

Is it possible to statically distinguish between fully qualified names and nested class types?

我正在使用 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;
    }
}

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

// 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> 并放置一个导入语句而不是写 java.util.List<Long>,但是,我需要处理 FQN 写在参数中的情况。

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

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

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

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

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

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


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