Xtext: использование EClass в XExpression

Я пишу на грамматике Xtext, которая использует XExpressions, а также работает с Eclasses. Теперь я также хочу иметь доступ к Eclasses из XExpression, например, я пишу такое выражение:

Eclass1.attribute1 = Eclass2.attribute1

Я хотел бы знать, как я могу использовать Eclass из XExpression?

Грамматика

grammar org.xtext.example.mydsl.Mydsl with 
org.eclipse.xtext.xbase.Xbase

import "http://www.eclipse.org/emf/2002/Ecore" as ecore

generate mydsl "http://www.xtext.org/example/mydsl/Mydsl"

Model:
(operations += Operation)*;

terminal ATTR : ID ('.' ID)+;

Operation:
'operation' left=[ecore::EClass|ATTR] 'and' right=
 [ecore::EClass|ATTR] 'defined' 'as' condition=XExpression
;

Вывод/метод вывода

def dispatch void infer(Model element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
      acceptor.accept(element.toClass("example.mydsl")) [
        for (operation : element.operations) {
            left = operation.left
            right = operation.right
            if (left.eIsProxy()) {
                left = EcoreUtil.resolve(left, operation) as EClass
            }   
            if (right.eIsProxy()) {
                right = EcoreUtil.resolve(right, operation) as EClass
            }
            //field for right class left out, but works the same
            members += left.toField(left.name,typeRef(left.EPackage.name+"."+left.name))    
            members += operation.toMethod("conditionExpr", 
            typeRef(Void.TYPE)) [
                body = operation.condition
            ]       
        }
    ]

}

Модуль среды выполнения

    class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

       def Class<? extends ImplicitlyImportedFeatures> bindImplicitlyImportedTypes() {
       return MyImportFeature
}

}

Моя функция импорта

