- public EffectiveStatement<QName,ExtensionStatement> createEffective(StmtContext<QName,ExtensionStatement,EffectiveStatement<QName,ExtensionStatement>> ctx) {
- return new ExtensionEffectiveStatementImpl(ctx);
+ public EffectiveStatement<QName,ExtensionStatement> createEffective(
+ final StmtContext<QName,ExtensionStatement, EffectiveStatement<QName,ExtensionStatement>> ctx) {
+ Set<StmtContext<?, ?, ?>> building = BUILDING.get();
+ if (building == null) {
+ building = new HashSet<>();
+ BUILDING.set(building);
+ }
+
+ SourceException.throwIf(building.contains(ctx), ctx.getStatementSourceReference(),
+ "Extension %s references itself", ctx.getStatementArgument());
+
+ building.add(ctx);
+ try {
+ return new ExtensionEffectiveStatementImpl(ctx);
+ } finally {
+ building.remove(ctx);
+ if (building.isEmpty()) {
+ BUILDING.remove();
+ }
+ }