从语法B的验证者引用语法A的Xtext问题

时间:2018-09-03 17:50:53

标签: xtext

在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.persontravelBanOverride

同一项目和程序包中的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();
    }
}
  • 如何在语法B的验证程序中遵循从语法B(条目)到语法A(人)的引用?

1 个答案:

答案 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编辑器存在刷新问题,因此应在制作快速修复之前及早进行此设置。