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

library fasta.declaration;

import '../problems.dart' show unsupported;

abstract class Declaration {
  /// Used when multiple things with the same name are declared within the same
  /// parent. Only used for top-level and class-member declarations, not for
  /// block scopes.
  Declaration next;

  Declaration();

  Declaration get parent;

  Uri get fileUri;

  int get charOffset;

  get target => unsupported("${runtimeType}.target", charOffset, fileUri);

  Declaration get origin => this;

  String get fullNameForErrors;

  bool get hasProblem => false;

  bool get isConst => false;

  bool get isConstructor => false;

  bool get isFactory => false;

  bool get isField => false;

  bool get isFinal => false;

  bool get isGetter => false;

  bool get isInstanceMember => false;

  bool get isLocal => false;

  bool get isPatch => this != origin;

  bool get isRegularMethod => false;

  bool get isSetter => false;

  bool get isStatic => false;

  bool get isSynthetic => false;

  bool get isTopLevel => false;

  bool get isTypeDeclaration => false;

  bool get isTypeVariable => false;

  /// Applies [patch] to this declaration.
  void applyPatch(Declaration patch) {
    unsupported("${runtimeType}.applyPatch", charOffset, fileUri);
  }

  /// Returns the number of patches that was finished.
  int finishPatch() {
    if (!isPatch) return 0;
    unsupported("${runtimeType}.finishPatch", charOffset, fileUri);
    return 0;
  }

  /// Resolve constructors (lookup names in scope) recorded in this builder and
  /// return the number of constructors resolved.
  int resolveConstructors(covariant Declaration parent) => 0;

  void instrumentTopLevelInference(covariant instrumentation) {}
}
