- ContextBuilder<?, ?, ?> createDeclaredChild(StatementContextBase<?, ?, ?> current, QName name, StatementSourceReference ref) {
- StatementDefinitionContext<?,?,?> def = getDefinition(name);
- Preconditions.checkArgument(def != null, "Statement %s does not have type mapping defined.",name);
- if(current == null) {
- return createDeclaredRoot(def,ref);
+ ContextBuilder<?, ?, ?> createDeclaredChild(final StatementContextBase<?, ?, ?> current, final QName name,
+ final StatementSourceReference ref) {
+ StatementDefinitionContext<?, ?, ?> def = getDefinition(name);
+
+ if (def == null) {
+ // unknown-stmts (from import, include or local-scope)
+ if (qNameToStmtDefMap.get(name) != null) {
+ final StatementContextBase<?, ?, ?> extension =
+ (StatementContextBase<?, ?, ?>) currentContext.getAllFromNamespace(ExtensionNamespace.class).get(name);
+
+ SourceException.throwIfNull(extension, current.getStatementSourceReference(), "Extension %s not found",
+ name);
+
+ final QName arg = (QName) extension.getStatementArgument();
+ final QName qName = current.getFromNamespace(QNameCacheNamespace.class,
+ QName.create(arg, extension.getIdentifier().getArgument()));
+
+ def = new StatementDefinitionContext<>(new UnknownStatementImpl.Definition(
+ getNewStatementDefinition(qName)));
+ } else {
+ // type-body-stmts
+ def = resolveTypeBodyStmts(name.getLocalName());
+ }
+ } else if (current != null && current.definition().getRepresentingClass().equals(UnknownStatementImpl.class)) {
+ QName qName = Utils.qNameFromArgument(current, name.getLocalName());
+
+ def = new StatementDefinitionContext<>(new UnknownStatementImpl.Definition(
+ getNewStatementDefinition(qName)));