schema compile CHANGE make leafref targets implemented
When leafref path touches nodes from the modules which are not
implemented, make such modules implemented (similarly as augments do).
diff --git a/src/tree_schema_compile.c b/src/tree_schema_compile.c
index 612b183..73cecc9 100644
--- a/src/tree_schema_compile.c
+++ b/src/tree_schema_compile.c
@@ -2295,8 +2295,6 @@
assert(startnode);
assert(leafref);
- /* TODO leafref targets may be not implemented, in such a case we actually could make (we did it in libyang1) such a models implemented */
-
iter = 0;
id = leafref->path;
while(*id && (ret = lys_path_token(&id, &prefix, &prefix_len, &name, &name_len, &parent_times, &has_predicate)) == LY_SUCCESS) {
@@ -2324,6 +2322,10 @@
id - leafref->path, leafref->path);
return LY_EVALID;
}
+ if (!mod->implemented) {
+ /* make the module implemented */
+ ly_ctx_module_implement_internal(ctx->ctx, (struct lys_module*)mod, 2);
+ }
node = lys_child(parent, mod, name, name_len, 0, LYS_GETNEXT_NOSTATECHECK);
if (!node) {
diff --git a/tests/src/test_tree_schema_compile.c b/tests/src/test_tree_schema_compile.c
index 41a7d50..3f516f1 100644
--- a/tests/src/test_tree_schema_compile.c
+++ b/tests/src/test_tree_schema_compile.c
@@ -1752,6 +1752,20 @@
assert_non_null(((struct lysc_type_leafref*)type)->realtype);
assert_int_equal(LY_TYPE_STRING, ((struct lysc_type_leafref*)type)->realtype->basetype);
+ /* leafref to imported (not yet implemented) module */
+ ly_ctx_set_module_imp_clb(ctx, test_imp_clb, "module h {namespace urn:h;prefix h; leaf h {type uint16;}}");
+ assert_non_null(mod = lys_parse_mem(ctx, "module i {namespace urn:i;prefix i;import h {prefix h;}"
+ "leaf i {type leafref {path /h:h;}}}", LYS_IN_YANG));
+ type = ((struct lysc_node_leaf*)mod->compiled->data)->type;
+ assert_non_null(type);
+ assert_int_equal(LY_TYPE_LEAFREF, type->basetype);
+ assert_non_null(((struct lysc_type_leafref*)type)->realtype);
+ assert_int_equal(LY_TYPE_UINT16, ((struct lysc_type_leafref*)type)->realtype->basetype);
+ assert_non_null(mod = ly_ctx_get_module_implemented(ctx, "h"));
+ assert_int_equal(1, mod->implemented);
+ assert_non_null(mod->compiled->data);
+ assert_string_equal("h", mod->compiled->data->name);
+
/* invalid paths */
assert_null(lys_parse_mem(ctx, "module aa {namespace urn:aa;prefix aa;container a {leaf target2 {type uint8;}}"
"leaf ref1 {type leafref {path ../a/invalid;}}}", LYS_IN_YANG));