2017-03-08 80 views
2

我的程序对象从Java2OFG不包含任何的HashMap put电话,但可以找到的HashMap removecontainsValue电话。Java2OFG找不到HashMap的认沽认购

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代码。

+0

看起来很奇怪。请与同事核对他们是否有同样的问题? – jurgenv

+0

提示:'iprintln(p)'或'import util :: ValueUI;'然后'文本(p)'为调试目的提供了更好的流程程序概览。 – jurgenv

+0

也许你使用不同版本的Rascal?建议最新的马厩为此目的。 – jurgenv

回答

1

事实上,有些方法是有的,但其他人都没有:

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模型使用特殊的抽象符号变量流入集合,即将映射的put方法建模为变量赋值,并将get作为变量查找。

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

算法错过了从地图的关键点到接收器的边缘,并且还跳过了原始类型的流程。新版本发布在这里:https://gist.github.com/jurgenvinju/60645058b6d0b0ccce0fc6f856da6ea6

+0

我们也可以找到'containsValue'调用,但不是'put'调用。 – Kasper

+0

确认!对不起,我读得太糟糕了。现在看看这个。 – jurgenv

+1

我改编了答案;所以现在我们知道发生了什么。使用force,阅读源代码:-) – jurgenv