// Copyright 2015 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.

[DartPackage="mojo",
 JavaPackage="org.chromium.mojo.bindings.types"]
module mojo.bindings.types;

import "mojom_types.mojom";

/*
 * The structures in this file are intended to be used by the Mojom compiler
 * and code generators. The front end of the compiler takes as input a
 * .mojom file (or a list of .mojom files) and produces a MojomFileGraph struct.
 *
 * The backend of the compiler consumes a MojomFileGraph and invokes each of the
 * code generators passing them data derived from the MojomFileGraph.
 *
 * A MojomFile represents the data parsed from a single .mojom file. Mojom
 * files form a directed acyclic graph via the "imports" relation.
 * That is, if file A imports file B then there is a directed edge in the
 * graph from A to B. A MojomFileGraph represents the whole Graph.

 * The Mojom structures represented here have been fully resolved, meaning that
 * the type references have been associated with their corresponding type
 * definitions. This resolved type data is contained in the resolved_types data
 * in MojomFileGraph.
 */

// A MojomFile represents the data defined by a single .mojom file, when
// all of the type references to types declared in imported .mojom files
// have been resolved.
struct MojomFile {
  // |file_name| is (derived from) the file name of the corresponding
  // .mojom file. It is the unique identifier for this module within the
  // MojomFileGraph
  string file_name;

  // |specified_file_name| is used to record information about the request that
  // triggered the construction of the |MojomFileGraph| of which this
  // |MojomFile| is a part. This field is populated by some producers (such
  // as the Mojom compiler) but not necessarily all producers of this structure.
  // If this field is null it means it is not supported by the producer.
  //
  // If this field is non-null but empty it means that this |MojomFile|
  // was not explicitly requested but rather is included in the |MojomFileGraph|
  // because it is referenced in the |imports| field of another |MojomFile|
  // in the graph. If this field is non-empty it means that the corresponding
  // .mojom file was explicitly requested, using |specified_file_name|. Note
  // that in this case it is still possible that this file is also referenced
  // in the |imports| field of another |MojomFile|.
  string? specified_file_name;

  // The namespace is the identifier declared via the "module" declaration
  // in the .mojom file.
  string? module_namespace;

  // Attributes declared in the Mojom file at the module level.
  array<Attribute>? attributes;

  // The list of other MojomFiles imported by this one. The elements
  // of the array are the |file_name|s and the associated module may
  // be retrieved from the  MojomFileGraph.
  array<string>? imports;

  // resolved_types and resolved_values in MojomFileGraph contain
  // respectively the types and constants declared in the union of all modules
  // in the graph. This KeysByType selects the keys of the types and constants
  // defined in this module
  KeysByType declared_mojom_objects;

  // The bytes encoding a |RuntimeTypeInfo| struct for this Mojom file,
  // using Mojo message serialization. Some implementations may not include
  // this. This string contains the base64 encoding of the gzip-compressed
  // bytes.
  string? serialized_runtime_type_info;
};

// Represents a directed acyclic graph of MojomFiles.
struct MojomFileGraph {
  // All the files in this graph. The keys are |file_name|s.
  map<string, MojomFile> files;

  // All the resolved user-defined types in all the files in the graph. The keys are
  // the |type_key|s.
  map<string, UserDefinedType> resolved_types;

  // All the resolved DeclaredConstants in all the files in the graph. The keys are
  // the |constant_key|s.
  map<string, DeclaredConstant> resolved_constants;
};

// A KeysByType struct organizes by type the keys of all types and consants in
// a MojomFile
struct KeysByType {
  // The type keys of the types in the MojomFile.
  array<string>? interfaces;
  array<string>? structs;
  array<string>? unions;
  array<string>? top_level_enums;
  array<string>? embedded_enums;

  // The constant keys of the constants in the MojomFile.
  array<string>? top_level_constants;
  array<string>? embedded_constants;
};
