Refactored uses statement handling in parser.
[yangtools.git] / code-generator / binding-generator-impl / src / main / java / org / opendaylight / yangtools / sal / binding / generator / impl / BindingGeneratorImpl.xtend
index 367d3b569779d125497b7768b2c56cfe118b1151..e20f99d2aab1f73bea3c4fa89b67b583e8ede56c 100644 (file)
@@ -244,7 +244,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
         if (node.augmenting || node.addedByUses) {
             return null
         }
-        val packageName = packageNameForGeneratedType(basePackageName, (node).path)
+        val packageName = packageNameForGeneratedType(basePackageName, node.path)
         val genType = addDefaultInterfaceDefinition(packageName, node, childOf)
         if (node instanceof DataNodeContainer) {
             genCtx.get(module).addChildNodeType(node.path, genType)
@@ -573,8 +573,12 @@ public class BindingGeneratorImpl implements BindingGenerator {
             val gto = new GeneratedTOBuilderImpl(returnTypePkgName, returnTypeName).toInstance();
             newType.setExtendsType(gto);
         }
-        newType.setAbstract(true);
-        genCtx.get(module).addIdentityType(newType)
+        newType.setAbstract(true);\r
+        val qname = identity.QName;\r
+        newType.addConstant(QName.typeForClass,"QNAME",'''\r
+            org.opendaylight.yangtools.yang.common.QName.create("«qname.namespace»","«qname.formattedRevision»","«qname.localName»")\r
+        ''');
+        genCtx.get(module).addIdentityType(identity.QName,newType)
     }
 
     /**\r
@@ -738,7 +742,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
                     "Failed to find target node from grouping for augmentation " + augSchema + " in module " +
                         module.name);
             }
-        }
+        }\r
 
         if (targetSchemaNode !== null) {
             var targetTypeBuilder = findChildNodeByPath(targetSchemaNode.path)
@@ -882,7 +886,10 @@ public class BindingGeneratorImpl implements BindingGenerator {
             } while (result == null && !(parent instanceof Module));
 
             if (result != null) {
-                if (tmpPath.size == 1) {
+                if (tmpPath.size == 1) {\r
+                    if (result != null && result.addedByUses) {\r
+                        result = findOriginal(result);\r
+                    }
                     return result;
                 } else {
                     var DataSchemaNode newParent = result;
@@ -890,6 +897,9 @@ public class BindingGeneratorImpl implements BindingGenerator {
                     tmpPath.remove(0);
                     for (name : tmpPath) {
                         newParent = (newParent as DataNodeContainer).getDataChildByName(name);
+                    }\r
+                    if (newParent != null && newParent.addedByUses) {\r
+                        newParent = findOriginal(newParent);\r
                     }
                     return newParent;
                 }
@@ -1139,12 +1149,14 @@ public class BindingGeneratorImpl implements BindingGenerator {
         checkArgument(basePackageName !== null, "Base Package Name cannot be NULL.");
         checkArgument(choiceNode !== null, "Choice Schema Node cannot be NULL.");
 
-        val packageName = packageNameForGeneratedType(basePackageName, choiceNode.path);
-        val choiceTypeBuilder = addRawInterfaceDefinition(packageName, choiceNode);
-        constructGetter(parent, choiceNode.QName.localName, choiceNode.description, choiceTypeBuilder);
-        choiceTypeBuilder.addImplementsType(DataContainer.typeForClass);
-        genCtx.get(module).addChildNodeType(choiceNode.path, choiceTypeBuilder)
-        generateTypesFromChoiceCases(module, basePackageName, parent, choiceTypeBuilder.toInstance, choiceNode);
+        if (!choiceNode.addedByUses) {
+            val packageName = packageNameForGeneratedType(basePackageName, choiceNode.path);
+            val choiceTypeBuilder = addRawInterfaceDefinition(packageName, choiceNode);
+            constructGetter(parent, choiceNode.QName.localName, choiceNode.description, choiceTypeBuilder);
+            choiceTypeBuilder.addImplementsType(DataContainer.typeForClass);
+            genCtx.get(module).addChildNodeType(choiceNode.path, choiceTypeBuilder)
+            generateTypesFromChoiceCases(module, basePackageName, parent, choiceTypeBuilder.toInstance, choiceNode);
+        }
     }
 
     /**\r
@@ -1485,8 +1497,28 @@ public class BindingGeneratorImpl implements BindingGenerator {
                 nodeDesc = "";
             }
             if (nodeName !== null && !node.isAddedByUses()) {
-                val TypeDefinition<?> type = node.type;
-                val listType = Types.listTypeFor(typeProvider.javaTypeForSchemaDefinitionType(type, node));
+                val TypeDefinition<?> typeDef = node.type;\r
+                val parentModule = findParentModule(schemaContext, node);\r
+\r
+                var Type returnType = null;\r
+                if (typeDef instanceof EnumTypeDefinition) {\r
+                    returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node);\r
+                    val enumTypeDef = typeDef as EnumTypeDefinition;\r
+                    val enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, nodeName, typeBuilder);\r
+                    returnType = new ReferencedTypeImpl(enumBuilder.packageName, enumBuilder.name);\r
+                    (typeProvider as TypeProviderImpl).putReferencedType(node.path, returnType);\r
+                } else if (typeDef instanceof UnionType) {\r
+                    val genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, nodeName, node, parentModule);\r
+                    returnType = new ReferencedTypeImpl(genTOBuilder.packageName, genTOBuilder.name);\r
+                } else if (typeDef instanceof BitsTypeDefinition) {\r
+                    val genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, nodeName, node, parentModule);\r
+                    returnType = new ReferencedTypeImpl(genTOBuilder.packageName, genTOBuilder.name);\r
+                } else {\r
+                    val Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);\r
+                    returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions);\r
+                }\r
+
+                val listType = Types.listTypeFor(returnType);
                 constructGetter(typeBuilder, nodeName, nodeDesc, listType);
                 return true;
             }
@@ -1786,7 +1818,7 @@ public class BindingGeneratorImpl implements BindingGenerator {
      * @return generated TO builder for <code>typeDef</code>\r
      */
     private def GeneratedTOBuilder addTOToTypeBuilder(TypeDefinition<?> typeDef, GeneratedTypeBuilder typeBuilder,
-        String leafName, LeafSchemaNode leaf, Module parentModule) {
+        String leafName, DataSchemaNode leaf, Module parentModule) {
         val classNameFromLeaf = parseToClassName(leafName);
         val List<GeneratedTOBuilder> genTOBuilders = new ArrayList();
         val packageName = typeBuilder.fullyQualifiedName;