2017-03-05 22 views
0

Angenommen, ich möchte alle Felder von einigen OFG g erhalten, während Felder wie |java+field:///java/lang/System/err| ignoriert werden. Wie überprüfe ich, ob das resultierende Feld tatsächlich auf eine Klasse aus dem importierten Projekt verweist?Filtern nach Klasseninformationen

Mein Versuch ist das. Hier leuchtet der Compiler bei <- classes. So erlaubt es from.path nicht. Was ich denke, sollte möglich sein.

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 }; 

Wie könnte ich das funktionieren lassen?

Antwort

0

Einfache Antwort: from.path ist kein Muster Syntax, so können Sie eine Variable verwenden, anstatt:

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

oder

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

Eine schöne Lösung für das Problem sein könnte, die Eindämmung Beziehung zu verwenden [email protected], wenn Sie es transitiv schließen [email protected]* und Abfrage von oben, wissen Sie, ob etwas im Projekt ist, wie myField in [email protected]*[ |java+package:///elib|].

Es ist gut, die in einer Variablen herum zu halten, da es eine teure Berechnung ist.

können Sie herausfinden, was das obere Ende der Eindämmung Beziehung wie so ist:

rascal> import analysis::graphs::Graph; // or import Graphs; in older versions 
ok 
rascal> top([email protected]) 
set[loc]: { 
    |java+package:///org|, 
    |java+package:///vinju| 
}