///|
/// Compiler-compatible JSON cannot represent this extension target.
/// The error identifies the target and its definition or annotation location.
/// The AST is unchanged. Use the versioned extended interchange format instead.
pub(all) suberror ExportError {
  NonStandardTarget(target~ : Target, location~ : @span.SrcSpan)
} derive(Eq, Debug)

///|
fn check_target(
  target : Target,
  location : @span.SrcSpan,
) -> Unit raise ExportError {
  if target is Extension(_) {
    raise NonStandardTarget(target~, location~)
  }
}

///|
fn check_definition(definition : Definition) -> Unit raise ExportError {
  let externals = match definition {
    Function(f) => f.externals
    CustomType(t) => t.externals
    _ => ExternalBindings::empty()
  }
  for binding in externals.all() {
    check_target(binding.target, binding.external.location)
  }
}

///|
fn check_targeted_definition(
  definition : TargetedDefinition,
) -> Unit raise ExportError {
  if definition.target is Some(target) {
    check_target(target, definition.definition.location())
  }
  check_definition(definition.definition)
}

///|
fn check_module(module_ : Module) -> Unit raise ExportError {
  for definition in module_.definitions {
    check_targeted_definition(definition)
  }
}

///|
fn check_warning(warning : Warning) -> Unit raise ExportError {
  if warning is DeprecatedTargetShorthand(target~, location~) {
    check_target(target, location)
  }
}