Java2OFG 找不到 hashmap put 调用

Java2OFG cannot find hashmap put call

我的 Java2OFG 程序对象 包含任何 hashmap put 调用,但 可以 找到 hashmap removecontainsValue 个调用。

p = createOFG(|project://eLib|);
println(p);

显示:

call(|id:///|,|id:///|,|java+field:///Library/users|,|java+method:///java/util/Map/containsValue(java.lang.Object)|,[|java+parameter:///Library/addUser(User)/scope(user)/scope(0)/user|])

call(|id:///|,|id:///|,|java+field:///Library/users|,|java+method:///java/util/Map/remove(java.lang.Object)|,[|java+method:///Library/removeUser(int)/__param555_0|])

但没有提及任何 put 调用,而 存在于 java 代码中。

的确,有些方法有,有些没有:

rascal>p = createOFG(|project://eLib|);
... 
rascal>cv = |java+method:///java/util/Map/containsValue(java.lang.Object)|;
loc: |java+method:///java/util/Map/containsValue(java.lang.Object)|
rascal>/c:call(_,_,_,cv,_) := p ? c : "bla"
Stm: call(
  |id:///|,
  |id:///|,
  |java+field:///Library/users|,
  |java+method:///java/util/Map/containsValue(java.lang.Object)|,
  [|java+parameter:///Library/addUser(User)/scope(user)/scope(0)/user|])

rascal>cv = |java+method:///java/util/Map/put(java.lang.Object,java.lang.Object)|;
loc: |java+method:///java/util/Map/put(java.lang.Object,java.lang.Object)|
rascal>/c:call(_,_,_,cv,_) := p ? c : "bla"
value: "bla"

因此,这些查询表明流程序确实包含对 containsValue 的调用,但不包含 put

在阅读 lang::ofg::ast::Java2OFG 的代码时,容器 类 中的一些方法似乎有些特别。这些方法调用被转换为赋值,而不是在流语言中以 call 结尾的调用!这意味着 Java2OFG 模型使用特殊的抽象符号变量流入集合,即 map 的 put 方法被建模为变量赋值,而 get 被建模为变量查找。

这是一个正确的模型,并且有用,否则数据会流入容器 API,对此我们没有内部模型,并且永远不会再出来。

尽管该算法错过了从映射键到接收者的边,并且还跳过了原始类型的流。此处发布了新版本:https://gist.github.com/jurgenvinju/60645058b6d0b0ccce0fc6f856da6ea6