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

import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/ast/ast.dart' hide Directive;
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/resolver/scope.dart';
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
import 'package:analyzer/src/generated/java_engine.dart';
import 'package:analyzer/src/generated/source.dart';

/// Implementation of [CompilationUnitElement] that wraps a
/// [CompilationUnitElement] and defers all method calls to it.
///
/// This is intended to be used by the rare clients that must reimplement
/// [CompilationUnitElement], so that they won't be broken if new methods are
/// added.
class WrappedCompilationUnitElement implements CompilationUnitElement {
  final CompilationUnitElement wrappedUnit;

  WrappedCompilationUnitElement(this.wrappedUnit);

  @override
  List<PropertyAccessorElement> get accessors => wrappedUnit.accessors;

  @override
  AnalysisContext get context => wrappedUnit.context;

  @override
  String get displayName => wrappedUnit.displayName;

  @override
  String get documentationComment => wrappedUnit.documentationComment;

  @override
  LibraryElement get enclosingElement => wrappedUnit.enclosingElement;

  @override
  List<ClassElement> get enums => wrappedUnit.enums;

  @override
  List<FunctionElement> get functions => wrappedUnit.functions;

  @override
  List<FunctionTypeAliasElement> get functionTypeAliases =>
      wrappedUnit.functionTypeAliases;

  @override
  bool get hasAlwaysThrows => wrappedUnit.hasAlwaysThrows;

  @override
  bool get hasDeprecated => wrappedUnit.hasDeprecated;

  @override
  bool get hasFactory => wrappedUnit.hasFactory;

  @override
  bool get hasIsTest => wrappedUnit.hasIsTest;

  @override
  bool get hasIsTestGroup => wrappedUnit.hasIsTestGroup;

  @override
  bool get hasJS => wrappedUnit.hasJS;

  @override
  bool get hasLoadLibraryFunction => wrappedUnit.hasLoadLibraryFunction;

  @override
  bool get hasOverride => wrappedUnit.hasOverride;

  @override
  bool get hasProtected => wrappedUnit.hasProtected;

  @override
  bool get hasRequired => wrappedUnit.hasRequired;

  @override
  bool get hasSealed => wrappedUnit.hasSealed;

  @override
  bool get hasVisibleForTemplate => wrappedUnit.hasVisibleForTemplate;

  @override
  bool get hasVisibleForTesting => wrappedUnit.hasVisibleForTesting;

  @override
  int get id => wrappedUnit.id;

  @override
  bool get isAlwaysThrows => hasAlwaysThrows;

  @override
  bool get isDeprecated => hasDeprecated;

  @override
  bool get isFactory => hasFactory;

  @override
  bool get isJS => hasJS;

  @override
  bool get isOverride => hasOverride;

  @override
  bool get isPrivate => wrappedUnit.isPrivate;

  @override
  bool get isProtected => hasProtected;

  @override
  bool get isPublic => wrappedUnit.isPublic;

  @override
  bool get isRequired => hasRequired;

  @override
  bool get isSynthetic => wrappedUnit.isSynthetic;

  @override
  bool get isVisibleForTesting => hasVisibleForTesting;

  @override
  ElementKind get kind => wrappedUnit.kind;

  @override
  LibraryElement get library => wrappedUnit.library;

  @override
  Source get librarySource => wrappedUnit.librarySource;

  @override
  LineInfo get lineInfo => wrappedUnit.lineInfo;

  @override
  ElementLocation get location => wrappedUnit.location;

  @override
  List<ElementAnnotation> get metadata => wrappedUnit.metadata;

  @override
  List<ClassElement> get mixins => wrappedUnit.mixins;

  @override
  String get name => wrappedUnit.name;

  @override
  int get nameLength => wrappedUnit.nameLength;

  @override
  int get nameOffset => wrappedUnit.nameOffset;

  @override
  AnalysisSession get session => wrappedUnit.session;

  @override
  Source get source => wrappedUnit.source;

