Fix code generation with leafrefs pointing to optional members
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / AbstractTypeObjectGenerator.java
index 3afca47a8ab44eb5877dcfbd09f0be696da75743..7a5849c36c7bfcc8f7b15da42e71a0ab38255e56 100644 (file)
@@ -372,11 +372,7 @@ abstract class AbstractTypeObjectGenerator<S extends EffectiveStatement<?, ?>, R
                 .map(context::resolveIdentity)
                 .collect(Collectors.toUnmodifiableList()));
         } else if (TypeDefinitions.LEAFREF.equals(arg)) {
-            final AbstractTypeObjectGenerator<?, ?> targetGenerator = context.resolveLeafref(
-                type.findFirstEffectiveSubstatementArgument(PathEffectiveStatement.class).orElseThrow());
-            checkArgument(targetGenerator != this, "Effective model contains self-referencing leaf %s",
-                statement().argument());
-            refType = TypeReference.leafRef(targetGenerator);
+            refType = resolveLeafref(context);
         } else if (TypeDefinitions.UNION.equals(arg)) {
             unionDependencies = new UnionDependencies(type, context);
             LOG.trace("Resolved union {} to dependencies {}", type, unionDependencies);
@@ -391,6 +387,20 @@ abstract class AbstractTypeObjectGenerator<S extends EffectiveStatement<?, ?>, R
         LOG.trace("Resolved derived {} to generator {}", type, refType);
     }
 
+    private @NonNull TypeReference resolveLeafref(final GeneratorContext context) {
+        final AbstractTypeObjectGenerator<?, ?> targetGenerator;
+        try {
+            targetGenerator = context.resolveLeafref(
+                type.findFirstEffectiveSubstatementArgument(PathEffectiveStatement.class).orElseThrow());
+        } catch (IllegalArgumentException e) {
+            return TypeReference.leafRef(e);
+        }
+
+        checkArgument(targetGenerator != this, "Effective model contains self-referencing leaf %s",
+            statement().argument());
+        return TypeReference.leafRef(targetGenerator);
+    }
+
     private static boolean isBuiltinName(final QName typeName) {
         return YangConstants.RFC6020_YANG_MODULE.equals(typeName.getModule());
     }