// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

/**
 * This file contains a set of concrete classes representing an in-memory
 * semantic model of the IDL used to code generate summary serialization and
 * deserialization code.
 */
library analyzer.tool.summary.idl_model;

/**
 * Information about a single class defined in the IDL.
 */
class ClassDeclaration extends Declaration {
  /**
   * All fields defined in the class, including deprecated ones.
   */
  final List<FieldDeclaration> allFields = <FieldDeclaration>[];

  /**
   * Indicates whether the class has the `topLevel` annotation.
   */
  final bool isTopLevel;

  /**
   * If [isTopLevel] is `true` and a file identifier was specified for this
   * class, the file identifier string.  Otherwise `null`.
   */
  final String fileIdentifier;

  /**
   * Indicates whether the class has the `deprecated` annotation.
   */
  final bool isDeprecated;

  ClassDeclaration(String documentation, String name, this.isTopLevel,
      this.fileIdentifier, this.isDeprecated)
      : super(documentation, name);

  /**
   * Get the non-deprecated fields defined in the class.
   */
  Iterable<FieldDeclaration> get fields =>
      allFields.where((FieldDeclaration field) => !field.isDeprecated);
}

/**
 * Information about a declaration in the IDL.
 */
class Declaration {
  /**
   * The optional documentation, may be `null`.
   */
  final String documentation;

  /**
   * The name of the declaration.
   */
  final String name;

  Declaration(this.documentation, this.name);
}

/**
 * Information about a single enum defined in the IDL.
 */
class EnumDeclaration extends Declaration {
  /**
   * List of enumerated values.
   */
  final List<EnumValueDeclaration> values = <EnumValueDeclaration>[];

  EnumDeclaration(String documentation, String name)
      : super(documentation, name);
}

/**
 * Information about a single enum value defined in the IDL.
 */
class EnumValueDeclaration extends Declaration {
  EnumValueDeclaration(String documentation, String name)
      : super(documentation, name);
}

/**
 * Information about a single class field defined in the IDL.
 */
class FieldDeclaration extends Declaration {
  /**
   * The file of the field.
   */
  final FieldType type;

  /**
   * The id of the field.
   */
  final int id;

  /**
   * Indicates whether the field is deprecated.
   */
  final bool isDeprecated;

  /**
   * Indicates whether the field is informative.
   */
  final bool isInformative;

  FieldDeclaration(String documentation, String name, this.type, this.id,
      this.isDeprecated, this.isInformative)
      : super(documentation, name);
}

/**
 * Information about the type of a class field defined in the IDL.
 */
class FieldType {
  /**
   * Type of the field (e.g. 'int').
   */
  final String typeName;

  /**
   * Indicates whether this field contains a list of the type specified in
   * [typeName].
   */
  final bool isList;

  FieldType(this.typeName, this.isList);

  @override
  String toString() => isList ? 'List<$typeName>' : typeName;
}

/**
 * Top level representation of the summary IDL.
 */
class Idl {
  /**
   * Classes defined in the IDL.
   */
  final Map<String, ClassDeclaration> classes = <String, ClassDeclaration>{};

  /**
   * Enums defined in the IDL.
   */
  final Map<String, EnumDeclaration> enums = <String, EnumDeclaration>{};
}
