Add wrapped versions of element classes.
These new classes are in lib/src to discourage them from being widely
used. The intention is to use them in angular_analyzer_plugin, so
that it can extend the wrapper classes rather than implement the
element classes directly. This will ensure that
angular_analyzer_plugin doesn't break when new methods are added to
element classes.
Change-Id: I33d82e4534691f546fcabc7b9d6c1da0258a5fc0
Reviewed-on: https://dart-review.googlesource.com/70020
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Mike Fairhurst <mfairhurst@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/dart/element/wrapped.dart b/pkg/analyzer/lib/src/dart/element/wrapped.dart
new file mode 100644
index 0000000..88291aa
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/element/wrapped.dart
@@ -0,0 +1,591 @@
+// 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/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 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
+ String get name => wrappedUnit.name;
+
+ @override
+ int get nameLength => wrappedUnit.nameLength;
+
+ @override
+ int get nameOffset => wrappedUnit.nameOffset;
+
+ @override
+ Source get source => wrappedUnit.source;
+
+ @override
+ List<TopLevelVariableElement> get topLevelVariables =>
+ wrappedUnit.topLevelVariables;
+
+ @override
+ List<ClassElement> get types => wrappedUnit.types;
+
+ @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
+
+ @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 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
+ Source get source => wrappedImport.source;
+
+ @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
+
+ @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 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
+ Source get source => wrappedLib.source;
+
+ @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
+
+ @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);
+}