  @override
  List<TopLevelVariableElement> get topLevelVariables =>
      wrappedUnit.topLevelVariables;

  @override
  List<ClassElement> get types => wrappedUnit.types;

  @deprecated
  @override
  CompilationUnit get unit => wrappedUnit.unit;

  @override
  String get uri => wrappedUnit.uri;

  @override
  int get uriEnd => wrappedUnit.uriEnd;

  @override
  int get uriOffset => wrappedUnit.uriOffset;

  @override
  T accept<T>(ElementVisitor<T> visitor) => wrappedUnit.accept(visitor);

  @override
  String computeDocumentationComment() => wrappedUnit
      .computeDocumentationComment(); // ignore: deprecated_member_use

  @deprecated
  @override
  CompilationUnit computeNode() => wrappedUnit.computeNode();

  @override
  E getAncestor<E extends Element>(Predicate<Element> predicate) =>
      wrappedUnit.getAncestor(predicate);

  @override
  ClassElement getEnum(String name) => wrappedUnit.getEnum(name);

  @override
  String getExtendedDisplayName(String shortName) =>
      wrappedUnit.getExtendedDisplayName(shortName);

  @override
  ClassElement getType(String className) => wrappedUnit.getType(className);

  @override
  bool isAccessibleIn(LibraryElement library) =>
      wrappedUnit.isAccessibleIn(library);

  @override
  void visitChildren(ElementVisitor visitor) =>
      wrappedUnit.visitChildren(visitor);
}

/// Implementation of [ImportElement] that wraps an [ImportElement] and defers
/// all method calls to it.
///
/// This is intended to be used by the rare clients that must reimplement
/// [ImportElement], so that they won't be broken if new methods are added.
class WrappedImportElement implements ImportElement {
  final ImportElement wrappedImport;

  WrappedImportElement(this.wrappedImport);

  @override
  List<NamespaceCombinator> get combinators => wrappedImport.combinators;

  @override
  AnalysisContext get context => wrappedImport.context;

  @override
  String get displayName => wrappedImport.displayName;

  @override
  String get documentationComment => wrappedImport.documentationComment;

  @override
  LibraryElement get enclosingElement => wrappedImport.enclosingElement;

  @override
  bool get hasAlwaysThrows => wrappedImport.hasAlwaysThrows;

  @override
  bool get hasDeprecated => wrappedImport.hasDeprecated;

  @override
  bool get hasFactory => wrappedImport.hasFactory;

  @override
  bool get hasIsTest => wrappedImport.hasIsTest;

  @override
  bool get hasIsTestGroup => wrappedImport.hasIsTestGroup;

  @override
  bool get hasJS => wrappedImport.hasJS;

  @override
  bool get hasOverride => wrappedImport.hasOverride;

  @override
  bool get hasProtected => wrappedImport.hasProtected;

  @override
  bool get hasRequired => wrappedImport.hasRequired;

  @override
  bool get hasSealed => wrappedImport.hasSealed;

  @override
  bool get hasVisibleForTemplate => wrappedImport.hasVisibleForTemplate;

  @override
  bool get hasVisibleForTesting => wrappedImport.hasVisibleForTesting;

  @override
  int get id => wrappedImport.id;

  @override
  LibraryElement get importedLibrary => wrappedImport.importedLibrary;

  @override
  bool get isAlwaysThrows => hasAlwaysThrows;

  @override
  bool get isDeferred => wrappedImport.isDeferred;

  @override
  bool get isDeprecated => hasDeprecated;

  @override
  bool get isFactory => hasFactory;

  @override
  bool get isJS => hasJS;

  @override
  bool get isOverride => hasOverride;

  @override
  bool get isPrivate => wrappedImport.isPrivate;

  @override
  bool get isProtected => hasProtected;

  @override
  bool get isPublic => wrappedImport.isPublic;

  @override
  bool get isRequired => hasRequired;

  @override
  bool get isSynthetic => wrappedImport.isSynthetic;

