Java2OFG 找不到 hashmap put 调用
Java2OFG cannot find hashmap put call
我的 Java2OFG 程序对象 不 包含任何 hashmap put
调用,但 可以 找到 hashmap remove
和 containsValue
个调用。
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
我的 Java2OFG 程序对象 不 包含任何 hashmap put
调用,但 可以 找到 hashmap remove
和 containsValue
个调用。
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