Skip to content

Commit 976621c

Browse files
committed
ST6RI-897 Added checks for validations previously "auto satisfied."
1 parent 259ca00 commit 976621c

3 files changed

Lines changed: 141 additions & 51 deletions

File tree

org.omg.kerml.xtext/src/org/omg/kerml/xtext/validation/KerMLValidator.xtend

Lines changed: 67 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation
33
* Copyright (c) 2018 IncQuery Labs Ltd.
4-
* Copyright (c) 2018-2025 Model Driven Solutions, Inc.
4+
* Copyright (c) 2018-2026 Model Driven Solutions, Inc.
55
* Copyright (c) 2020 California Institute of Technology/Jet Propulsion Laboratory
66
*
77
* This program is free software: you can redistribute it and/or modify
@@ -103,6 +103,10 @@ import java.util.Collections
103103
import java.util.HashMap
104104
import java.util.Set
105105
import java.util.Map
106+
import org.omg.sysml.lang.sysml.EndFeatureMembership
107+
import org.omg.sysml.lang.sysml.CollectExpression
108+
import org.omg.sysml.lang.sysml.SelectExpression
109+
import org.omg.sysml.lang.sysml.IndexExpression
106110

107111
/**
108112
* This class contains custom validation rules.
@@ -160,6 +164,9 @@ class KerMLValidator extends AbstractKerMLValidator {
160164

161165
public static val INVALID_CLASSIFIER_MULTIPLICITY_DOMAIN = "validateClassifierMultiplicityDomain"
162166
public static val INVALID_CLASSIFIER_MULTIPLICITY_DOMAIN_MSG = "Multiplicity must not have a featuring type"
167+
168+
public static val INVALID_END_FEATURE_MEMBERSHIP_IS_END = "validateEndFeatureMembershpIsEnd"
169+
public static val INVALID_END_FEATURE_MEMBERSHIP_IS_END_MSG = "Must be an end feature"
163170

164171
// Note: validateFeatureHasType is not in the spec, but it is implied by semantic constraints on features.
165172
public static val INVALID_FEATURE_HAS_TYPE = 'validateFeatureHasType_'
@@ -264,6 +271,8 @@ class KerMLValidator extends AbstractKerMLValidator {
264271
public static val INVALID_BEHAVIOR_SPECIALIZATION = "validateBehaviorSpecialization"
265272
public static val INVALID_BEHAVIOR_SPECIALIZATION_MSG = "Cannot specialize structure"
266273

274+
public static val INVALID_PARAMETER_MEMBERSHIP_DIRECTION = "validateParameterMembershipDirection"
275+
public static val INVALID_PARAMETER_MEMBERSHIP_DIRECTION_MSG = "Must have direction '{direction}'"
267276
public static val INVALID_PARAMETER_MEMBERSHIP_OWNING_TYPE = "validateParameterMembershipOwningType"
268277
public static val INVALID_PARAMETER_MEMBERSHIP_OWNING_TYPE_MSG = "Parameter membership not allowed"
269278

@@ -319,9 +328,23 @@ class KerMLValidator extends AbstractKerMLValidator {
319328
public static val INVALID_OPERATOR_EXPRESSION_BRACKET_OPERATOR = "validateOperatorExpressionBracketOperator_"
320329
public static val INVALID_OPERATOR_EXPRESSION_BRACKET_OPERATOR_MSG = "Use #(...) for indexing"
321330

331+
public static val INVALID_COLLECT_EXPRESSION_OPERATOR = "validateCollectExpressionOperator"
332+
public static val INVALID_COLLECT_EXPRESSION_OPERATOR_MSG = "Operator must be 'collect'"
333+
334+
public static val INVALID_FEATURE_CHAIN_EXPRESSION_OPERATOR = "validateFeatureChainExpressionOperator"
335+
public static val INVALID_FEATURE_CHAIN_EXPRESSION_OPERATOR_MSG = "Operator must be '.'"
336+
337+
public static val INVALID_INDEX_EXPRESSION_OPERATOR = "validateIndexExpressionOperator"
338+
public static val INVALID_INDEX_EXPRESSION_OPERATOR_MSG = "Operator must be '#'"
339+
340+
public static val INVALID_SELECT_EXPRESSION_OPERATOR = "validateSelectExpressionOperator"
341+
public static val INVALID_SELECT_EXPRESSION_OPERATOR_MSG = "Operator must be 'select'"
342+
322343
public static val INVALID_FLOW_ITEM_FEATURE = "validateFlowItemFeature"
323344
public static val INVALID_FLOW_ITEM_FEATURE_MSG = "Only one item feature is allowed"
324345

346+
public static val INVALID_FLOW_END_IS_END = "validateFlowEndIsEnd"
347+
public static val INVALID_FLOW_END_IS_END_MSG = "Must be an end feature"
325348
public static val INVALID_FLOW_END_OWNING_TYPE = "validateFlowEndOwningType"
326349
public static val INVALID_FLOW_END_OWNING_TYPE_MSG = "Flow end not allowed"
327350
public static val INVALID_FLOW_END_NESTED_FEATURE = "validateFlowEndNestedFeature"
@@ -555,10 +578,14 @@ class KerMLValidator extends AbstractKerMLValidator {
555578
}
556579
}
557580

558-
// @Check
559-
// def checkEndFeatureMembership(EndFeatureMembership m) {
560-
// // validateEndFeatureMembershipIsEnd is automatically satisfied
561-
// }
581+
@Check
582+
def checkEndFeatureMembership(EndFeatureMembership m) {
583+
// validateEndFeatureMembershipIsEnd
584+
var ownedMemberFeature = m.ownedMemberFeature
585+
if (ownedMemberFeature !== null && !ownedMemberFeature.isEnd) {
586+
error(INVALID_END_FEATURE_MEMBERSHIP_IS_END_MSG, ownedMemberFeature, null, INVALID_END_FEATURE_MEMBERSHIP_IS_END)
587+
}
588+
}
562589

563590
@Check
564591
def checkFeature(Feature f){
@@ -1026,9 +1053,12 @@ class KerMLValidator extends AbstractKerMLValidator {
10261053
ExpressionUtil.isConstructorResult(owningType))) {
10271054
error(INVALID_PARAMETER_MEMBERSHIP_OWNING_TYPE_MSG, m, SysMLPackage.eINSTANCE.parameterMembership_OwnedMemberParameter, INVALID_PARAMETER_MEMBERSHIP_OWNING_TYPE)
10281055
}
1029-
1030-
// validateParameterMembershipParameterHasDirection is automatically satisfied
10311056
}
1057+
// validateParameterMembershipParameterDirection
1058+
var ownedMemberParameter = m.ownedMemberParameter
1059+
if (ownedMemberParameter !== null && ownedMemberParameter.direction != m.parameterDirection) {
1060+
error(INVALID_PARAMETER_MEMBERSHIP_DIRECTION_MSG.replace("{direction}", m.parameterDirection.toString.toLowerCase), ownedMemberParameter, null, INVALID_PARAMETER_MEMBERSHIP_DIRECTION)
1061+
}
10321062
}
10331063

10341064
@Check
@@ -1074,8 +1104,6 @@ class KerMLValidator extends AbstractKerMLValidator {
10741104
if (!(owningType instanceof Function || owningType instanceof Expression)) {
10751105
error(INVALID_RETURN_PARAMETER_MEMBERSHIP_OWNING_TYPE_MSG, m, SysMLPackage.eINSTANCE.parameterMembership_OwnedMemberParameter, INVALID_RETURN_PARAMETER_MEMBERSHIP_OWNING_TYPE)
10761106
}
1077-
1078-
// validateReturnParameterMembershipParameterHasDirectionOut is automatically satisfied
10791107
}
10801108

10811109
@Check
@@ -1085,19 +1113,15 @@ class KerMLValidator extends AbstractKerMLValidator {
10851113
if (!(owningType instanceof Function || owningType instanceof Expression)) {
10861114
error(INVALID_RESULT_EXPRESSION_MEMBERSHIP_OWNING_TYPE_MSG, m, SysMLPackage.eINSTANCE.parameterMembership_OwnedMemberParameter, INVALID_RESULT_EXPRESSION_MEMBERSHIP_OWNING_TYPE)
10871115
}
1088-
1089-
// validateReturnParameterMembershipParameterHasDirectionOut is automatically satisfied
10901116
}
10911117

1092-
// @Check
1093-
// def checkReturnParameterMembership(ReturnParameterMembership m) {
1094-
// // validateReturnParameterMembershipParameterHasDirection is automatically satisfied
1095-
// }
1096-
1097-
// @Check
1098-
// def checkCollectExpression(CollectExpression e) {
1099-
// // validateCollectExpressionOperator is automatically satisfied
1100-
// }
1118+
@Check
1119+
def checkCollectExpression(CollectExpression e) {
1120+
// validateCollectExpressionOperator
1121+
if (e.operator != "collect") {
1122+
error(INVALID_COLLECT_EXPRESSION_OPERATOR_MSG, e, null, INVALID_COLLECT_EXPRESSION_OPERATOR);
1123+
}
1124+
}
11011125

11021126
@Check
11031127
def checkFeatureChainExpression(FeatureChainExpression e) {
@@ -1112,7 +1136,10 @@ class KerMLValidator extends AbstractKerMLValidator {
11121136
error(INVALID_FEATURE_CHAIN_EXPRESSION_FEATURE_CONFORMANCE_MSG, e.ownedMembership.get(1), SysMLPackage.eINSTANCE.membership_MemberElement, INVALID_FEATURE_CHAIN_EXPRESSION_FEATURE_CONFORMANCE)
11131137
}
11141138

1115-
// validateFeatureChainExpressionOperator is automatically satisfied
1139+
// validateFeatureChainExpressionOperator
1140+
if (e.operator != ".") {
1141+
error(INVALID_FEATURE_CHAIN_EXPRESSION_OPERATOR_MSG, e, null, INVALID_FEATURE_CHAIN_EXPRESSION_OPERATOR);
1142+
}
11161143
}
11171144

11181145
@Check
@@ -1235,15 +1262,21 @@ class KerMLValidator extends AbstractKerMLValidator {
12351262
}
12361263
}
12371264

1238-
// @Check
1239-
// def checkSelectExpression(SelectExpression e) {
1240-
// // validateSelectExpressionOperator is automatically satisfied
1241-
// }
1242-
1243-
// @Check
1244-
// def checkIndexExpression(IndexExpression e) {
1245-
// // validateIndexExpressionOperator is automatically satisfied
1246-
// }
1265+
@Check
1266+
def checkSelectExpression(SelectExpression e) {
1267+
// validateSelectExpressionOperator
1268+
if (e.operator != "select") {
1269+
error(INVALID_SELECT_EXPRESSION_OPERATOR_MSG, e, null, INVALID_SELECT_EXPRESSION_OPERATOR);
1270+
}
1271+
}
1272+
1273+
@Check
1274+
def checkIndexExpression(IndexExpression e) {
1275+
// validateIndexExpressionOperator
1276+
if (e.operator != "#") {
1277+
error(INVALID_INDEX_EXPRESSION_OPERATOR_MSG, e, null, INVALID_INDEX_EXPRESSION_OPERATOR);
1278+
}
1279+
}
12471280

12481281
@Check
12491282
def checkFlow(Flow flow) {
@@ -1254,7 +1287,10 @@ class KerMLValidator extends AbstractKerMLValidator {
12541287

12551288
@Check
12561289
def checkFlowEnd(FlowEnd flowEnd) {
1257-
// validateFlowEndIsEnd is automatically satisfied
1290+
// validateFlowEndIsEnd
1291+
if (!flowEnd.isEnd) {
1292+
error(INVALID_FLOW_END_IS_END_MSG, flowEnd, null, INVALID_FLOW_END_IS_END)
1293+
}
12581294

12591295
// validateFlowEndNestedFeature
12601296
if (flowEnd.ownedFeature.size != 1) {

org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/PortUsage_Invalid.sysml.xt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ package 'Port Example' {
4747
port two_port_def_types: pd1, pd2 {
4848
port p2 : pd2;
4949
ref b3 : B;
50-
// XPECT errors --> "Nested usages of a port usage (other than ports) must be referential." at "part b4 : B;"
50+
// XPECT errors --> "Nested usages in a port usage (other than ports) must be referential." at "part b4 : B;"
5151
part b4 : B;
5252
}
5353
}

org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend

Lines changed: 73 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*****************************************************************************
22
* SysML 2 Pilot Implementation
33
* Copyright (c) 2020 California Institute of Technology/Jet Propulsion Laboratory
4-
* Copyright (c) 2020-2025 Model Driven Solutions, Inc.
4+
* Copyright (c) 2020-2026 Model Driven Solutions, Inc.
55
*
66
* This program is free software: you can redistribute it and/or modify
77
* it under the terms of the GNU Lesser General Public License as published by
@@ -148,6 +148,10 @@ class SysMLValidator extends KerMLValidator {
148148

149149
public static val INVALID_USAGE_TYPE = "validateUsageType_"
150150
public static val INVALID_USAGE_TYPE_MSG = "A usage must be typed by definitions."
151+
public static val INVALID_USAGE_IS_REFERENTIAL = "validateUsageIsReferential"
152+
public static val INVALID_USAGE_IS_REFERENTIAL_MSG_1 = "A directed usage must be referential."
153+
public static val INVALID_USAGE_IS_REFERENTIAL_MSG_2 = "An end usage must be referential."
154+
public static val INVALID_USAGE_IS_REFERENTIAL_MSG_3 = "A package-lebel usage must be referential."
151155
public static val INVALID_USAGE_VARIATION_IS_ABSTRACT = "validateUsageVariationIsAbstract"
152156
public static val INVALID_USAGE_VARIATION_IS_ABSTRACT_MSG = "A variation must be abstract."
153157
public static val INVALID_USAGE_VARIATION_MEMBERSHIP = "validateUsageVariationMembership"
@@ -158,21 +162,34 @@ class SysMLValidator extends KerMLValidator {
158162
public static val INVALID_VARIANT_MEMBERSHIP_OWNING_NAMESPACE = "validateVariationMembershipOwningNamespace"
159163
public static val INVALID_VARIANT_MEMBERSHIP_OWNING_NAMESPACE_MSG = "A variant must be an owned member of a variation."
160164

165+
public static val INVALID_REFERENCE_USAGE_IS_REFERENCE = "validateReferenceUsageIsReference"
166+
public static val INVALID_REFERENCE_USAGE_IS_REFERENCE_MSG = "An attribute usage must be referential."
167+
161168
public static val INVALID_ATTRIBUTE_DEFINITION_FEATURES = "validateAttributeDefinitionFeatures"
162169
public static val INVALID_ATTRIBUTE_DEFINITION_FEATURES_MSG = "Features of an attribute definition must be referential."
163170
public static val INVALID_ATTRIBUTE_DEFINITION_SPECIALIZATION = "validateDataTypeSpecialization"
164171
public static val INVALID_ATTRIBUTE_DEFINITION_SPECIALIZATION_MSG = "Cannot specialize item definition"
165172

166173
public static val INVALID_ATTRIBUTE_USAGE_FEATURES = "validateAttributeUsageFeatures"
167174
public static val INVALID_ATTRIBUTE_USAGE_FEATURES_MSG = "Features of an attribute usage must be referential."
175+
public static val INVALID_ATTRIBUTE_USAGE_IS_REFERENTIAL = "validateAttributeUsageIsReferential"
176+
public static val INVALID_ATTRIBUTE_USAGE_IS_REFERENTIAL_MSG = "An attribute usage must be referential."
168177
public static val INVALID_ATTRIBUTE_USAGE_TYPE = "validateAttributeUsageType_"
169178
public static val INVALID_ATTRIBUTE_USAGE_MSG = "An attribute must be typed by attribute definitions."
170179
public static val INVALID_ATTRIBUTE_USAGE_ENUMERATION_TYPE = "validateAttributeUsageEnumerationType_"
171180
public static val INVALID_ATTRIBUTE_USAGE_ENUMERATION_TYPE_MSG = "An enumeration attribute cannot have more than one type."
172181

182+
public static val INVALID_ENUMERATION_DEFINITION_IS_VARIATION = "validateEnumerationDefinitionIsVariation"
183+
public static val INVALID_ENUMERATION_DEFINITION_IS_VARIATION_MSG = "An enumeration definition must be a variation."
184+
173185
public static val INVALID_ENUMERATION_USAGE_TYPE = "validateEnumerationUsageType_"
174186
public static val INVALID_ENUMERATION_USAGE_TYPE_MSG = "An enumeration must be typed by one enumeration definition."
175187

188+
public static val INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE = "validateEventOccurrenceUsageIsReference"
189+
public static val INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE_MSG_0 = "An event occurrence usage must be referential."
190+
public static val INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE_MSG_1 = "An exhibit state usage must be referential."
191+
public static val INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE_MSG_2 = "An include use case usage must be referential."
192+
public static val INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE_MSG_3 = "A perform action usage must be referential."
176193
public static val INVALID_EVENT_OCCURRENCE_USAGE_REFERENCE = "validateEventOccurrenceUsageReferent"
177194
public static val INVALID_EVENT_OCCURRENCE_USAGE_REFERENCE_MSG = "Must reference an occurrence."
178195

@@ -210,8 +227,10 @@ class SysMLValidator extends KerMLValidator {
210227

211228
public static val INVALID_PORT_USAGE_TYPE = "validatePortUsageType_"
212229
public static val INVALID_PORT_USAGE_TYPE_MSG = "A port must be typed by port definitions."
230+
public static val INVALID_PORT_USAGE_IS_REFERENCE = "validatePortUsageIsReference"
231+
public static val INVALID_PORT_USAGE_IS_REFERENCE_MSG = "A port usage must be referential."
213232
public static val INVALID_PORT_USAGE_NESTED_USAGES_NOT_COMPOSITE = "validatePortUsageNestedUsagesNotComposite"
214-
public static val INVALID_PORT_USAGE_NESTED_USAGES_NOT_COMPOSITE_MSG = "Nested usages of a port usage (other than ports) must be referential."
233+
public static val INVALID_PORT_USAGE_NESTED_USAGES_NOT_COMPOSITE_MSG = "Nested usages in a port usage (other than ports) must be referential."
215234

216235
public static val INVALID_CONNECTION_USAGE_TYPE = "validateConnectionUsageType_"
217236
public static val INVALID_CONNECTION_USAGE_TYPE_MSG = "A connection must be typed by connection definitions."
@@ -420,8 +439,8 @@ class SysMLValidator extends KerMLValidator {
420439

421440
public static val INVALID_EXPOSE_IS_IMPORT_ALL = "validateExposeIsImportAll"
422441
public static val INVALID_EXPOSE_IS_IMPORT_ALL_MSG = "An expose must import all."
423-
public static val INVALID_EXPOSE_IS_OWNING_NAMESPACE = "validateExposeIsImportAll"
424-
public static val INVALID_EXPOSE_IS_OWNING_NAMESPACE_MSG = "Only view usages can expose elements."
442+
public static val INVALID_EXPOSE_OWNING_NAMESPACE = "validateExposeOwningNamespace"
443+
public static val INVALID_EXPOSE_OWNING_NAMESPACE_MSG = "Only view usages can expose elements."
425444

426445
public static val INVALID_RENDERING_USAGE_TYPE = "validateRenderingUsageType_"
427446
public static val INVALID_RENDERING_USAGE_TYPE_MSG = "A rendering must be typed by one rendering definition."
@@ -467,20 +486,31 @@ class SysMLValidator extends KerMLValidator {
467486
}
468487
}
469488

470-
// @Check
471-
// def checkReferenceUsage(ReferenceUsage usage) {
472-
// // validateReferenceUsageIsReferential is satisfied automatically
473-
// }
474-
489+
@Check
490+
def checkReferenceUsage(ReferenceUsage usage) {
491+
// validateReferenceUsageIsReferential
492+
if (!usage.isReference) {
493+
error(INVALID_ATTRIBUTE_USAGE_IS_REFERENTIAL_MSG, usage, null, INVALID_ATTRIBUTE_USAGE_IS_REFERENTIAL)
494+
}
495+
}
475496

476497
@Check
477498
def checkUsage(Usage usage) {
478499
// All types must be Classifiers
479500
if (!(usage instanceof AttributeUsage || usage instanceof OccurrenceUsage))
480501
checkAllTypes(usage, Classifier, INVALID_USAGE_TYPE_MSG, SysMLPackage.eINSTANCE.usage_Definition, INVALID_USAGE_TYPE)
481502

482-
// validateUsageIsReferential is satisfied automatically
483-
503+
// validateUsageIsReferential
504+
if (!usage.isReference) {
505+
if (usage.direction !== null) {
506+
error(INVALID_USAGE_IS_REFERENTIAL_MSG_1, usage, null, INVALID_USAGE_IS_REFERENTIAL)
507+
} else if (usage.isEnd) {
508+
error(INVALID_USAGE_IS_REFERENTIAL_MSG_2, usage, null, INVALID_USAGE_IS_REFERENTIAL)
509+
} else if (usage.featuringType.empty) {
510+
error(INVALID_USAGE_IS_REFERENTIAL_MSG_3, usage, null, INVALID_USAGE_IS_REFERENTIAL)
511+
}
512+
}
513+
484514
if (usage.isVariation) {
485515
// validateUsageVariationIsAbstract
486516
if (!usage.isAbstract) {
@@ -539,7 +569,10 @@ class SysMLValidator extends KerMLValidator {
539569
}
540570
}
541571

542-
// validateAttributeUsageIsReference is satisfied automatically
572+
// validateAttributeUsageIsReference
573+
if (!usg.isReference) {
574+
error(INVALID_REFERENCE_USAGE_IS_REFERENCE_MSG, usg, null, INVALID_REFERENCE_USAGE_IS_REFERENCE)
575+
}
543576

544577
// Not implemented for now, until resolution of KerML issues on composite semantics. (See KerML-4.)
545578
// TODO: Check validateAttributeUsageFeatures
@@ -548,10 +581,13 @@ class SysMLValidator extends KerMLValidator {
548581
// checkAllNotComposite(usg.ownedFeature, INVALID_ATTRIBUTE_USAGE_FEATURES_MSG, INVALID_ATTRIBUTE_USAGE_FEATURES)
549582
}
550583

551-
// @Check
552-
// def checkEnumerationDefinition(EnumerationDefinition defn) {
553-
// // validateEnumerationDefinitionIsVariation is satisfied automatically
554-
// }
584+
@Check
585+
def checkEnumerationDefinition(EnumerationDefinition defn) {
586+
// validateEnumerationDefinitionIsVariation
587+
if (!defn.isVariation) {
588+
error(INVALID_ENUMERATION_DEFINITION_IS_VARIATION_MSG, defn, null, INVALID_ENUMERATION_DEFINITION_IS_VARIATION)
589+
}
590+
}
555591

556592
@Check
557593
def checkEnumerationUsage(EnumerationUsage usg) {
@@ -561,7 +597,18 @@ class SysMLValidator extends KerMLValidator {
561597

562598
@Check
563599
def checkEventOccurrenceUsage(EventOccurrenceUsage usg) {
564-
// validateEventOccurrenceUsageIsReference is satisfied automatically
600+
// validateEventOccurrenceUsageIsReference
601+
if (!usg.isReference) {
602+
if (usg instanceof ExhibitStateUsage) {
603+
error(INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE_MSG_1, usg, null, INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE)
604+
} else if (usg instanceof IncludeUseCaseUsage) {
605+
error(INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE_MSG_2, usg, null, INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE)
606+
} else if (usg instanceof PerformActionUsage) {
607+
error(INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE_MSG_3, usg, null, INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE)
608+
} else {
609+
error(org.omg.sysml.xtext.validation.SysMLValidator.INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE_MSG_0, usg, null, INVALID_EVENT_OCCURRENCE_USAGE_IS_REFERENCE)
610+
}
611+
}
565612

566613
// validateEventOccurrenceUsageReference
567614
if (!(usg instanceof PerformActionUsage || usg instanceof IncludeUseCaseUsage)) {
@@ -645,7 +692,11 @@ class SysMLValidator extends KerMLValidator {
645692
// All types must be PortDefinitions
646693
checkAllTypes(usg, PortDefinition, INVALID_PORT_USAGE_TYPE_MSG, SysMLPackage.eINSTANCE.portUsage_PortDefinition, INVALID_PORT_USAGE_TYPE)
647694

648-
// validatePortUsageIsReference is satisfied automatically
695+
// validatePortUsageIsReference
696+
val owningType = usg.owningType
697+
if (!(owningType instanceof PortDefinition || owningType instanceof PortUsage || usg.isReference)) {
698+
error(INVALID_PORT_USAGE_IS_REFERENCE_MSG, usg, null, INVALID_PORT_USAGE_IS_REFERENCE)
699+
}
649700

650701
// validatePortUsageNestedUsagesNotComposite
651702
val usages = usg.nestedUsage.filter[u | !(u instanceof PortUsage)]
@@ -1197,7 +1248,10 @@ class SysMLValidator extends KerMLValidator {
11971248

11981249
@Check
11991250
def checkExpose(Expose exp) {
1200-
// validateExposeIsImportAll is automatically satisfied
1251+
// validateExposeIsImportAll
1252+
if (!exp.isImportAll) {
1253+
error(INVALID_EXPOSE_IS_IMPORT_ALL_MSG, exp, null, INVALID_EXPOSE_IS_IMPORT_ALL)
1254+
}
12011255

12021256
// validateExposeOwningNamespace
12031257
if (!(exp.importOwningNamespace instanceof ViewUsage)) {

0 commit comments

Comments
 (0)