计算 Java 文件中的方法数

Count the number of methods in a Java file

我正在尝试解析 Java 文件并计算其中的方法声明。现在我正在使用以下代码:

import ParseTree;
import lang::java::\syntax::Java15;
import IO;

public int countMethods(loc file) {
    int n = 0;
    try {
        comp = parse(#CompilationUnit, file);
        for (/MethodDec md <- comp) {
            n = n + 1;
        }
    } catch ParseError(loc l): {
        println("Error at line <l.begin.line>, col <l.begin.column>.");
    }
    return n;
}

我被 CompilationUnit 类型不可枚举的错误消息卡住了。现在我想知道如何 get/iterate 通过所有方法?

int x <- l 表示迭代 l 并在其上应用模式匹配 int x,如果成功,将 x 绑定到该值。这意味着对于 <-,右侧必须是可枚举的(列表、集合、映射等)。当您想要使用后代匹配来匹配所有情况时,您通常需要使用 := 匹配运算符。即使右侧是可枚举的。请参见下面的示例:

import IO;
list[list[int]] ll = [[1,2],[1,3,4],[3],[1,1,1,3,4]];
println("Pattern match on the children of ll");
for (/list[value] v <- ll) {
    println(v);
}
println("Pattern match on the children of ll and ll itself");
for (/list[value] v := ll) {
    println(v);
}

这输出:

Pattern match on the children of ll
[1,2]
[1,3,4]
[3]
[1,1,1,3,4]
Pattern match on the children of ll and ll itself
[1,2]
[1,3,4]
[3]
[1,1,1,3,4]
[[1,2],[1,3,4],[3],[1,1,1,3,4]]

区别在于模式匹配器尝试的候选项。

对于您的具体示例,您也可以使用 reducer 编写它:

public int countMethods(loc file) {
    try {
        return (0 | it + 1 | /MethodDec md := parse(#CompilationUnit, file));
    } catch ParseError(loc l): {
        println("Error at line <l.begin.line>, col <l.begin.column>.");
        return 0;   
    }
}

为什么不是这个?

public int countMethods(loc file)
{
    try
    {
        return size([1 | /MethodDec md <- parse(#CompilationUnit, file)]);
    }
    catch ParseError(loc l):
    {
        println("Error at line <l.begin.line>, col <l.begin.column>.");
        return 0;
    }
}