在Xtext中,如何在语法B的验证程序(位于ui插件中)中遵循从语法B到语法A的引用?考虑以下示例。
语法A为 setTimeout( function(){
jQuery('.wp-video video').get(0).play();
} , 1000 );
jQuery(document).on('mouseover', '.wp-video', function(){
jQuery(this).find('video').get(0).play()
});
jQuery(document).on('mouseout', '.wp-video', function(){
jQuery(this).find('video').get(0).pause()
});
org.xtext.people.People
和一个实例
grammar org.xtext.people.People with org.eclipse.xtext.common.Terminals
generate people "http://www.xtext.org/people/People"
People:
people+=Person*;
Person:
'person' name=ID ';';
在机场,记录人员的条目。
person Alice {citizenship "MN"; id "12345"; }
person Bob {citizenship "CH"; id "54321";}
person Malice {citizenship "XXX"; id "66666"; }
使用第二个语法B enter Alice;
enter Bob;
enter Malice;
org.xtext.entries.Entries
确保Eclipse项目grammar org.xtext.entries.Entries with org.eclipse.xtext.common.Terminals
generate entries "http://www.xtext.org/entries/Entries"
import "http://www.xtext.org/people/People"
Entries:
entries+=Entry*;
Entry:
'enter' person=[Person] ';';
的类路径上具有项目org.xtext.entries
,并确保org.xtext.people
插件具有org.xtext.entries
作为依赖项之后,所有工作预期的。
虽然有一些值得奖赏的人被排除在外,但XXX国家/地区的人却被禁止旅行。只有中央情报局知道谁被禁止。除非排除,否则XXX的人员都不得进入。
更新后的语法是
org.xtext.people
带有验证器
grammar org.xtext.entries.Entries with org.eclipse.xtext.common.Terminals
generate entries "http://www.xtext.org/entries/Entries"
import "http://www.xtext.org/people/People"
Entries:
entries+=Entry*;
Entry:
travelBanOverride=TravelBanOverride?
'enter' person=[Person] ';';
TravelBanOverride: '@TravelBanOverride' '(' code=STRING ')';
例如,外部CIA网络应用程序的驱动程序是通过以下方式建模的:
package org.xtext.entries.validation
import org.eclipse.xtext.validation.Check
import org.xtext.entries.entries.EntriesPackage
import org.xtext.entries.entries.Entry
import org.xtext.entries.CIA
class EntriesValidator extends AbstractEntriesValidator {
public static val BAN = 'BAN'
public static val ILLEGAL_OVERRIDE = 'ILLEGAL_OVERRIDE'
@Check
def checkBan(Entry entry) {
if (entry.person.citizenship == "XXX") {
if (entry.travelBanOverride === null) {
error('Violation of Travel Ban', EntriesPackage.Literals.ENTRY__PERSON, BAN)
}
else {
val overridecode = entry.travelBanOverride.code;
val valid = CIA.valid(entry.person.name, entry.person.id, overridecode)
if (!valid) {
error('Illegal override code', EntriesPackage.Literals.ENTRY__TRAVEL_BAN_OVERRIDE, ILLEGAL_OVERRIDE)
}
}
}
}
}
验证按预期进行。
我现在希望为package org.xtext.entries;
public class CIA {
public static boolean valid(String name, String id, String overrideCode) {
System.out.println("UNValid["+name+","+overrideCode+"]");
return name.equals("Malice") && id.equals("66666") && overrideCode.equals("123");
}
}
提供一个快速修复程序,该程序可检查CIA的替代代码。
BAN
第一条注释行无法编译:没有属性package org.xtext.entries.ui.quickfix
import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider
import org.eclipse.xtext.ui.editor.quickfix.Fix
import org.xtext.entries.validation.EntriesValidator
import org.eclipse.xtext.validation.Issue
import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor
import org.xtext.entries.entries.Entry
import org.xtext.entries.Helper
class EntriesQuickfixProvider extends DefaultQuickfixProvider {
@Fix(EntriesValidator.BAN)
def tryOverride(Issue issue, IssueResolutionAcceptor acceptor) {
acceptor.accept(issue, 'Try override', 'Override if CIA says so.', 'override.png')
[element ,context |
val entry = element as Entry
// val person = entry.person // no such attribute
//val person = Helper.get(entry); // The method get(Entry) from the type Helper refers to the missing type Object
]
}
}
。第二行注释是尝试通过在person
中获取一个帮助器类来获取该人来解决该问题,但这也不编译,给出了一个“来自帮助器类型的get(Entry)方法是指缺少的“对象”类型。错误消息。
为了完整起见,这里是那个帮手。
org.xtext.entries
此外,package org.xtext.entries
import org.xtext.people.people.Person
import org.xtext.entries.entries.Entry
class Helper {
static def Person get(Entry entry) {
return entry.person;
}
}
可以很好地编译,但是entry.travelBanOverride
可以。在Eclipse中单击Entry即可进入预期的代码,该代码同时包含entry.person
和travelBanOverride
。
同一项目和程序包中的Java类不会发生此问题。
person
用Java重写quickfix解决了这个问题。
package org.xtext.entries.ui.quickfix;
import org.xtext.entries.entries.Entry;
import org.xtext.people.people.Person;
public class Test {
public static void main(String[] args) {
Entry entry = null;
Person p = entry.getPerson();
}
}
答案 0 :(得分:0)
我的错误如下。
确保Eclipse项目org.xtext.entries具有 项目org.xtext.people放在其类路径上,并确保 org.xtext.entries插件具有org.xtext.people作为依赖项,所有 按预期工作。
org.xtext.entries.ui
ui插件还必须 在其Java(Eclipse项目)构建路径上具有org.xtext.people
。导出并使其完全依赖于插件是不够的。
请注意,由于Xtend编辑器存在刷新问题,因此应在制作快速修复之前及早进行此设置。