2012-05-04 2 views
0

Прежде всего: спасибо за поддержку!Неопределенный тест для перечисления с Acceleo

Моя проблема: Я хочу просто проверить, определен ли атрибут «перечислены» или нет.

Скажем, у меня есть:

  • EnumValues ​​перечисление с 2 значениями VALEUR1 и Valeur
  • объект EObject с дополнительным значением атрибута

я ожидал бы, чтобы проверить наличие значения благодаря этому выражению:

object.value.oclIsUndefined() 

Но thi выражение s всегда возвращает true, поскольку атрибут value, кажется, инициализируется первым значением перечисления. Единственный способ обхода, который я нашел, - не объявлять EnumValues ​​как Enum, а как EObject. Затем метод oclIsUndefined() возвращает false, если атрибут не задан в модели. BTW моя модель создается благодаря Xtext.

Это, кажется, глупый вопрос, но я не могу найти ответ на Google, в спецификации OCL или в ресурсах Acceleo.

Единственный найденный материал here говорит, что единственный способ достичь этого - использовать метод isUndefinined или более общий метод isUndefined ('value') OCL helper. Но я не могу отказаться от этого в окружающей среде Акчелео.

У вас есть идея?

Заранее благодарим за ваш ответ!

Stéphane

ответ

0

В EMF, Перечисления имеет значение по умолчанию (по умолчанию первого перечисление буквального вашего перечисления), если вы действительно хотите создать перечисление со значением по умолчанию, используйте this. Имейте в виду, что это не «обычное» поведение для перечисления в EMF.

Acceleo просто сообщает вам, что говорит EMF: «ваше перечисление имеет значение».

Вы можете проверить в Acceleo вашего перечисления со следующим выражением:

[myObject.myEnumValue = MyEnum::MyEnumLiteral/] 

Как объяснены в wiki.

С уважением,

Stephane Begaudeau, лидер Acceleo

+0

Hi Stéphane! Какой хоннор! Лидер Acceleo! Спасибо за ваш ответ и ссылку. Эффективно я использую обозначение, которое вы упомянули, чтобы проверить значение перечисления. Один обходной путь, обозначенный документацией Xtext, представляет собой выделенное значение none в первой позиции перечисления ... Что я не нашел очень элегантным, но хочу, чтобы Xtext создавал мою модель ecore. Так что я собираюсь использовать этот совет ... Еще раз спасибо! Stéphane –

0

Я хотел бы сделать следующее:

  • использовать вручную поддерживается метамодели в XText
  • но НЕ фиктивный литерал EEnum
  • Решение Cleaner - это imho, чтобы объявить EAttribute, который содержит значение Enum как unsettable, и, таким образом, EMF сообщит вам, если значение было явно задано или по умолчанию.
+0

Привет, христианин! Вы повсюду! Спасибо за ваш второй ответ. Эффективно, ваше решение лучше: я, конечно, буду использовать ручную метамодель ... Но во второй раз. На данный момент я просто хочу быстро показать, что можно сделать со всеми этими замечательными инструментами! ... И поддержание метамодели - это ... больше работы :) Еще раз спасибо. Stéphane –

Смежные вопросы