按类别信息

时间:2017-03-05 11:11:50

标签: rascal

假设我想从某些OFG g获取所有字段,而忽略|java+field:///java/lang/System/err|之类的字段。如何检查结果字段是否实际引用了导入项目中的某个类?

我的尝试就是这样。这里编译器在<- classes处亮起。所以它不允许from.path。我认为应该是可能的。

g = buildGraph(createOFG(|project://eLib|));
m = createM3FromEclipseProject(|project://eLib|);
set[str] classes = { cl.path | cl <- classes(m) };
set[loc] fields = { from | <from,_> <- g, 
                       from.scheme == "java+field", from.path <- classes };

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

简单回答:create type list_varchar2 is table of varchar2(100); / create or replace function list_of_column(p_name in varchar2) return list_varchar2 PIPELINED is v_Cnt number := 0; v_table_description dbms_sql.desc_tab; c_curosor integer default dbms_sql.open_cursor; begin dbms_sql.parse( c_curosor, 'select * from '|| p_name||' where 1 = 2', dbms_sql.native ); dbms_sql.describe_columns( c => c_curosor, col_cnt => v_Cnt, desc_t => v_table_description ); for i in 1 .. v_Cnt loop pipe row ( v_table_description(i).col_name ); end loop; dbms_sql.close_cursor(c_curosor); exception when others then dbms_sql.close_cursor( c_curosor ); raise; end ; / select * from table(list_of_column('table_name')) / select * from table(list_of_column('view_name')) / select * from table(list_of_column('synonym')) / 不是模式语法,因此您可以使用变量:

from.path

 set[loc] fields = { from | <from,_> <- g, 
                   from.scheme == "java+field", x <- classes, x == from.path };

问题的一个很好的解决方案可能是使用包含关系 set[loc] fields = { from | <from,_> <- g, from.scheme == "java+field", x := from.path, x <- classes }; ,如果你可以传递地关闭它m@containment并从顶部查询你知道项目中是否有东西,如{{1 }}。

m@containment*保留在变量中是件好事,因为这是一项昂贵的计算。

你可以找出遏制关系的顶部是什么样的:

myField in m@containment*[ |java+package:///elib|]