# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

_typemap_imports = [
  "//ash/public/interfaces/typemaps.gni",
  "//cc/ipc/typemaps.gni",
  "//chrome/browser/media/router/mojo/typemaps.gni",
  "//chrome/common/extensions/typemaps.gni",
  "//chrome/common/importer/typemaps.gni",
  "//chrome/typemaps.gni",
  "//components/arc/common/typemaps.gni",
  "//components/metrics/public/cpp/typemaps.gni",
  "//components/typemaps.gni",
  "//content/common/bluetooth/typemaps.gni",
  "//content/common/indexed_db/typemaps.gni",
  "//content/common/presentation/typemaps.gni",
  "//content/common/typemaps.gni",
  "//content/public/common/typemaps.gni",
  "//device/bluetooth/public/interfaces/typemaps.gni",
  "//device/gamepad/public/interfaces/typemaps.gni",
  "//device/generic_sensor/public/interfaces/typemaps.gni",
  "//device/usb/public/interfaces/typemaps.gni",
  "//gpu/ipc/common/typemaps.gni",
  "//media/capture/mojo/typemaps.gni",
  "//media/mojo/interfaces/typemaps.gni",
  "//mojo/common/typemaps.gni",
  "//mojo/public/cpp/bindings/tests/chromium_typemaps.gni",
  "//net/interfaces/typemaps.gni",
  "//services/resource_coordinator/public/cpp/typemaps.gni",
  "//services/service_manager/public/cpp/typemaps.gni",
  "//services/ui/gpu/interfaces/typemaps.gni",
  "//services/ui/public/interfaces/ime/typemaps.gni",
  "//services/video_capture/public/interfaces/typemaps.gni",
  "//skia/public/interfaces/typemaps.gni",
  "//third_party/WebKit/public/public_typemaps.gni",
  "//ui/base/mojo/typemaps.gni",
  "//ui/display/mojo/typemaps.gni",
  "//ui/events/devices/mojo/typemaps.gni",
  "//ui/events/mojo/typemaps.gni",
  "//ui/gfx/typemaps.gni",
  "//ui/message_center/mojo/typemaps.gni",
  "//url/mojo/typemaps.gni",
]

_typemap_imports_mac = [ "//content/common/typemaps_mac.gni" ]

_typemaps = []
foreach(typemap_import, _typemap_imports) {
  # Avoid reassignment error by assigning to empty scope first.
  _imported = {
  }
  _imported = read_file(typemap_import, "scope")
  _typemaps += _imported.typemaps
}

typemaps = []
foreach(typemap, _typemaps) {
  typemaps += [ {
        filename = typemap
        config = read_file(typemap, "scope")
      } ]
}

_typemaps_mac = []
foreach(typemap_import, _typemap_imports_mac) {
  _imported = {
  }
  _imported = read_file(typemap_import, "scope")
  _typemaps_mac += _imported.typemaps
}

typemaps_mac = []
foreach(typemap, _typemaps_mac) {
  typemaps_mac += [ {
        filename = typemap
        config = read_file(typemap, "scope")
      } ]
}
