// 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
* modules form a directed acyclic graph via the "imports" relation.
* That is, if Module A imports Module 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 known to this structure. The keys are
  // the |type_key|s.
  map<string, UserDefinedType> resolved_types;

  // All the resolved user-defined values known to this structure. The keys are
  // the |value_key|s.
  map<string, UserDefinedValue> resolved_values;
};

// A KeysByType struct organizes by type all of the type and constant keys known
// to an associated MojomFileGraph.
struct KeysByType {
  // All the type_keys known to the owning MojomFileGraph, organized by
  // type;
  array<string>? interfaces;
  array<string>? structs;
  array<string>? unions;
  array<string>? top_level_enums;
  array<string>? embedded_enums;

  // All the constant_keys known to the owning MojomFileGraph.
  array<string>? top_level_constants;
  array<string>? embedded_constants;
};