From 9fba55097010c5c57af35d9752517bad2a6d32a6 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Fri, 17 May 2024 18:52:39 +0200 Subject: feat(language): more extensive rule validation --- .../tools/refinery/language/validation/ProblemValidator.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'subprojects/language') diff --git a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java index 0285c0c8..7b392182 100644 --- a/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java +++ b/subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java @@ -340,11 +340,20 @@ public class ProblemValidator extends AbstractProblemValidator { public void checkParameter(Parameter parameter) { checkArity(parameter, ProblemPackage.Literals.PARAMETER__PARAMETER_TYPE, 1); var parametricDefinition = EcoreUtil2.getContainerOfType(parameter, ParametricDefinition.class); - if (parametricDefinition instanceof RuleDefinition) { + if (parametricDefinition instanceof RuleDefinition rule) { if (parameter.getParameterType() != null && parameter.getModality() == Modality.NONE) { acceptError("Parameter type modality must be specified.", parameter, ProblemPackage.Literals.PARAMETER__PARAMETER_TYPE, 0, INVALID_MODALITY_ISSUE); } + var kind = rule.getKind(); + var binding = parameter.getBinding(); + if (kind == RuleKind.PROPAGATION && binding != ParameterBinding.SINGLE) { + acceptError("Parameter binding annotations are not supported in propagation rules.", parameter, + ProblemPackage.Literals.PARAMETER__BINDING, 0, INVALID_MODALITY_ISSUE); + } else if (kind != RuleKind.DECISION && binding == ParameterBinding.MULTI) { + acceptError("Explicit multi-object bindings are only supported in decision rules.", parameter, + ProblemPackage.Literals.PARAMETER__BINDING, 0, INVALID_MODALITY_ISSUE); + } } else { if (parameter.getConcreteness() != Concreteness.PARTIAL || parameter.getModality() != Modality.NONE) { acceptError("Modal parameter types are only supported in rule definitions.", parameter, null, 0, -- cgit v1.2.3-54-g00ecf