code: def generate_IR(self):
          
  
          raw_api = []
          for partial_ast in self._partial_asts:
              namespace_ast_node = self._extract_namespace_ast_node(partial_ast)
              namespace = self.api.ensure_namespace(namespace_ast_node.name)
              base_name = self._get_base_name(namespace.name, namespace.name)
              self._item_by_canonical_name[base_name] = namespace_ast_node
              if namespace_ast_node.doc is not None:
                  namespace.add_doc(namespace_ast_node.doc)
              raw_api.append((namespace, partial_ast))
              self._add_data_types_and_routes_to_api(namespace, partial_ast)
  
          self._add_imports_to_env(raw_api)
          self._merge_patches()
          self._populate_type_attributes()
          self._populate_field_defaults()
          self._populate_enumerated_subtypes()
          self._populate_route_attributes()
          self._populate_examples()
          self._validate_doc_refs()
          self._validate_annotations()
          if self._routes is not None:
              self._filter_namespaces_by_route_whitelist()
  
          self.api.normalize()
  
          return self.api
docs: Parses the text of each spec and returns an API description. Returns
          None if an error was encountered during parsing.