+ private static void validateNodeCanBeCopiedByAugment(
+ final StatementContextBase<?, ?, ?> sourceCtx,
+ final List<StatementContextBase> targetSubStatements,
+ boolean sourceAndTargetInSameModule) {
+
+ if (sourceCtx.getPublicDefinition().getDeclaredRepresentationClass()
+ .equals(WhenStatement.class)) {
+ return;
+ }
+
+ if (!sourceAndTargetInSameModule) {
+ final List<StatementContextBase> sourceSubStatements = new Builder<StatementContextBase>()
+ .addAll(sourceCtx.declaredSubstatements())
+ .addAll(sourceCtx.effectiveSubstatements()).build();
+
+ for (final StatementContextBase sourceSubStatement : sourceSubStatements) {
+ if (sourceSubStatement.getPublicDefinition()
+ .getDeclaredRepresentationClass()
+ .equals(MandatoryStatement.class)) {
+ throw new IllegalArgumentException(
+ String.format(
+ "An augment cannot add node '%s' because it is mandatory and in module different from target",
+ sourceCtx.rawStatementArgument()));
+ }
+ }
+ }
+
+ for (final StatementContextBase subStatement : targetSubStatements) {
+
+ final boolean sourceIsDataNode = DataDefinitionStatement.class
+ .isAssignableFrom(sourceCtx.getPublicDefinition()
+ .getDeclaredRepresentationClass());
+ final boolean targetIsDataNode = DataDefinitionStatement.class
+ .isAssignableFrom(subStatement.getPublicDefinition()
+ .getDeclaredRepresentationClass());
+ boolean qNamesEqual = sourceIsDataNode
+ && targetIsDataNode
+ && Objects.equals(sourceCtx.getStatementArgument(),
+ subStatement.getStatementArgument());
+
+ if (qNamesEqual) {
+ throw new IllegalStateException(
+ String.format(
+ "An augment cannot add node named '%s' because this name is already used in target",
+ sourceCtx.rawStatementArgument()));
+ }
+ }
+ }
+