#if MODULE
public dynamic var public_global_var = "public_global_var"

public dynamic func public_global_func() -> String {
  return "public_global_func"
}

public dynamic func public_global_generic_func<T>(_ t: T.Type) -> String {
  return "public_global_generic_func"
}

public class PublicClass {
  public var str : String = ""
  public init() {}
  public dynamic init(x: Int) { str = "public_class_init" }

  public dynamic func function() -> String {
    return "public_class_func"
  }
  public dynamic final func finalFunction() -> String {
    return "public_class_final_func"
  }
  public dynamic func genericFunction<T>(_ t: T.Type) -> String {
    return "public_class_generic_func"
  }
}

public struct PublicStruct {
  public var str = ""
  public init() {}

  public dynamic init(x: Int) { str = "public_struct_init" }

  public dynamic func function() -> String {
    return "public_struct_func"
  }
  public dynamic func genericFunction<T>(_ t: T.Type) -> String {
    return "public_struct_generic_func"
  }
  public dynamic var public_stored_property : String = "public_stored_property"

  public dynamic subscript(_ x: Int) -> String {
    get {
      return "public_subscript_get"
    }
    set {
      str = newValue
    }
  }
  public dynamic subscript(y x: Int) -> String {
    _read {
      yield "public_subscript_get_modify_read"
    }
    _modify {
      yield &str
    }
  }
}

public enum PublicEnumeration<Q> {
  case A
  case B

  public dynamic func function() -> String {
    return "public_enum_func"
  }
  public dynamic func genericFunction<T>(_ t: T.Type) -> String {
    return "public_enum_generic_func"
  }
}
#elseif MODULENODYNAMIC
public dynamic var public_global_var = "public_global_var"

public func public_global_func() -> String {
  return "public_global_func"
}

public func public_global_generic_func<T>(_ t: T.Type) -> String {
  return "public_global_generic_func"
}

public class PublicClass {
  public var str : String = ""
  public init() {}
  public init(x: Int) { str = "public_class_init" }

  public func function() -> String {
    return "public_class_func"
  }

  public final func finalFunction() -> String {
    return "public_class_final_func"
  }

  public func genericFunction<T>(_ t: T.Type) -> String {
    return "public_class_generic_func"
  }
}

public struct PublicStruct {
  public var str = ""
  public init() {}

  public init(x: Int) { str = "public_struct_init" }

  public func function() -> String {
    return "public_struct_func"
  }
  public func genericFunction<T>(_ t: T.Type) -> String {
    return "public_struct_generic_func"
  }
  dynamic public var public_stored_property : String = "public_stored_property"

  public subscript(_ x: Int) -> String {
    get {
      return "public_subscript_get"
    }
    set {
      str = newValue
    }
  }
  public subscript(y x: Int) -> String {
    _read {
      yield "public_subscript_get_modify_read"
    }
    _modify {
      yield &str
    }
  }
}

public enum PublicEnumeration<Q> {
  case A
  case B

  public func function() -> String {
    return "public_enum_func"
  }
  public func genericFunction<T>(_ t: T.Type) -> String {
    return "public_enum_generic_func"
  }
}
#elseif MODULE2

import Module1

/// Public global functions, struct, class, and enum.

@_dynamicReplacement(for: public_global_var)
public var replacement_for_public_global_var : String {
  return "replacement of public_global_var"
}

@_dynamicReplacement(for: public_global_func())
public func replacement_for_public_global_func() -> String {
  return "replacement of " + public_global_func()
}

@_dynamicReplacement(for: public_global_generic_func(_:))
public func replacement_for_public_global_generic_func<T>(_ t: T.Type) -> String {
  return "replacement of " + public_global_generic_func(t)
}

extension PublicClass {
  @_dynamicReplacement(for: init(x:))
  public init(y: Int) {
    str = "replacement of public_class_init"
  }

  @_dynamicReplacement(for: function())
  public func replacement_function() -> String {
    return "replacement of " + function()
  }
  @_dynamicReplacement(for: finalFunction())
  public func replacement_finalFunction() -> String {
    return "replacement of " + finalFunction()
  }
  @_dynamicReplacement(for: genericFunction(_:))
  public func replacement_genericFunction<T>(_ t: T.Type) -> String {
    return "replacement of " + genericFunction(t)
  }
}

extension PublicStruct {
  @_dynamicReplacement(for: init(x:))
  public init(y: Int) {
    self.init(x: y)
    str = "replacement of public_struct_init"
  }

  @_dynamicReplacement(for: function())
  public func replacement_function() -> String {
    return "replacement of " + function()
  }
  @_dynamicReplacement(for: genericFunction(_:))
  public func replacement_genericFunction<T>(_ t: T.Type) -> String {
    return "replacement of " + genericFunction(t)
  }
  @_dynamicReplacement(for: public_stored_property)
  var replacement_public_stored_property : String {
    return "replacement of " + public_stored_property
  }
  @_dynamicReplacement(for: subscript(_:))
  subscript(x x: Int) -> String {
    get {
      return "replacement of " + self[x]
    }
    set {
      str = "replacement of " + newValue
    }
  }

  @_dynamicReplacement(for: subscript(y:))
  public subscript(z x: Int) -> String {
    _read {
      yield "replacement of " + self[y: x]
    }
    _modify {
      yield &str
      str = "replacement of " + str
    }
  }
}

extension PublicEnumeration {
  @_dynamicReplacement(for: function())
  public func replacement_function() -> String {
    return "replacement of " + function()
  }
  @_dynamicReplacement(for: genericFunction(_:))
  public func replacement_genericFunction<T>(_ t: T.Type) -> String {
    return "replacement of " + genericFunction(t)
  }
}
#endif
