diff options
author | 2024-02-29 16:33:59 +0100 | |
---|---|---|
committer | 2024-04-07 14:55:46 +0200 | |
commit | 23b0925f419894cf3f4699fa49dd91fb2ee4f4a5 (patch) | |
tree | 0fc5513b8e47b36a4aa822ee6b162a56f861ba1e /subprojects/language/src/main/java | |
parent | refactor(language): assignment and cast expression (diff) | |
download | refinery-23b0925f419894cf3f4699fa49dd91fb2ee4f4a5.tar.gz refinery-23b0925f419894cf3f4699fa49dd91fb2ee4f4a5.tar.zst refinery-23b0925f419894cf3f4699fa49dd91fb2ee4f4a5.zip |
feat(language): validate assignment expressions
Diffstat (limited to 'subprojects/language/src/main/java')
-rw-r--r-- | subprojects/language/src/main/java/tools/refinery/language/validation/ProblemValidator.java | 32 |
1 files changed, 32 insertions, 0 deletions
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 560f612a..7f45bc20 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 | |||
@@ -63,6 +63,8 @@ public class ProblemValidator extends AbstractProblemValidator { | |||
63 | 63 | ||
64 | public static final String UNSUPPORTED_ASSERTION_ISSUE = ISSUE_PREFIX + "UNSUPPORTED_ASSERTION"; | 64 | public static final String UNSUPPORTED_ASSERTION_ISSUE = ISSUE_PREFIX + "UNSUPPORTED_ASSERTION"; |
65 | 65 | ||
66 | public static final String INVALID_ASSIGNMENT_ISSUE = ISSUE_PREFIX + "INVALID_ASSIGNMENT"; | ||
67 | |||
66 | @Inject | 68 | @Inject |
67 | private ReferenceCounter referenceCounter; | 69 | private ReferenceCounter referenceCounter; |
68 | 70 | ||
@@ -493,4 +495,34 @@ public class ProblemValidator extends AbstractProblemValidator { | |||
493 | } | 495 | } |
494 | } | 496 | } |
495 | } | 497 | } |
498 | |||
499 | @Check | ||
500 | private void checkAssignmentExpr(AssignmentExpr assignmentExpr) { | ||
501 | var left = assignmentExpr.getLeft(); | ||
502 | if (left == null) { | ||
503 | // Syntactically invalid, so we already emit an error. | ||
504 | return; | ||
505 | } | ||
506 | if (!(left instanceof VariableOrNodeExpr variableOrNodeExpr)) { | ||
507 | var message = "Left side of an assignment must be variable."; | ||
508 | acceptError(message, assignmentExpr, ProblemPackage.Literals.BINARY_EXPR__LEFT, | ||
509 | 0, INVALID_ASSIGNMENT_ISSUE); | ||
510 | return; | ||
511 | } | ||
512 | var target = variableOrNodeExpr.getVariableOrNode(); | ||
513 | if (target == null) { | ||
514 | // Syntactically invalid, so we already emit an error. | ||
515 | return; | ||
516 | } | ||
517 | if (target instanceof Parameter) { | ||
518 | var message = "Parameters cannot be assigned."; | ||
519 | acceptError(message, variableOrNodeExpr, ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE, | ||
520 | 0, INVALID_ASSIGNMENT_ISSUE); | ||
521 | } | ||
522 | if (target instanceof Node) { | ||
523 | var message = "Nodes cannot be assigned."; | ||
524 | acceptError(message, variableOrNodeExpr, ProblemPackage.Literals.VARIABLE_OR_NODE_EXPR__VARIABLE_OR_NODE, | ||
525 | 0, INVALID_ASSIGNMENT_ISSUE); | ||
526 | } | ||
527 | } | ||
496 | } | 528 | } |