  @override
  bool get isVisibleForTesting => hasVisibleForTesting;

  @override
  ElementKind get kind => wrappedImport.kind;

  @override
  LibraryElement get library => wrappedImport.library;

  @override
  Source get librarySource => wrappedImport.librarySource;

  @override
  ElementLocation get location => wrappedImport.location;

  @override
  List<ElementAnnotation> get metadata => wrappedImport.metadata;

  @override
  String get name => wrappedImport.name;

  @override
  int get nameLength => wrappedImport.nameLength;

  @override
  int get nameOffset => wrappedImport.nameOffset;

  @override
  Namespace get namespace => wrappedImport.namespace;

  @override
  PrefixElement get prefix => wrappedImport.prefix;

  @override
  int get prefixOffset => wrappedImport.prefixOffset;

  @override
  AnalysisSession get session => wrappedImport.session;

  @override
  Source get source => wrappedImport.source;

  @deprecated
  @override
  CompilationUnit get unit => wrappedImport.unit;

  @override
  String get uri => wrappedImport.uri;

  @override
  int get uriEnd => wrappedImport.uriEnd;

  @override
  int get uriOffset => wrappedImport.uriOffset;

  @override
  T accept<T>(ElementVisitor<T> visitor) => wrappedImport.accept(visitor);

  @override
  String computeDocumentationComment() => wrappedImport
      .computeDocumentationComment(); // ignore: deprecated_member_use

  @deprecated
  @override
  AstNode computeNode() => wrappedImport.computeNode();

  @override
  E getAncestor<E extends Element>(Predicate<Element> predicate) =>
      wrappedImport.getAncestor(predicate);

  @override
  String getExtendedDisplayName(String shortName) =>
      wrappedImport.getExtendedDisplayName(shortName);

  @override
  bool isAccessibleIn(LibraryElement library) =>
      wrappedImport.isAccessibleIn(library);

  @override
  void visitChildren(ElementVisitor visitor) =>
      wrappedImport.visitChildren(visitor);
}

/// Implementation of [LibraryElement] that wraps a [LibraryElement] and defers
/// all method calls to it.
///
/// This is intended to be used by the rare clients that must reimplement
/// [LibraryElement], so that they won't be broken if new methods are added.
class WrappedLibraryElement implements LibraryElement {
  final LibraryElement wrappedLib;

  WrappedLibraryElement(this.wrappedLib);

  @override
  AnalysisContext get context => wrappedLib.context;

  @override
  CompilationUnitElement get definingCompilationUnit =>
      wrappedLib.definingCompilationUnit;

  @override
  String get displayName => wrappedLib.displayName;

  @override
  String get documentationComment => wrappedLib.documentationComment;

  @override
  Element get enclosingElement => wrappedLib.enclosingElement;

  @override
  FunctionElement get entryPoint => wrappedLib.entryPoint;

  @override
  List<LibraryElement> get exportedLibraries => wrappedLib.exportedLibraries;

  @override
  Namespace get exportNamespace => wrappedLib.exportNamespace;

  @override
  List<ExportElement> get exports => wrappedLib.exports;

  @override
  bool get hasAlwaysThrows => wrappedLib.hasAlwaysThrows;

  @override
  bool get hasDeprecated => wrappedLib.hasDeprecated;

  @override
  bool get hasExtUri => wrappedLib.hasExtUri;

  @override
  bool get hasFactory => wrappedLib.hasFactory;

  @override
  bool get hasIsTest => wrappedLib.hasIsTest;

  @override
  bool get hasIsTestGroup => wrappedLib.hasIsTestGroup;

  @override
  bool get hasJS => wrappedLib.hasJS;

  @override
  bool get hasLoadLibraryFunction => wrappedLib.hasLoadLibraryFunction;

  @override
  bool get hasOverride => wrappedLib.hasOverride;

  @override
  bool get hasProtected => wrappedLib.hasProtected;

