- 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);
+ if (extension != null) {
+ 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 {
+ throw new IllegalArgumentException("Not found unknown statement: " + name);
+ }
+ } 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)));
+ }
+
+ Preconditions.checkArgument(def != null, "Statement %s does not have type mapping defined.", name);
+ if (current == null) {
+ return createDeclaredRoot(def, ref);