从 class 获取修饰符
Get modifiers from class
我正在尝试从 Rascal 中的 class 获取所有修饰符。
m = createM3FromEclipseProject(projectLocation);
for(cl <- classes(m)){
set[Modifier] modi = { f | f <- m@modifiers[cl], f.scheme == "java+class"};
println(modi);
}
这为所有 classes 提供了一组空的修饰符,但如果我检查 m@modifiers,它不是空的。
所以 m@modifiers[cl] 不会给我属于 class 位置 cl 的修饰符。我如何获得这些修饰符?
您提供的代码有问题。如果您尝试在 REPL 上逐步执行此操作,您会明白为什么:
对于将 Fruit 等提取到 M3 模型中的示例项目 m
我有这个:
rascal>classes(m)
set[loc]: {
|java+class:///Fruit|,
|java+class:///Apple|,
|java+class:///HelloWorld|
}
rascal>m@modifiers
rel[loc definition,Modifier modifier]: {
<|java+interface:///IFruit|,public()>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,static()>,
<|java+class:///Fruit|,abstract()>,
<|java+method:///Apple/edible()|,public()>,
<|java+method:///Fruit/edible()|,public()>,
<|java+class:///Apple|,public()>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,public()>,
<|java+class:///HelloWorld|,public()>,
<|java+method:///Fruit/edible()|,abstract()>,
<|java+class:///Fruit|,public()>
}
所以m@modifiers[someClass]
returns一组修饰符:
rascal>m@modifiers[|java+class:///Fruit|]
set[Modifier]: {
abstract(),
public()
}
在您的代码 f <- m@modifiers[cl]
中,f
因此绑定到修饰符而不是源位置。不知何故,代码不会抛出异常,而是让条件为您失败?因为我得到的是这个结果:
rascal>{ f | cl <- classes(m), f <- m@modifiers[cl], f.scheme == "java+class"};
|prompt:///|(46,1,<1,46>,<1,47>): Undeclared field: scheme for Modifier
Advice: |http://tutor.rascal-mpl.org/Errors/Static/UndeclaredField/UndeclaredField.html|
如果你想打印每个 class 的修饰符,那么这段代码应该这样做:
for (cl <- classes(m)) {
println("modifiers for <cl> are <m@modifiers[cl]>");
}
我正在尝试从 Rascal 中的 class 获取所有修饰符。
m = createM3FromEclipseProject(projectLocation);
for(cl <- classes(m)){
set[Modifier] modi = { f | f <- m@modifiers[cl], f.scheme == "java+class"};
println(modi);
}
这为所有 classes 提供了一组空的修饰符,但如果我检查 m@modifiers,它不是空的。
所以 m@modifiers[cl] 不会给我属于 class 位置 cl 的修饰符。我如何获得这些修饰符?
您提供的代码有问题。如果您尝试在 REPL 上逐步执行此操作,您会明白为什么:
对于将 Fruit 等提取到 M3 模型中的示例项目 m
我有这个:
rascal>classes(m)
set[loc]: {
|java+class:///Fruit|,
|java+class:///Apple|,
|java+class:///HelloWorld|
}
rascal>m@modifiers
rel[loc definition,Modifier modifier]: {
<|java+interface:///IFruit|,public()>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,static()>,
<|java+class:///Fruit|,abstract()>,
<|java+method:///Apple/edible()|,public()>,
<|java+method:///Fruit/edible()|,public()>,
<|java+class:///Apple|,public()>,
<|java+method:///HelloWorld/main(java.lang.String%5B%5D)|,public()>,
<|java+class:///HelloWorld|,public()>,
<|java+method:///Fruit/edible()|,abstract()>,
<|java+class:///Fruit|,public()>
}
所以m@modifiers[someClass]
returns一组修饰符:
rascal>m@modifiers[|java+class:///Fruit|]
set[Modifier]: {
abstract(),
public()
}
在您的代码 f <- m@modifiers[cl]
中,f
因此绑定到修饰符而不是源位置。不知何故,代码不会抛出异常,而是让条件为您失败?因为我得到的是这个结果:
rascal>{ f | cl <- classes(m), f <- m@modifiers[cl], f.scheme == "java+class"};
|prompt:///|(46,1,<1,46>,<1,47>): Undeclared field: scheme for Modifier
Advice: |http://tutor.rascal-mpl.org/Errors/Static/UndeclaredField/UndeclaredField.html|
如果你想打印每个 class 的修饰符,那么这段代码应该这样做:
for (cl <- classes(m)) {
println("modifiers for <cl> are <m@modifiers[cl]>");
}