summaryrefslogtreecommitdiffstats
path: root/rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend')
-rw-r--r--rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend106
1 files changed, 106 insertions, 0 deletions
diff --git a/rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend b/rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend
new file mode 100644
index 0000000..4cede2c
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/validation/validators/SetOfOperatorValidator.xtend
@@ -0,0 +1,106 @@
+package rba.tool.editor.validation.validators
+
+import java.util.HashSet
+import org.eclipse.xtext.validation.Check
+import org.eclipse.xtext.validation.EValidatorRegistrar
+import rba.core.ExpressionType
+import rba.core.ObjectReference
+import rba.core.RBACorePackage
+import rba.core.RuleObject
+import rba.core.SetOfOperator
+import rba.tool.editor.messages.Messages
+import rba.tool.editor.validation.AbstractRBAModelValidator
+import rba.core.PreviousModifier
+
+class SetOfOperatorValidator extends AbstractRBAModelValidator {
+
+ private String SET_OF_OPERAND_TYPE = Messages.SET_OF_OPERAND_TYPE;
+
+ private String SET_OF_OPERAND_DUPLICATE = Messages.SET_OF_OPERAND_DUPLICATE;
+
+ private String OPERANDS_CANNOT_USE_PRE = Messages.OPERANDS_CANNOT_USE_PRE;
+
+ override register(EValidatorRegistrar registrar) {
+ // not needed for classes used as ComposedCheck
+ }
+
+ @Check(NORMAL)
+ def checkIsEqualToOperator(SetOfOperator setOfOperator) {
+ val notNullOp = setOfOperator.operand.filter(o|o.type != ExpressionType.NULL)
+ if (notNullOp.size == 0) {
+ return;
+ }
+ val firstType = notNullOp.get(0).type
+
+ var hash = new HashSet<RuleObject>
+ for (operand : setOfOperator.operand) {
+
+ if (operand instanceof PreviousModifier) {
+ error(String.format(OPERANDS_CANNOT_USE_PRE, "SetOf"), RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+
+ var opType = operand.type
+
+ switch (firstType) {
+ case ExpressionType.AREA,
+ case ExpressionType.SET_OF_AREA: {
+ if (!(opType === ExpressionType.AREA || opType === ExpressionType.SET_OF_AREA || opType === ExpressionType.NULL)
+ ) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.CONTENT,
+ case ExpressionType.SET_OF_CONTENT: {
+ if (!(opType === ExpressionType.CONTENT || opType === ExpressionType.SET_OF_CONTENT
+ || opType === ExpressionType.NULL
+ )) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.ZONE,
+ case ExpressionType.SET_OF_ZONE: {
+ if (!(opType === ExpressionType.ZONE || opType === ExpressionType.SET_OF_ZONE)) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.SOUND,
+ case ExpressionType.SET_OF_SOUND: {
+ if (!(opType === ExpressionType.SOUND || opType === ExpressionType.SET_OF_SOUND)) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.SCENE: {
+ if (!(opType === ExpressionType.SCENE)) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ case ExpressionType.PROPERTY: {
+ if (!(opType === ExpressionType.PROPERTY)) {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+ default: {
+ error(SET_OF_OPERAND_TYPE, RBACorePackage.Literals.OPERATOR__OPERAND)
+ return;
+ }
+ }
+
+ if (operand instanceof ObjectReference) {
+ var refObj = (operand as ObjectReference).refObject
+ if (hash.contains(refObj)) {
+ error(SET_OF_OPERAND_DUPLICATE, RBACorePackage.Literals.OPERATOR__OPERAND);
+ return;
+ } else {
+ hash.add(refObj)
+ }
+ }
+ }
+ }
+}