class MyImportFeature extends ImplicitlyImportedFeatures{
override protected getStaticImportClasses() {
    (super.getStaticImportClasses() + #[PackageFromWorkSpace]).toList
}

}

person Community    schedule 20.08.2017    source источник


Ответы (1)


Я не уверен, получу ли я ваш вопрос. Обычно EMF генерирует константы для EAttributes, поэтому, если вы хотите получить доступ к самим атрибутам, вы можете сделать либо MyDslPackage.Literals.GREETING__NAME, либо MyDslPackage.eINSTANCE.getGreeting_Name()

можете ли вы дать еще несколько советов о том, что вы на самом деле хотите сделать

обновление: вот фрагмент того, как получить класс java из ссылки на eclass

Thingy:{
    val EClass eclazz = f.clazz
    val uri = EcorePlugin.getEPackageNsURIToGenModelLocationMap(true).get(eclazz.EPackage.nsURI)
    val rs = new ResourceSetImpl
    val r = rs.getResource(uri, true)
    r.load(null)
    val p = r.contents.head
    if (p instanceof GenModel) {
        val genClass = p.findGenClassifier(eclazz)
        if (genClass instanceof GenClass) {
            println(genClass.qualifiedInterfaceName)
            members+=f.toField(eclazz.name, genClass.qualifiedInterfaceName.typeRef)
        }
    }
}
person Christian Dietrich    schedule 23.08.2017
comment
Это то, что имеет ссылку на eclass - person Christian Dietrich; 01.09.2017
comment
У меня есть только operation.left и operation.right, а clazz у них нет, хотя они типа EClass - person ; 01.09.2017
comment
Arrrg, конечно, у вас есть левое и правое, я не знаю, так как я назвал это clazz, я думал, что это очевидно - person Christian Dietrich; 01.09.2017
comment
Я сделал пример до того, как узнал твою грамматику - person Christian Dietrich; 01.09.2017
comment
uri имеет значение null, похоже, он не может найти eclazz.EPackage.nsURI на карте - person ; 01.09.2017
comment
Откуда у тебя твои уроки? у вас есть экокор, генмодель и сгенерированный код? - person Christian Dietrich; 01.09.2017
comment
как вы делаете scping для eclasses? - person Christian Dietrich; 01.09.2017
comment
Вы рассматривали возможность простой ссылки на класс java вместо eclass, как предлагалось ранее? - person Christian Dietrich; 01.09.2017
comment
У меня есть экокор, генмодель и сгенерированный код. Я ничего не делал с обзором. Я не рассматривал ссылки на классы Java. Не могли бы вы привести пример того, как это сделать? - person ; 01.09.2017
comment
Посмотрите пример модели предметной области. Если у вас нет экокора и генмодели, откуда берутся ваши электронные классы? - person Christian Dietrich; 01.09.2017
comment
Что вы подразумеваете под примером модели домена, можете ли вы предоставить ссылку на это? - person ; 01.09.2017
comment
У меня есть экокор и генмодель - person ; 02.09.2017
comment
Извините, я не знаю, как воспроизвести вашу ситуацию. - person Christian Dietrich; 02.09.2017
comment
что вы имели в виду, ссылаясь на классы java вместо eclasses? - person ; 02.09.2017
comment
Xxxx=JvmParametrizedTypeReference (см. superttype в примере модели предметной области) - person Christian Dietrich; 02.09.2017
comment
sry, где я могу найти этот пример, не могли бы вы дать ссылку? - person ; 02.09.2017
comment
Меню «Файл», новое, пример примера модели предметной области xtext - person Christian Dietrich; 02.09.2017
comment
Я забыл упомянуть, что в моем Eclipse во время выполнения я импортировал проект с тестовым файлом для моей грамматики и тестовой моделью ecore (пример imdb). Когда я открываю тестовый файл, я могу написать выражение типа operation imdb.Film and imdb.Actor defined as ..., а точки помечают его ошибками. Дело в том, что редактор распознает EClasses Actor и Film . Как добиться того, чтобы Актер и Фильм можно было использовать в XExpression? Я думаю, что мне нужно установить поле в инферере для Актер и Фильм, но я не уверен - person ; 02.09.2017
comment
кроме того, я создал репозиторий git github.com/mrftothek/firstDSL с исходным кодом - person ; 02.09.2017
comment
argg, у вас нет генмодели и классов Java. - person Christian Dietrich; 02.09.2017
comment
Итак, мне нужна генмодель imdb? и как мне получить классы Java? и что они вообще из себя представляют? это похоже на сгенерированные классы java, например, из грамматики xtext? - person ; 02.09.2017
comment
и да, это классы Java, представляющие модель ecore - person Christian Dietrich; 02.09.2017
comment
и вы получаете классы Java, открыв, щелкнув правой кнопкой мыши корень genmodel в редакторе genmodel и выбрав «Создать код Java». - person Christian Dietrich; 02.09.2017
comment
Кристиан, это работает! Большое спасибо за ваше время и усилия! - person ; 03.09.2017
comment
как я могу использовать правило ATTR в качестве идентификатора, как в моем примере? при переключении с QualifiedName на ATTR XExpression по какой-то причине больше не может найти класс Java - person ; 06.09.2017
comment
Attr конфликтует с полным именем из xbase и должен быть удален и заменен полным именем из xbase - person Christian Dietrich; 07.09.2017
comment
в чем причина этого? потому что это окончательное правило? - person ; 08.09.2017
comment
Да. А лексер жрет сколько может - person Christian Dietrich; 08.09.2017
comment
хм, хорошо, мне нужно добавить импорт в сгенерированный класс Java из вывода. Я видел такой подход eclipse.org/forums/index.php/t /487230 , где ImportedNamespaceAwareLocalScopeProvider является подклассом, а затем связывается в RuntimeModule. Могу ли я добавить произвольный импорт с помощью этого подхода? - person ; 09.09.2017
comment
Зависит от того, что вы хотите сделать - person Christian Dietrich; 09.09.2017
comment
Я хочу, чтобы класс java импортировал пакет из моей рабочей области. Я уже добавил к нему зависимость в проекте xtext. Можно ли этого добиться с помощью шаблонных выражений? - person ; 09.09.2017
comment
Чего именно вы хотите добиться? Установка тела в inferrer? - person Christian Dietrich; 09.09.2017
comment
что-то вроде member+=entity.toMethod(demo, Void.TYPE.typeRef) [body='''«List»‹«String»› list = new «ArrayList»‹«String»›();'''] ?? ? - person Christian Dietrich; 09.09.2017
comment
нет, я хочу иметь возможность использовать методы из пакета внутри моего XExpression. Поэтому я думаю, что мне нужно иметь сгенерированный класс java с помощью вывода, импортировать этот пакет. Поэтому мне нужно было бы установить раздел импорта для этого класса Java. - person ; 09.09.2017
comment
просто использовать ximportsection? см. пример модели домена - person Christian Dietrich; 09.09.2017
comment
в противном случае настройте org.eclipse.xtext.xbase.scoping.batch.ImplicitlyImportedFeatures - person Christian Dietrich; 09.09.2017
comment
Мне не нужен раздел импорта в моей грамматике. Я просто хочу иметь доступ к методам только из этого пакета внутри моего XExpression - person ; 09.09.2017
comment
тогда ImplicitlyImportedFeat‌​ures — это место, на которое стоит обратить внимание - person Christian Dietrich; 09.09.2017
comment
разве это не требует, чтобы грамматика использовала XImportSection ? - person ; 09.09.2017
comment
никакие ImplicitlyImportedFeat‌​ures не используются для предоставления, например. библиотека xbase - person Christian Dietrich; 09.09.2017
comment
github.com/xtext/seven-languages-xtext/blob/master/languages/ Я следовал этому примеру, я отредактировал исходный пост. Но я не вижу импорта PackageFromWorkspace в моем предполагаемом классе Java. Я переопределил неправильный метод? - person ; 11.09.2017
comment
Вам нужно добавить банку как в проект, содержащий механизм вывода, так и в проект, содержащий файлы модели. И вы видите это, только если вы используете его. И не забудьте привязать mydslruntimemodule - person Christian Dietrich; 11.09.2017
comment
И вам, возможно, придется убедиться, что он экспортирован в определяющем плагине. - person Christian Dietrich; 11.09.2017
comment
github.com/xtext/seven-languages-xtext/blob/master/languages/ - person Christian Dietrich; 11.09.2017
comment
Вы имеете в виду пример проекта в редакторе под проектом, содержащим файлы модели? - person ; 11.09.2017
comment
Да, я имею в виду проект, содержащий файлы yourdsl - person Christian Dietrich; 11.09.2017