与局部变量不同,使用Rascal的流程序中不存在对集合类型字段的新赋值

时间:2018-03-13 11:36:00

标签: rascal

考虑以下Java代码:

import java.util.LinkedList;
import java.util.List;

class Library {
    List<String> loans = new LinkedList<>();

    public List<String> searchUser(String name) {
        List<String> usersFound = new LinkedList<>();
        return loans;
    }
}

以及以下Rascal模块:

module Mwe

import lang::java::flow::JavaToObjectFlow;
import lang::java::jdt::m3::AST;
import IO;

void m() {
    ast = createAstFromEclipseFile(|project://test/src/test.java|, true);
    fp = createOFG({ast});
    print(fp);
}

生成的流程序将是:

flowProgram({
    attribute(|java+field:///Library/loans|),
    method(|java+method:///Library/searchUser(java.lang.String)|,[|java+parameter:///Library/searchUser(java.lang.String)/scope(name)/scope(0)/name|]),
    constructor(|java+constructor:///Library/Library()|,[])
},{
    assign(|java+method:///Library/searchUser(java.lang.String)/return|,|id:///|,|java+field:///Library/loans|),
    newAssign(|java+variable:///Library/searchUser(java.lang.String)/usersFound|,|java+class:///java/util/LinkedList|,|java+constructor:///java/util/LinkedList/LinkedList()|,[])
})

因此,new LinkedList分配给usersFound,但loans没有任何可比性。为什么会这样?这是预期的行为吗?

1 个答案:

答案 0 :(得分:1)

刚检查了实现,字段初始化程序未包含在getStatements函数中(请参阅第169行的lang::java::flow::JavaToObjectFlow)。类似地,忽略类的静态初始值设定项。

最好的方法是将其报告为错误,或修复它并将其转换为拉取请求。 (拉取请求是将其修复为不稳定的最快方法)

作为一种可能但工作密集的解决方法,您重写AST以将字段初始值设定项放在所有现有构造函数中(或者如果没有则添加构造函数)。