  @override
  bool get hasRequired => wrappedLib.hasRequired;

  @override
  bool get hasSealed => wrappedLib.hasSealed;

  @override
  bool get hasVisibleForTemplate => wrappedLib.hasVisibleForTemplate;

  @override
  bool get hasVisibleForTesting => wrappedLib.hasVisibleForTesting;

  @override
  int get id => wrappedLib.id;

  @override
  String get identifier => wrappedLib.identifier;

  @override
  List<LibraryElement> get importedLibraries => wrappedLib.importedLibraries;

  @override
  List<ImportElement> get imports => wrappedLib.imports;

  @override
  bool get isAlwaysThrows => hasAlwaysThrows;

  @override
  bool get isBrowserApplication => wrappedLib.isBrowserApplication;

  @override
  bool get isDartAsync => wrappedLib.isDartAsync;

  @override
  bool get isDartCore => wrappedLib.isDartCore;

  @override
  bool get isDeprecated => hasDeprecated;

  @override
  bool get isFactory => hasFactory;

  @override
  bool get isInSdk => wrappedLib.isInSdk;

  @override
  bool get isJS => hasJS;

  @override
  bool get isOverride => hasOverride;

  @override
  bool get isPrivate => wrappedLib.isPrivate;

  @override
  bool get isProtected => hasProtected;

  @override
  bool get isPublic => wrappedLib.isPublic;

  @override
  bool get isRequired => hasRequired;

  @override
  bool get isSynthetic => wrappedLib.isSynthetic;

  @override
  bool get isVisibleForTesting => hasVisibleForTesting;

  @override
  ElementKind get kind => wrappedLib.kind;

  @override
  LibraryElement get library => wrappedLib.library;

  @override
  List<LibraryElement> get libraryCycle => wrappedLib.libraryCycle;

  @override
  Source get librarySource => wrappedLib.librarySource;

  @override
  FunctionElement get loadLibraryFunction => wrappedLib.loadLibraryFunction;

  @override
  ElementLocation get location => wrappedLib.location;

  @override
  List<ElementAnnotation> get metadata => wrappedLib.metadata;

  @override
  String get name => wrappedLib.name;

  @override
  int get nameLength => wrappedLib.nameLength;

  @override
  int get nameOffset => wrappedLib.nameOffset;

  @override
  List<CompilationUnitElement> get parts => wrappedLib.parts;

  @override
  List<PrefixElement> get prefixes => wrappedLib.prefixes;

  @override
  Namespace get publicNamespace => wrappedLib.publicNamespace;

  @override
  AnalysisSession get session => wrappedLib.session;

  @override
  Source get source => wrappedLib.source;

  @override
  Iterable<Element> get topLevelElements => wrappedLib.topLevelElements;

  @deprecated
  @override
  CompilationUnit get unit => wrappedLib.unit;

  @override
  List<CompilationUnitElement> get units => wrappedLib.units;

  @override
  T accept<T>(ElementVisitor<T> visitor) => wrappedLib.accept(visitor);

  @override
  String computeDocumentationComment() =>
      wrappedLib.computeDocumentationComment(); // ignore: deprecated_member_use

  @deprecated
  @override
  AstNode computeNode() => wrappedLib.computeNode();

  @override
  E getAncestor<E extends Element>(Predicate<Element> predicate) =>
      wrappedLib.getAncestor(predicate);

  @override
  String getExtendedDisplayName(String shortName) =>
      wrappedLib.getExtendedDisplayName(shortName);

  @override
  List<ImportElement> getImportsWithPrefix(PrefixElement prefix) =>
      wrappedLib.getImportsWithPrefix(prefix);

  @override
  ClassElement getType(String className) => wrappedLib.getType(className);

  @override
  bool isAccessibleIn(LibraryElement library) =>
      wrappedLib.isAccessibleIn(library);

  @override
  void visitChildren(ElementVisitor visitor) =>
      wrappedLib.visitChildren(visitor);
}
