///|
fn wgsl_item_extraction_contains_requested_item(
  extraction : WgslModuleItemExtraction,
  requested_item : String,
) -> Bool {
  for origin in extraction.origins() {
    if origin.name() == requested_item {
      return true
    }
  }
  false
}

///|
fn wgsl_requested_items_contains(
  requested_items : Array[String],
  item_name : String,
) -> Bool {
  for requested_item in requested_items {
    if requested_item == item_name {
      return true
    }
  }
  false
}

///|
fn collect_wgsl_unqualified_live_module_items(
  declaration_names : Array[String],
  local_facts : WgslComposeSemanticFacts,
  reference_facts : WgslComposeSemanticFacts,
) -> Array[String] {
  let items : Array[String] = []
  for name in declaration_names {
    if local_facts.declares_name(name) {
      continue
    }
    let referenced = reference_facts.contains_unqualified_reference_name(name)
    if referenced {
      composer_string_list_push_unique(items, name)
    }
  }
  items
}

///|
fn wgsl_compose_semantic_facts_from_extraction(
  extraction : WgslModuleItemExtraction,
) -> WgslComposeSemanticFacts {
  let declarations : Array[String] = []
  let global_variables : Array[String] = []
  for declaration in extraction.declarations() {
    let name = declaration.name()
    if name != "" && !declarations.contains(name) {
      declarations.push(name)
    }
  }
  for origin in extraction.origins() {
    let name = origin.name()
    if origin.kind() == GlobalVariable &&
      name != "" &&
      !global_variables.contains(name) {
      global_variables.push(name)
    }
  }
  WgslComposeSemanticFacts(
    declarations,
    global_variables,
    extraction.references(),
  )
}

///|
fn record_wgsl_emitted_item_extraction_facts(
  session : WgslComposeSession,
  directive_source : String,
  extraction : WgslModuleItemExtraction?,
) -> Unit {
  match extraction {
    Some(value) => {
      let extraction_facts = wgsl_compose_semantic_facts_from_extraction(value)
      session.semantic_facts.set(directive_source, extraction_facts)
      session.record_semantic_reference_first_ranks(
        directive_source,
        value.references(),
      )
      let importless_source = drop_wgsl_import_directives_from_compose_source_cached(
        session, directive_source,
      )
      session.semantic_facts.set(importless_source, extraction_facts)
      session.record_semantic_reference_first_ranks(
        importless_source,
        value.references(),
      )
    }
    None => ()
  }
}