// REQUIRES: objc_interop
// RUN: %empty-directory(%t.mod)
// RUN: %target-swift-frontend -emit-module -o %t.mod/Cities.swiftmodule %S/Inputs/Cities.swift -module-name Cities -parse-as-library
// RUN: %empty-directory(%t) && %target-swift-frontend -c -update-code -primary-file %s  -I %t.mod -api-diff-data-file %S/Inputs/string-representable.json -emit-migrated-file-path %t/string-representable.swift.result -disable-migrator-fixits -o /dev/null -F %S/mock-sdk
// RUN: diff -u %S/string-representable.swift.expected %t/string-representable.swift.result

import Cities
import Bar

func foo(_ c: Container) -> String {
  c.Value = convertToNewAttribute("")
  c.addingAttributes(convertToCitiesContainerAttributeDictionary(["a": "b", "a": "b", "a": "b"]))
  c.addingAttributes(convertToCitiesContainerAttributeDictionary(["a": "b", "a": "b", "a": "b"]))
  c.adding(attributes: convertToSimpleAttributeDictionary(["a": 1, "a": 2, "a": 3]))
  c.adding(optionalAttributes: convertToOptionalSimpleAttributeDictionary(["a": 1, "a": 2, "a": 3]))
  _ = Container(optionalAttributes: convertToOptionalSimpleAttributeDictionary([:]))
  _ = Container(optionalAttrArray: convertToOptionalSimpleAttributeArray([]))
  _ = Container(optionalAttributes: nil)
  _ = Container(optionalAttrArray: nil)
  c.adding(attrArray: convertToSimpleAttributeArray(["key1", "key2"]))
  c.add(single: convertToSimpleAttribute(""))
  c.add(singleOptional: convertToOptionalSimpleAttribute(""))
  c.add(singleOptional: nil)
  _ = convertFromSimpleAttributeDictionary(c.getAttrDictionary())
  _ = convertFromOptionalSimpleAttributeDictionary(c.getOptionalAttrDictionary())
  _ = convertFromSimpleAttribute(c.getSingleAttr())
  _ = convertFromOptionalSimpleAttribute(c.getOptionalSingleAttr())
  _ = convertFromSimpleAttributeArray(c.getAttrArray())
  _ = convertFromOptionalSimpleAttributeArray(c.getOptionalAttrArray())

  c.addingAttributes(c.getAttrDictionary())
  c.adding(optionalAttributes: c.getAttrDictionary())

  c.attrDict = convertToSimpleAttributeDictionary(["a": "b", "a": "b", "a": "b"])
  c.attrArr = convertToSimpleAttributeArray(["key1", "key2"])
  _ = convertFromSimpleAttributeArray(c.attrArr)
  _ = convertFromSimpleAttributeDictionary(c.attrDict)
  c.adding(attributes: c.attrDict)
  _ = Container(optionalAttrArray: c.attrArr)
  c.adding(optionalAttributes: c.optionalAttrDict)
  _ = convertFromNewAttribute(AttributeWrapper.NewAttribute)
  c.Value = AttributeWrapper.NewAttribute
  c.optionalAttrDict = nil
  return convertFromNewAttribute(c.Value)
}

class C: BarForwardDeclaredClass {}

func revert(_ a: AwesomeCityAttribute, b: Wrapper.Attribute) {
  _ = "somevalue"
  _ = "somevalue"
  _ = "somevalue"
  _ = "somevalue"
  _ = a
  _ = "somevalue"
  _ = "somevalue"
  _ = b
  _ = NewAttributeWrapper.NewKnownAttr
  _ = "somevalue"
  _ = "somevalue"
}


func bar(_ c: Container) {
  let attr: AliasAttribute = ""
  c.add(single: attr)
}

public class SubContainer: Container {
  public override func adding(optionalAttributes subname: [String: Any]?) {
// Local variable inserted by Swift 4.2 migrator.
let subname = convertFromOptionalSimpleAttributeDictionary(subname)
}
  public override func adding(attributes myname: [String: Any]) {
// Local variable inserted by Swift 4.2 migrator.
let myname = convertFromSimpleAttributeDictionary(myname)
}
  public override func adding(attrArray: [String]) {
// Local variable inserted by Swift 4.2 migrator.
let attrArray = convertFromSimpleAttributeArray(attrArray)
}
  public override func add(single: String) {
// Local variable inserted by Swift 4.2 migrator.
let single = convertFromSimpleAttribute(single)
}
  public override func add(singleOptional: String?) {
// Local variable inserted by Swift 4.2 migrator.
let singleOptional = convertFromOptionalSimpleAttribute(singleOptional)
}
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromOptionalSimpleAttributeDictionary(_ input: [SimpleAttribute: Any]?) -> [String: Any]? {
	guard let input = input else { return nil }
	return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromSimpleAttributeDictionary(_ input: [SimpleAttribute: Any]) -> [String: Any] {
	return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromSimpleAttributeArray(_ input: [SimpleAttribute]) -> [String] {
	return input.map { key in key.rawValue }
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromSimpleAttribute(_ input: SimpleAttribute) -> String {
	return input.rawValue
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromOptionalSimpleAttribute(_ input: SimpleAttribute?) -> String? {
	guard let input = input else { return nil }
	return input.rawValue
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToNewAttribute(_ input: String) -> NewAttribute {
	return NewAttribute(rawValue: input)
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToCitiesContainerAttributeDictionary(_ input: [String: Any]) -> [Cities.Container.Attribute: Any] {
	return Dictionary(uniqueKeysWithValues: input.map { key, value in (Cities.Container.Attribute(rawValue: key), value)})
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToSimpleAttributeDictionary(_ input: [String: Any]) -> [SimpleAttribute: Any] {
	return Dictionary(uniqueKeysWithValues: input.map { key, value in (SimpleAttribute(rawValue: key), value)})
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToOptionalSimpleAttributeDictionary(_ input: [String: Any]?) -> [SimpleAttribute: Any]? {
	guard let input = input else { return nil }
	return Dictionary(uniqueKeysWithValues: input.map { key, value in (SimpleAttribute(rawValue: key), value)})
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToOptionalSimpleAttributeArray(_ input: [String]?) -> [SimpleAttribute]? {
	guard let input = input else { return nil }
	return input.map { key in SimpleAttribute(key) }
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToSimpleAttributeArray(_ input: [String]) -> [SimpleAttribute] {
	return input.map { key in SimpleAttribute(key) }
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToSimpleAttribute(_ input: String) -> SimpleAttribute {
	return SimpleAttribute(rawValue: input)
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertToOptionalSimpleAttribute(_ input: String?) -> SimpleAttribute? {
	guard let input = input else { return nil }
	return SimpleAttribute(rawValue: input)
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromOptionalSimpleAttributeArray(_ input: [SimpleAttribute]?) -> [String]? {
	guard let input = input else { return nil }
	return input.map { key in key.rawValue }
}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromNewAttribute(_ input: NewAttribute) -> String {
	return input.rawValue
}
