// Copyright (c) 2014, 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.

/**
 * Base functionality which code generated summary classes are built upon.
 */
library analyzer.src.summary.base;

/**
 * Annotation used in the summary IDL to indicate the id of a field.  The set
 * of ids used by a class must cover the contiguous range from 0 to N-1, where
 * N is the number of fields.
 *
 * In order to preserve forwards and backwards compatibility, id numbers must
 * be stable between releases.  So when new fields are added they should take
 * the next available id without renumbering other fields.
 */
class Id {
  final int value;

  const Id(this.value);
}

/**
 * Instances of this class represent data that has been read from a summary.
 */
abstract class SummaryClass {
  /**
   * Translate the data in this class into a JSON map, whose keys are the names
   * of fields and whose values are the data stored in those fields,
   * recursively converted into JSON.
   *
   * Fields containing their default value are elided.
   *
   * Intended for testing and debugging only.
   */
  Map<String, Object> toJson();

  /**
   * Translate the data in this class into a map whose keys are the names of
   * fields and whose values are the data stored in those fields.
   *
   * Intended for testing and debugging only.
   */
  Map<String, Object> toMap();
}

/**
 * Annotation used in the summary IDL to indicate that a summary class can be
 * the top level object in an encoded summary.
 */
class TopLevel {
  /**
   * If non-null, identifier that will be stored in bytes 4-7 of the file,
   * prior all other file data.  Must be exactly 4 Latin1 characters.
   */
  final String fileIdentifier;

  const TopLevel([this.fileIdentifier]);
}

/**
 * Annotation used in the summary IDL to indicate the field name that is used
 * to distinguish variants, or logical views on the same physical layout of
 * fields.
 */
class Variant {
  final String fieldName;

  const Variant(this.fieldName);
}

/**
 * Annotation used in the summary IDL to indicate the id of a field that
 * represents a logical field.  The set of ids used by a class must cover the
 * contiguous range from 0 to N-1, where N is the number of fields.  All logical
 * fields must have the same type, which will become the type of the actual
 * field.
 *
 * In order to preserve forwards and backwards compatibility, id numbers must
 * be stable between releases.  So when new fields are added they should take
 * the next available id without renumbering other fields.
 */
class VariantId {
  /// The ID of the actual field.
  final int value;

  /// The value of the variant field in [Variant].
  final Object variant;

  /// The list of variant values for which this field exists.
  final List<Object> variantList;

  const VariantId(this.value, {this.variant, this.variantList});
}
