X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2Faugment%2FAbstractAugmentStatementSupport.java;h=7cb61b4f06ad7456346a9ce14b01e9717ec1a088;hb=2d8edd5622078f454592ef120e627f59a5d05c42;hp=825a9a1774dffd27582883255ba2569e767fff6a;hpb=6ca178b9c67bda1aa2603d5f25ce276efdbbd928;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java index 825a9a1774..7cb61b4f06 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AbstractAugmentStatementSupport.java @@ -12,10 +12,13 @@ import static com.google.common.base.Verify.verify; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import java.util.List; +import java.util.Objects; import java.util.regex.Pattern; +import org.opendaylight.yangtools.yang.common.Empty; import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.DeclarationReference; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -26,11 +29,15 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absol import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant; import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement; +import org.opendaylight.yangtools.yang.model.parser.api.YangParserConfiguration; +import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators; +import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatements; +import org.opendaylight.yangtools.yang.model.ri.stmt.EffectiveStatements; +import org.opendaylight.yangtools.yang.model.spi.meta.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder; +import org.opendaylight.yangtools.yang.model.spi.meta.SubstatementIndexingException; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.SubstatementIndexingException; import org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespace; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.EffectiveStmtCtx.Current; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite; @@ -42,20 +49,24 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; abstract class AbstractAugmentStatementSupport - extends BaseStatementSupport { + extends AbstractStatementSupport { private static final Pattern PATH_REL_PATTERN1 = Pattern.compile("\\.\\.?\\s*/(.+)"); private static final Pattern PATH_REL_PATTERN2 = Pattern.compile("//.*"); - AbstractAugmentStatementSupport() { - super(YangStmtMapping.AUGMENT); + AbstractAugmentStatementSupport(final YangParserConfiguration config) { + super(YangStmtMapping.AUGMENT, StatementPolicy.copyDeclared( + (copy, current, substatements) -> + copy.getArgument().equals(current.getArgument()) + && copy.moduleName().getModule().equals(current.moduleName().getModule()) + && Objects.equals(copy.original(), current.original()) + ), config); } @Override public final SchemaNodeIdentifier parseArgumentValue(final StmtContext ctx, final String value) { SourceException.throwIf(PATH_REL_PATTERN1.matcher(value).matches() - || PATH_REL_PATTERN2.matcher(value).matches(), ctx.sourceReference(), - "Augment argument \'%s\' is not valid, it can be only absolute path; or descendant if used in uses", - value); + || PATH_REL_PATTERN2.matcher(value).matches(), ctx, + "Augment argument \'%s\' is not valid, it can be only absolute path; or descendant if used in uses", value); // As per: // https://tools.ietf.org/html/rfc6020#section-7.15 @@ -67,10 +78,10 @@ abstract class AbstractAugmentStatementSupport final SchemaNodeIdentifier result = ArgumentUtils.nodeIdentifierFromPath(ctx, value); final StatementDefinition parent = ctx.coerceParentContext().publicDefinition(); if (parent == YangStmtMapping.USES) { - SourceException.throwIf(result instanceof Absolute, ctx.sourceReference(), + SourceException.throwIf(result instanceof Absolute, ctx, "Absolute schema node identifier is not allowed when used within a uses statement"); } else { - SourceException.throwIf(result instanceof Descendant, ctx.sourceReference(), + SourceException.throwIf(result instanceof Descendant, ctx, "Descendant schema node identifier is not allowed when used outside of a uses statement"); } return result; @@ -101,13 +112,13 @@ abstract class AbstractAugmentStatementSupport @Override protected final AugmentStatement createDeclared(final StmtContext ctx, final ImmutableList> substatements) { - return new RegularAugmentStatement(ctx.getRawArgument(), ctx.getArgument(), substatements); + return DeclaredStatements.createAugment(ctx.getRawArgument(), ctx.getArgument(), substatements); } @Override - protected final AugmentStatement createEmptyDeclared( - final StmtContext ctx) { - return new EmptyAugmentStatement(ctx.getRawArgument(), ctx.getArgument()); + protected final AugmentStatement attachDeclarationReference(final AugmentStatement stmt, + final DeclarationReference reference) { + return DeclaredStatementDecorators.decorateAugment(stmt, reference); } @Override @@ -117,7 +128,7 @@ abstract class AbstractAugmentStatementSupport // Pick up the marker left by onFullDefinitionDeclared() inference action. If it is present we need to pass our // children through target's implicit wrapping. final StatementContextBase implicitDef = stmt.getFromNamespace(AugmentImplicitHandlingNamespace.class, - stmt.caerbannog()); + Empty.getInstance()); return implicitDef == null ? substatements : Lists.transform(substatements, subCtx -> { verify(subCtx instanceof StatementContextBase); return implicitDef.wrapWithImplicit((StatementContextBase) subCtx); @@ -133,11 +144,10 @@ abstract class AbstractAugmentStatementSupport .toFlags(); try { - return new AugmentEffectiveStatementImpl(stmt.declared(), stmt.getArgument(), flags, - StmtContextUtils.getRootModuleQName(stmt.caerbannog()), substatements, - (AugmentationSchemaNode) stmt.original()); + return EffectiveStatements.createAugment(stmt.declared(), stmt.getArgument(), flags, + stmt.moduleName().getModule(), substatements, stmt.original(AugmentationSchemaNode.class)); } catch (SubstatementIndexingException e) { - throw new SourceException(e.getMessage(), stmt.sourceReference(), e); + throw new SourceException(e.getMessage(), stmt, e); } }