Use ExportDirectiveState to build LibraryElement.exports2, add ExportElement2.

Change-Id: I29242bb6f9514eccc93b1bef207ecd5b1e558571
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/251143
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2022-07-13 01:48:34 +00:00 committed by Commit Bot
parent 7a33665af5
commit 210536e46f
37 changed files with 643 additions and 428 deletions

View file

@ -58,7 +58,7 @@ class AstWriter extends UnifyingAstVisitor with TreeWriter {
properties['element'] = node.declaredElement;
properties['keyword'] = node.keyword;
} else if (node is ExportDirective) {
properties['element'] = node.element;
properties['element'] = node.element2;
properties['selectedSource'] = node.selectedSource;
properties['uriSource'] = node.uriSource;
} else if (node is FieldDeclaration) {

View file

@ -82,9 +82,9 @@ class ElementWriter extends GeneralizingElementVisitor with TreeWriter {
properties['returnType'] = element.returnType;
properties['type'] = element.type;
}
if (element is ExportElement) {
if (element is ExportElement2) {
properties['combinators'] = element.combinators;
properties['library'] = element.library;
properties['library'] = element.exportedLibrary;
}
if (element is FieldElement) {
properties['isEnumConstant'] = element.isEnumConstant;
@ -102,7 +102,7 @@ class ElementWriter extends GeneralizingElementVisitor with TreeWriter {
if (element is ImportElement2) {
properties['combinators'] = element.combinators;
properties['isDeferred'] = element.prefix is DeferredImportElementPrefix;
properties['library'] = element.library;
properties['library'] = element.importedLibrary;
}
if (element is LibraryElement) {
properties['definingCompilationUnit'] = element.definingCompilationUnit;

View file

@ -1703,9 +1703,14 @@ abstract class EnumDeclaration implements NamedCompilationUnitMember {
///
/// Clients may not extend, implement or mix-in this class.
abstract class ExportDirective implements NamespaceDirective {
@Deprecated('Use element2 instead')
@override
ExportElement? get element;
/// Return the element associated with this directive, or `null` if the AST
/// structure has not been resolved.
ExportElement2? get element2;
/// The token representing the 'export' keyword.
Token get exportKeyword;
}

View file

@ -1092,8 +1092,11 @@ abstract class ElementVisitor<R> {
R? visitConstructorElement(ConstructorElement element);
@Deprecated('Override visitExportElement2() instead')
R? visitExportElement(ExportElement element);
R? visitExportElement2(ExportElement2 element);
R? visitExtensionElement(ExtensionElement element);
R? visitFieldElement(FieldElement element);
@ -1194,6 +1197,7 @@ abstract class ExecutableElement implements FunctionTypedElement {
/// An export directive within a library.
///
/// Clients may not extend, implement or mix-in this class.
@Deprecated('Use ExportElement2 instead')
abstract class ExportElement implements UriReferencedElement {
/// Return a list containing the combinators that were specified as part of
/// the export directive in the order in which they were specified.
@ -1204,6 +1208,24 @@ abstract class ExportElement implements UriReferencedElement {
LibraryElement? get exportedLibrary;
}
/// A single export directive within a library.
///
/// Clients may not extend, implement or mix-in this class.
abstract class ExportElement2 implements _ExistingElement {
/// Return a list containing the combinators that were specified as part of
/// the export directive in the order in which they were specified.
List<NamespaceCombinator> get combinators;
/// Returns the [LibraryElement], if [uri] is a [DirectiveUriWithLibrary].
LibraryElement? get exportedLibrary;
/// The offset of the `export` keyword.
int get exportKeywordOffset;
/// The interpretation of the URI specified in the directive.
DirectiveUri get uri;
}
/// An element that represents an extension.
///
/// Clients may not extend, implement or mix-in this class.
@ -1549,8 +1571,12 @@ abstract class LibraryOrAugmentationElement implements Element {
CompilationUnitElement get definingCompilationUnit;
/// Return a list containing all of the exports defined in this library.
@Deprecated('Use exports2 instead')
List<ExportElement> get exports;
/// Return a list containing all of the exports defined in this library.
List<ExportElement2> get exports2;
/// The set of features available to this library.
///
/// Determined by the combination of the language version for the enclosing

View file

@ -104,9 +104,13 @@ class GeneralizingElementVisitor<R> implements ElementVisitor<R> {
R? visitExecutableElement(ExecutableElement element) => visitElement(element);
@Deprecated('Override visitExportElement2() instead')
@override
R? visitExportElement(ExportElement element) => visitElement(element);
@override
R? visitExportElement2(ExportElement2 element) => visitElement(element);
@override
R? visitExtensionElement(ExtensionElement element) => visitElement(element);
@ -240,12 +244,19 @@ class RecursiveElementVisitor<R> implements ElementVisitor<R> {
return null;
}
@Deprecated('Override visitExportElement2() instead')
@override
R? visitExportElement(ExportElement element) {
element.visitChildren(this);
return null;
}
@override
R? visitExportElement2(ExportElement2 element) {
element.visitChildren(this);
return null;
}
@override
R? visitExtensionElement(ExtensionElement element) {
element.visitChildren(this);
@ -396,9 +407,13 @@ class SimpleElementVisitor<R> implements ElementVisitor<R> {
@override
R? visitConstructorElement(ConstructorElement element) => null;
@Deprecated('Override visitExportElement2() instead')
@override
R? visitExportElement(ExportElement element) => null;
@override
R? visitExportElement2(ExportElement2 element) => null;
@override
R? visitExtensionElement(ExtensionElement element) => null;
@ -493,9 +508,13 @@ class ThrowingElementVisitor<R> implements ElementVisitor<R> {
@override
R? visitConstructorElement(ConstructorElement element) => _throw(element);
@Deprecated('Override visitExportElement2() instead')
@override
R? visitExportElement(ExportElement element) => _throw(element);
@override
R? visitExportElement2(ExportElement2 element) => _throw(element);
@override
R? visitExtensionElement(ExtensionElement element) => _throw(element);

View file

@ -1125,6 +1125,7 @@ class FileState {
return UnlinkedExportDirective(
combinators: _serializeCombinators(node.combinators),
configurations: _serializeConfigurations(node.configurations),
exportKeywordOffset: node.exportKeyword.offset,
uri: node.uri.stringValue,
);
}

View file

@ -687,7 +687,7 @@ class _IndexContributor extends GeneralizingAstVisitor {
@override
void visitExportDirective(ExportDirective node) {
ExportElement? element = node.element;
final element = node.element2;
recordUriReference(element?.exportedLibrary, node.uri);
super.visitExportDirective(node);
}

View file

@ -590,7 +590,7 @@ class LibraryAnalyzer {
} else if (directive is ExportDirectiveImpl) {
_resolveExportDirective(
directive: directive,
exportElement: _libraryElement.exports[exportIndex],
exportElement: _libraryElement.exports2[exportIndex],
exportState: _library.exports[exportIndex],
libraryErrorReporter: libraryErrorReporter,
);
@ -621,7 +621,7 @@ class LibraryAnalyzer {
void _resolveExportDirective({
required ExportDirectiveImpl directive,
required ExportElement exportElement,
required ExportElement2 exportElement,
required ExportDirectiveState exportState,
required ErrorReporter libraryErrorReporter,
}) {

View file

@ -122,9 +122,12 @@ class UnlinkedCombinator {
/// Unlinked information about an `export` directive.
class UnlinkedExportDirective extends UnlinkedNamespaceDirective {
final int exportKeywordOffset;
UnlinkedExportDirective({
required super.combinators,
required super.configurations,
required this.exportKeywordOffset,
required super.uri,
});
@ -136,6 +139,7 @@ class UnlinkedExportDirective extends UnlinkedNamespaceDirective {
configurations: reader.readTypedList(
() => UnlinkedNamespaceDirectiveConfiguration.read(reader),
),
exportKeywordOffset: reader.readUInt30(),
uri: reader.readOptionalStringUtf8(),
);
}
@ -151,6 +155,7 @@ class UnlinkedExportDirective extends UnlinkedNamespaceDirective {
x.write(sink);
},
);
sink.writeUInt30(exportKeywordOffset);
sink.writeOptionalStringUtf8(uri);
}
}

View file

@ -3782,8 +3782,18 @@ class ExportDirectiveImpl extends NamespaceDirectiveImpl
super.combinators,
super.semicolon);
@Deprecated('Use element2 instead')
@override
ExportElement? get element => super.element as ExportElement?;
ExportElement? get element {
final element2 = this.element2;
if (element2 is ExportElement2Impl) {
return ExportElementImpl(element2);
}
return null;
}
@override
ExportElement2? get element2 => super.element as ExportElement2?;
@override
Token get firstTokenAfterCommentAndMetadata => exportKeyword;
@ -3794,7 +3804,7 @@ class ExportDirectiveImpl extends NamespaceDirectiveImpl
@override
LibraryElement? get uriElement {
return element?.exportedLibrary;
return element2?.exportedLibrary;
}
@override
@ -6425,7 +6435,7 @@ class ImportDirectiveImpl extends NamespaceDirectiveImpl
@override
ImportElement? get element {
final element2 = this.element2;
if (element2 != null) {
if (element2 is ImportElement2Impl) {
return ImportElementImpl(element2);
}
return null;

View file

@ -65,7 +65,7 @@ class _ElementMapper extends GeneralizingAstVisitor<Element> {
@override
Element? visitExportDirective(ExportDirective node) {
return node.element;
return node.element2;
}
@override

View file

@ -94,9 +94,9 @@ class ElementDisplayStringBuilder {
}
}
void writeExportElement(ExportElementImpl element) {
void writeExportElement(ExportElement2Impl element) {
_write('export ');
(element.exportedLibrary as LibraryElementImpl).appendTo(this);
_writeDirectiveUri(element.uri);
}
void writeExtensionElement(ExtensionElementImpl element) {

View file

@ -3119,17 +3119,65 @@ abstract class ExecutableElementImpl extends _ExistingElementImpl
}
}
/// A concrete implementation of an [ExportElement].
class ExportElementImpl extends UriReferencedElementImpl
implements ExportElement {
@override
LibraryElement? exportedLibrary;
class ExportElement2Impl extends _ExistingElementImpl
implements ExportElement2 {
@override
List<NamespaceCombinator> combinators = const [];
/// Initialize a newly created export element at the given [offset].
ExportElementImpl(int offset) : super(null, offset);
@override
final int exportKeywordOffset;
@override
final DirectiveUri uri;
ExportElement2Impl({
required this.exportKeywordOffset,
required this.uri,
}) : super(null, exportKeywordOffset);
@override
LibraryElement? get exportedLibrary {
final uri = this.uri;
if (uri is DirectiveUriWithLibrary) {
return uri.library;
}
return null;
}
@override
int get hashCode => identityHashCode(this);
@override
ElementKind get kind => ElementKind.EXPORT;
@override
bool operator ==(Object other) {
return identical(this, other);
}
@override
T? accept<T>(ElementVisitor<T> visitor) {
return visitor.visitExportElement2(this);
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExportElement(this);
}
}
/// A concrete implementation of an [ExportElement].
@Deprecated('Use ExportElement2 instead')
class ExportElementImpl extends ElementImpl
with WrapperElementImpl
implements ExportElement {
@override
final ExportElement2Impl base;
ExportElementImpl(this.base) : super(base.name, base.nameOffset);
@override
List<NamespaceCombinator> get combinators => base.combinators;
@override
CompilationUnitElementImpl get enclosingUnit {
@ -3138,18 +3186,40 @@ class ExportElementImpl extends UriReferencedElementImpl
}
@override
String get identifier => exportedLibrary!.name;
LibraryElement? get exportedLibrary {
final uri = base.uri;
if (uri is DirectiveUriWithLibrary) {
return uri.library;
}
return null;
}
@override
String get identifier => 'export@$nameOffset';
@override
ElementKind get kind => ElementKind.EXPORT;
@override
T? accept<T>(ElementVisitor<T> visitor) => visitor.visitExportElement(this);
String? get uri {
final uri = base.uri;
if (uri is DirectiveUriWithRelativeUriString) {
return uri.relativeUriString;
} else {
return null;
}
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExportElement(this);
}
// TODO: implement uriEnd
int get uriEnd => throw UnimplementedError();
@override
// TODO: implement uriOffset
int get uriOffset => throw UnimplementedError();
@override
T? accept<T>(ElementVisitor<T> visitor) => visitor.visitExportElement(this);
}
/// A concrete implementation of an [ExtensionElement].
@ -3693,8 +3763,11 @@ class ImportElement2Impl extends _ExistingElementImpl
/// A concrete implementation of an [ImportElement].
@Deprecated('Use ImportElement2 instead')
class ImportElementImpl extends ElementImpl implements ImportElement {
final ImportElement2 base;
class ImportElementImpl extends ElementImpl
with WrapperElementImpl
implements ImportElement {
@override
final ImportElement2Impl base;
ImportElementImpl(this.base) : super(base.name, base.nameOffset);
@ -3702,82 +3775,10 @@ class ImportElementImpl extends ElementImpl implements ImportElement {
List<NamespaceCombinator> get combinators => base.combinators;
@override
AnalysisContext get context => base.context;
@override
Element get declaration => base.declaration;
@override
String get displayName => base.displayName;
@override
String? get documentationComment => base.documentationComment;
@override
Element? get enclosingElement => base.enclosingElement;
@override
bool get hasAlwaysThrows => base.hasAlwaysThrows;
@override
bool get hasDeprecated => base.hasDeprecated;
@override
bool get hasDoNotStore => base.hasDoNotStore;
@override
bool get hasFactory => base.hasFactory;
@override
bool get hasInternal => base.hasInternal;
@override
bool get hasIsTest => base.hasIsTest;
@override
bool get hasIsTestGroup => base.hasIsTestGroup;
@override
bool get hasJS => base.hasJS;
@override
bool get hasLiteral => base.hasLiteral;
@override
bool get hasMustCallSuper => base.hasMustCallSuper;
@override
bool get hasNonVirtual => base.hasNonVirtual;
@override
bool get hasOptionalTypeArgs => base.hasOptionalTypeArgs;
@override
bool get hasOverride => base.hasOverride;
@override
bool get hasProtected => base.hasProtected;
@override
bool get hasRequired => base.hasRequired;
@override
bool get hasSealed => base.hasSealed;
@override
bool get hasUseResult => base.hasUseResult;
@override
bool get hasVisibleForOverriding => base.hasVisibleForOverriding;
@override
bool get hasVisibleForTemplate => base.hasVisibleForTemplate;
@override
bool get hasVisibleForTesting => base.hasVisibleForTesting;
@override
int get id => base.id;
CompilationUnitElementImpl get enclosingUnit {
var enclosingLibrary = enclosingElement as LibraryElementImpl;
return enclosingLibrary._definingCompilationUnit;
}
@override
String get identifier => 'import@$nameOffset';
@ -3794,54 +3795,12 @@ class ImportElementImpl extends ElementImpl implements ImportElement {
@override
bool get isDeferred => base.prefix is DeferredImportElementPrefix;
@override
bool get isPrivate => base.isPrivate;
@override
bool get isPublic => base.isPublic;
@override
bool get isSynthetic => base.isSynthetic;
@override
ElementKind get kind => base.kind;
@override
LibraryElementImpl get library => base.library as LibraryElementImpl;
@override
Source get librarySource => base.librarySource;
@override
ElementLocation get location => base.location!;
@override
List<ElementAnnotation> get metadata => base.metadata;
@override
String? get name => base.name;
@override
int get nameLength => base.nameLength;
@override
int get nameOffset => base.nameOffset;
@override
Namespace get namespace => base.namespace;
@override
Element get nonSynthetic => this;
@override
PrefixElement? get prefix => base.prefix?.element;
@override
AnalysisSession? get session => base.session;
@override
Source get source => base.source;
@override
String? get uri {
final uri = base.uri;
@ -3869,47 +3828,6 @@ class ImportElementImpl extends ElementImpl implements ImportElement {
T? accept<T>(ElementVisitor<T> visitor) {
return visitor.visitImportElement(this);
}
@override
String getDisplayString(
{required bool withNullability, bool multiline = false}) {
return base.getDisplayString(
withNullability: withNullability,
multiline: multiline,
);
}
@override
String getExtendedDisplayName(String? shortName) {
return base.getExtendedDisplayName(shortName);
}
@Deprecated('Use isAccessibleIn2() instead')
@override
bool isAccessibleIn(LibraryElement? library) {
return base.isAccessibleIn(library);
}
@override
bool isAccessibleIn2(LibraryElement library) {
return base.isAccessibleIn2(library);
}
@override
E thisOrAncestorMatching<E extends Element>(
bool Function(Element p1) predicate) {
return base.thisOrAncestorMatching(predicate) as E;
}
@override
E? thisOrAncestorOfType<E extends Element>() {
return base.thisOrAncestorOfType();
}
@override
void visitChildren(ElementVisitor visitor) {
base.visitChildren(visitor);
}
}
class ImportElementPrefixImpl implements ImportElementPrefix {
@ -3978,6 +3896,10 @@ class LibraryAugmentationElementImpl extends LibraryOrAugmentationElementImpl
// TODO: implement accessibleExtensions
List<ExtensionElement> get accessibleExtensions => throw UnimplementedError();
@override
// TODO: implement exports2
List<ExportElement2> get exports2 => throw UnimplementedError();
@override
FeatureSet get featureSet => augmented.featureSet;
@ -4098,14 +4020,11 @@ class LibraryElementImpl extends LibraryOrAugmentationElementImpl
@override
List<LibraryElement> get exportedLibraries {
HashSet<LibraryElement> libraries = HashSet<LibraryElement>();
for (ExportElement element in exports) {
var library = element.exportedLibrary;
if (library != null) {
libraries.add(library);
}
}
return libraries.toList(growable: false);
return exports2
.map((import) => import.exportedLibrary)
.whereNotNull()
.toSet()
.toList();
}
@override
@ -4128,10 +4047,18 @@ class LibraryElementImpl extends LibraryOrAugmentationElementImpl
_exportNamespace = exportNamespace;
}
@Deprecated('Use exports2 instead')
@override
List<ExportElement> get exports {
return exports2
.map((e) => ExportElementImpl(e as ExportElement2Impl))
.toList();
}
@override
List<ExportElement2> get exports2 {
linkedData?.read(this);
return _exports;
return _exports2;
}
bool get hasPartOfDirective {
@ -4148,9 +4075,8 @@ class LibraryElementImpl extends LibraryOrAugmentationElementImpl
@override
List<LibraryElement> get importedLibraries {
return imports2
.map((import) => import.uri)
.whereType<DirectiveUriWithLibrary>()
.map((uri) => uri.library)
.map((import) => import.importedLibrary)
.whereNotNull()
.toSet()
.toList();
}
@ -4158,7 +4084,9 @@ class LibraryElementImpl extends LibraryOrAugmentationElementImpl
@Deprecated('Use imports2 instead')
@override
List<ImportElement> get imports {
return imports2.map(ImportElementImpl.new).toList();
return imports2
.map((e) => ImportElementImpl(e as ImportElement2Impl))
.toList();
}
@override
@ -4487,11 +4415,11 @@ abstract class LibraryOrAugmentationElementImpl extends ElementImpl
/// A list containing specifications of all of the imports defined in this
/// library.
List<ImportElement2> _imports2 = _Sentinel.importElement2;
List<ExportElement2> _exports2 = _Sentinel.exportElement2;
/// A list containing specifications of all of the exports defined in this
/// A list containing specifications of all of the imports defined in this
/// library.
List<ExportElement> _exports = _Sentinel.exportElement;
List<ImportElement2> _imports2 = _Sentinel.importElement2;
/// The cached list of prefixes.
List<PrefixElement>? _prefixes;
@ -4530,22 +4458,25 @@ abstract class LibraryOrAugmentationElementImpl extends ElementImpl
return _definingCompilationUnit;
}
@Deprecated('Use exports2 instead')
@override
List<ExportElement> get exports {
return _exports;
return exports2
.map((e) => ExportElementImpl(e as ExportElement2Impl))
.toList();
}
/// Set the specifications of all of the exports defined in this library to
/// the given list of [exports].
set exports(List<ExportElement> exports) {
for (ExportElement exportElement in exports) {
(exportElement as ExportElementImpl).enclosingElement = this;
set exports2(List<ExportElement2> exports) {
for (final exportElement in exports) {
(exportElement as ExportElement2Impl).enclosingElement = this;
}
_exports = exports;
_exports2 = exports;
}
List<ExportElement> get exports_unresolved {
return _exports;
List<ExportElement2> get exports_unresolved {
return _exports2;
}
@override
@ -4554,7 +4485,9 @@ abstract class LibraryOrAugmentationElementImpl extends ElementImpl
@Deprecated('Use imports2 instead')
@override
List<ImportElement> get imports {
return _imports2.map(ImportElementImpl.new).toList();
return imports2
.map((e) => ImportElementImpl(e as ImportElement2Impl))
.toList();
}
/// Set the specifications of all of the imports defined in this library to
@ -4587,7 +4520,9 @@ abstract class LibraryOrAugmentationElementImpl extends ElementImpl
void visitChildren(ElementVisitor visitor) {
super.visitChildren(visitor);
_definingCompilationUnit.accept(visitor);
// ignore: deprecated_member_use_from_same_package
safelyVisitChildren(exports, visitor);
safelyVisitChildren(exports2, visitor);
// ignore: deprecated_member_use_from_same_package
safelyVisitChildren(imports, visitor);
safelyVisitChildren(imports2, visitor);
@ -6508,6 +6443,177 @@ abstract class VariableElementImpl extends ElementImpl
DartObject? computeConstantValue() => null;
}
@Deprecated('Remove it when removing its uses')
mixin WrapperElementImpl implements ElementImpl {
_ExistingElementImpl get base;
@override
AnalysisContext get context => base.context;
@override
Element get declaration => base.declaration;
@override
String get displayName => base.displayName;
@override
String? get documentationComment => base.documentationComment;
@override
Element? get enclosingElement => base.enclosingElement;
@override
bool get hasAlwaysThrows => base.hasAlwaysThrows;
@override
bool get hasDeprecated => base.hasDeprecated;
@override
bool get hasDoNotStore => base.hasDoNotStore;
@override
bool get hasFactory => base.hasFactory;
@override
bool get hasInternal => base.hasInternal;
@override
bool get hasIsTest => base.hasIsTest;
@override
bool get hasIsTestGroup => base.hasIsTestGroup;
@override
bool get hasJS => base.hasJS;
@override
bool get hasLiteral => base.hasLiteral;
@override
bool get hasMustCallSuper => base.hasMustCallSuper;
@override
bool get hasNonVirtual => base.hasNonVirtual;
@override
bool get hasOptionalTypeArgs => base.hasOptionalTypeArgs;
@override
bool get hasOverride => base.hasOverride;
@override
bool get hasProtected => base.hasProtected;
@override
bool get hasRequired => base.hasRequired;
@override
bool get hasSealed => base.hasSealed;
@override
bool get hasUseResult => base.hasUseResult;
@override
bool get hasVisibleForOverriding => base.hasVisibleForOverriding;
@override
bool get hasVisibleForTemplate => base.hasVisibleForTemplate;
@override
bool get hasVisibleForTesting => base.hasVisibleForTesting;
@override
int get id => base.id;
@override
bool get isPrivate => base.isPrivate;
@override
bool get isPublic => base.isPublic;
@override
bool get isSynthetic => base.isSynthetic;
@override
ElementKind get kind => base.kind;
@override
LibraryElementImpl get library => base.library;
@override
Source get librarySource => base.librarySource;
@override
ElementLocation get location => base.location;
@override
List<ElementAnnotation> get metadata => base.metadata;
@override
String? get name => base.name;
@override
int get nameLength => base.nameLength;
@override
int get nameOffset => base.nameOffset;
@override
Element get nonSynthetic => this;
@override
AnalysisSession? get session => base.session;
@override
Source get source => base.source;
@override
bool operator ==(Object other) {
return identical(this, other);
}
@override
String getDisplayString(
{required bool withNullability, bool multiline = false}) {
return base.getDisplayString(
withNullability: withNullability,
multiline: multiline,
);
}
@override
String getExtendedDisplayName(String? shortName) {
return base.getExtendedDisplayName(shortName);
}
@Deprecated('Use isAccessibleIn2() instead')
@override
bool isAccessibleIn(LibraryElement? library) {
return base.isAccessibleIn(library);
}
@override
bool isAccessibleIn2(LibraryElement library) {
return base.isAccessibleIn2(library);
}
@override
E thisOrAncestorMatching<E extends Element>(
bool Function(Element p1) predicate) {
return base.thisOrAncestorMatching(predicate) as E;
}
@override
E? thisOrAncestorOfType<E extends Element>() {
return base.thisOrAncestorOfType();
}
@override
void visitChildren(ElementVisitor visitor) {
base.visitChildren(visitor);
}
}
abstract class _ExistingElementImpl extends ElementImpl with _HasLibraryMixin {
_ExistingElementImpl(super.name, super.offset, {super.reference});
}
@ -6528,7 +6634,7 @@ mixin _HasLibraryMixin on ElementImpl {
class _Sentinel {
static final List<ConstructorElement> constructorElement =
List.unmodifiable([]);
static final List<ExportElement> exportElement = List.unmodifiable([]);
static final List<ExportElement2> exportElement2 = List.unmodifiable([]);
static final List<FieldElement> fieldElement = List.unmodifiable([]);
static final List<AugmentationImportElement> augmentationImportElement =
List.unmodifiable([]);

View file

@ -284,7 +284,7 @@ class PrefixScope implements Scope {
) {
if (exportedReference is ExportedReferenceExported) {
for (final exportIndex in exportedReference.indexes) {
final export = importedLibrary.exports[exportIndex];
final export = importedLibrary.exports2[exportIndex];
if (!export.hasDeprecated) {
return false;
}

View file

@ -891,7 +891,7 @@ extension on Element {
/// Returns the 'type' of `this`, when accessed as a "reference", not
/// immediately followed by parentheses and arguments.
///
/// For all elements that don't have a type (for example, [ExportElement]),
/// For all elements that don't have a type (for example, [ExportElement2]),
/// `null` is returned. For [PropertyAccessorElement], the return value is
/// returned. For all other elements, their `type` property is returned.
DartType? get referenceType {

View file

@ -432,8 +432,8 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
@override
void visitExportDirective(ExportDirective node) {
var element = node.element;
if (element is ExportElementImpl) {
var element = node.element2;
if (element is ExportElement2Impl) {
_setOrCreateMetadataElements(element, node.metadata);
}

View file

@ -135,7 +135,7 @@ class Namespace {
class NamespaceBuilder {
/// Create a namespace representing the export namespace of the given
/// [element].
Namespace createExportNamespaceForDirective(ExportElement element) {
Namespace createExportNamespaceForDirective(ExportElement2 element) {
var exportedLibrary = element.exportedLibrary;
if (exportedLibrary == null) {
//

View file

@ -1071,7 +1071,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor<void> {
[libraryElement.displayName]);
}
var exportNamespace =
NamespaceBuilder().createExportNamespaceForDirective(node.element!);
NamespaceBuilder().createExportNamespaceForDirective(node.element2!);
exportNamespace.definedNames.forEach((String name, Element element) {
if (element.hasInternal) {
_errorReporter.reportErrorForNode(

View file

@ -47,7 +47,7 @@ class DeadCodeVerifier extends RecursiveAstVisitor<void> {
@override
void visitExportDirective(ExportDirective node) {
ExportElement? exportElement = node.element;
final exportElement = node.element2;
if (exportElement != null) {
// The element is null when the URI is invalid.
LibraryElement? library = exportElement.exportedLibrary;

View file

@ -57,7 +57,7 @@ import 'package:analyzer/src/generated/super_context.dart';
/// 5. Every [ImportDirective] and [ExportDirective] should resolve to the
/// element representing the library being specified by the directive unless
/// the specified library does not exist (an [ImportElement2] or
/// [ExportElement]).
/// [ExportElement2]).
/// 6. The identifier representing the prefix in an [ImportDirective] should
/// resolve to the element representing the prefix (a [PrefixElement]).
/// 7. The identifiers in the hide and show combinators in [ImportDirective]s
@ -188,7 +188,7 @@ class ElementResolver {
}
void visitExportDirective(ExportDirective node) {
var exportElement = node.element;
var exportElement = node.element2;
if (exportElement != null) {
// The element is null when the URI is invalid
// TODO(brianwilkerson) Figure out whether the element can ever be

View file

@ -621,7 +621,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
@override
void visitExportDirective(ExportDirective node) {
var exportElement = node.element;
var exportElement = node.element2;
if (exportElement != null) {
var exportedLibrary = exportElement.exportedLibrary;
_checkForAmbiguousExport(node, exportElement, exportedLibrary);
@ -1528,13 +1528,13 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
/// Verify that the export namespace of the given export [directive] does not
/// export any name already exported by another export directive. The
/// [exportElement] is the [ExportElement] retrieved from the node. If the
/// [exportElement] is the [ExportElement2] retrieved from the node. If the
/// element in the node was `null`, then this method is not called. The
/// [exportedLibrary] is the library element containing the exported element.
///
/// See [CompileTimeErrorCode.AMBIGUOUS_EXPORT].
void _checkForAmbiguousExport(ExportDirective directive,
ExportElement exportElement, LibraryElement? exportedLibrary) {
ExportElement2 exportElement, LibraryElement? exportedLibrary) {
if (exportedLibrary == null) {
return;
}
@ -2495,12 +2495,12 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
/// Check that if the visiting library is not system, then any given library
/// should not be SDK internal library. The [exportElement] is the
/// [ExportElement] retrieved from the node, if the element in the node was
/// [ExportElement2] retrieved from the node, if the element in the node was
/// `null`, then this method is not called.
///
/// See [CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY].
void _checkForExportInternalLibrary(
ExportDirective directive, ExportElement exportElement) {
ExportDirective directive, ExportElement2 exportElement) {
if (_isInSystemLibrary) {
return;
}
@ -2537,7 +2537,7 @@ class ErrorVerifier extends RecursiveAstVisitor<void>
return;
}
var element = node.element!;
var element = node.element2!;
// TODO(scheglov) Expose from ExportElement.
var namespace =
NamespaceBuilder().createExportNamespaceForDirective(element);

View file

@ -136,14 +136,6 @@ class ElementFactory {
[List<DartType> argumentTypes = const []]) =>
constructorElement(definingClass, name, false, argumentTypes);
static ExportElementImpl exportFor(LibraryElement exportedLibrary,
[List<NamespaceCombinator> combinators = const <NamespaceCombinator>[]]) {
ExportElementImpl spec = ExportElementImpl(-1);
spec.exportedLibrary = exportedLibrary;
spec.combinators = combinators;
return spec;
}
static FieldElementImpl fieldElement(
String name, bool isStatic, bool isFinal, bool isConst, DartType type,
{Expression? initializer}) {

View file

@ -381,12 +381,15 @@ class LibraryElementLinkedData extends ElementLinkedData<LibraryElementImpl> {
}
}
for (var export in element.exports) {
export as ExportElementImpl;
for (var export in element.exports2) {
export as ExportElement2Impl;
export.metadata = reader._readAnnotationList(
unitElement: unitElement,
);
export.exportedLibrary = reader.readElement() as LibraryElementImpl?;
final uri = export.uri;
if (uri is DirectiveUriWithLibraryImpl) {
uri.library = reader.libraryOfUri(uri.source.uri);
}
}
for (final part in element.parts2) {
@ -453,7 +456,11 @@ class LibraryReader {
libraryElement: libraryElement,
);
});
libraryElement.exports = _reader.readTypedList(_readExportElement);
libraryElement.exports2 = _reader.readTypedList(() {
return _readExportElement(
libraryElement: libraryElement,
);
});
LibraryElementFlags.read(_reader, libraryElement);
for (final import in libraryElement.imports2) {
@ -728,10 +735,19 @@ class LibraryReader {
}
}
ExportElementImpl _readExportElement() {
var element = ExportElementImpl(-1);
element.uri = _reader.readOptionalStringReference();
element.combinators = _reader.readTypedList(_readNamespaceCombinator);
ExportElement2Impl _readExportElement({
required LibraryElementImpl libraryElement,
}) {
final uri = _readDirectiveUri(
libraryElement: libraryElement,
);
// TODO(scheglov) pass to the constructor
final combinators = _reader.readTypedList(_readNamespaceCombinator);
final element = ExportElement2Impl(
exportKeywordOffset: -1,
uri: uri,
)..combinators = combinators;
return element;
}

View file

@ -103,7 +103,7 @@ class BundleWriter {
_writeLanguageVersion(libraryElement.languageVersion);
_resolutionSink._writeAnnotationList(libraryElement.metadata);
_writeList(libraryElement.imports2, _writeImportElement);
_writeList(libraryElement.exports, _writeExportElement);
_writeList(libraryElement.exports2, _writeExportElement);
for (final partElement in libraryElement.parts2) {
_resolutionSink._writeAnnotationList(partElement.metadata);
}
@ -254,11 +254,11 @@ class BundleWriter {
});
}
void _writeExportElement(ExportElement element) {
_sink._writeOptionalStringReference(element.uri);
_sink.writeList(element.combinators, _writeNamespaceCombinator);
void _writeExportElement(ExportElement2 element) {
element as ExportElement2Impl;
_resolutionSink._writeAnnotationList(element.metadata);
_resolutionSink.writeElement(element.exportedLibrary);
_writeDirectiveUri(element.uri);
_sink.writeList(element.combinators, _writeNamespaceCombinator);
}
void _writeExtensionElement(ExtensionElement element) {

View file

@ -12,21 +12,19 @@ import 'package:analyzer/src/dart/ast/invokes_super_self.dart';
import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/generated/utilities_dart.dart';
import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
import 'package:analyzer/src/summary2/library_builder.dart';
import 'package:analyzer/src/summary2/link.dart';
import 'package:analyzer/src/summary2/reference.dart';
import 'package:analyzer/src/util/comment.dart';
import 'package:analyzer/src/util/uri.dart';
import 'package:collection/collection.dart';
class ElementBuilder extends ThrowingAstVisitor<void> {
final LibraryBuilder _libraryBuilder;
final CompilationUnitElementImpl _unitElement;
final _exports = <ExportElement>[];
var _isFirstLibraryDirective = true;
var _exportDirectiveIndex = 0;
var _importDirectiveIndex = 0;
var _partDirectiveIndex = 0;
@ -63,8 +61,6 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
void buildLibraryElementChildren(CompilationUnit unit) {
unit.directives.accept(this);
_libraryElement.exports = _exports;
if (_isFirstLibraryDirective) {
_isFirstLibraryDirective = false;
var firstDirective = unit.directives.firstOrNull;
@ -369,20 +365,11 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
@override
void visitExportDirective(covariant ExportDirectiveImpl node) {
var element = ExportElementImpl(node.exportKeyword.offset);
element.combinators = _buildCombinators(node.combinators);
try {
element.exportedLibrary = _selectLibrary(node);
} on ArgumentError {
// TODO(scheglov) Remove this when using `ExportDirectiveState`.
}
element.metadata = _buildAnnotations(node.metadata);
element.uri = node.uri.stringValue;
node.element = element;
_exports.add(element);
final index = _exportDirectiveIndex++;
final exportElement = _libraryElement.exports2[index];
exportElement as ExportElement2Impl;
exportElement.metadata = _buildAnnotations(node.metadata);
node.element = exportElement;
}
@override
@ -1173,51 +1160,6 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
}
}
Uri? _selectAbsoluteUri(NamespaceDirective directive) {
var relativeUriStr = _selectRelativeUri(
directive.configurations,
directive.uri.stringValue,
);
if (relativeUriStr == null) {
return null;
}
Uri relativeUri;
try {
relativeUri = Uri.parse(relativeUriStr);
} on FormatException {
return null;
}
var absoluteUri = resolveRelativeUri(_libraryBuilder.uri, relativeUri);
var sourceFactory = _linker.analysisContext.sourceFactory;
return rewriteToCanonicalUri(sourceFactory, absoluteUri);
}
LibraryElement? _selectLibrary(NamespaceDirective node) {
var uri = _selectAbsoluteUri(node);
if (uri == null) {
return null;
} else {
return _linker.elementFactory.libraryOfUri(uri);
}
}
String? _selectRelativeUri(
List<Configuration> configurations,
String? defaultUri,
) {
for (var configuration in configurations) {
var name = configuration.name.components.join('.');
var value = configuration.value?.stringValue ?? 'true';
if (_linker.declaredVariables.get(name) == value) {
return configuration.uri.stringValue;
}
}
return defaultUri;
}
bool _shouldBeConstField(FieldDeclaration node) {
var fields = node.fields;
return fields.isConst ||
@ -1276,24 +1218,6 @@ class ElementBuilder extends ThrowingAstVisitor<void> {
return annotations;
}
static List<NamespaceCombinator> _buildCombinators(
List<Combinator> combinators,
) {
return combinators.map((node) {
if (node is HideCombinator) {
return HideElementCombinatorImpl()
..hiddenNames = node.hiddenNames.nameList;
}
if (node is ShowCombinator) {
return ShowElementCombinatorImpl()
..offset = node.keyword.offset
..end = node.end
..shownNames = node.shownNames.nameList;
}
throw UnimplementedError('${node.runtimeType}');
}).toList();
}
static void _setCodeRange(ElementImpl element, AstNode node) {
var parent = node.parent;
if (node is FormalParameter && parent is DefaultFormalParameter) {
@ -1455,9 +1379,3 @@ class _EnclosingContext {
return reference;
}
}
extension on Iterable<SimpleIdentifier> {
List<String> get nameList {
return map((e) => e.name).toList();
}
}

View file

@ -464,11 +464,11 @@ class InformativeDataApplier {
},
);
forCorrespondingPairs<ExportElement, _InfoExport>(
forCorrespondingPairs<ExportElement2, _InfoExport>(
element.exports_unresolved,
info.exports,
(element, info) {
element as ExportElementImpl;
element as ExportElement2Impl;
element.nameOffset = info.nameOffset;
_applyToCombinators(element.combinators, info.combinators);
},
@ -488,7 +488,7 @@ class InformativeDataApplier {
(applier) {
applier.applyToMetadata(element);
applier.applyToImports(element.imports2);
applier.applyToDirectives(element.exports);
applier.applyToExports(element.exports2);
applier.applyToPartDirectives(element.parts2);
},
);
@ -1671,18 +1671,18 @@ class _OffsetsApplier extends _OffsetsAstVisitor {
}
}
void applyToDirectives(List<UriReferencedElement> elements) {
for (var element in elements) {
applyToMetadata(element);
}
}
void applyToEnumConstants(List<FieldElement> constants) {
for (var constant in constants) {
applyToMetadata(constant);
}
}
void applyToExports(List<ExportElement2> elements) {
for (var element in elements) {
applyToMetadata(element);
}
}
void applyToFormalParameters(List<ParameterElement> formalParameters) {
for (var parameter in formalParameters) {
applyToMetadata(parameter);

View file

@ -9,6 +9,7 @@ import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/visitor.dart';
import 'package:analyzer/src/dart/analysis/file_state.dart' hide DirectiveUri;
import 'package:analyzer/src/dart/analysis/file_state.dart' as file_state;
import 'package:analyzer/src/dart/analysis/unlinked_data.dart';
import 'package:analyzer/src/dart/ast/ast.dart' as ast;
import 'package:analyzer/src/dart/ast/mixin_super_invoked_names.dart';
import 'package:analyzer/src/dart/element/element.dart';
@ -89,7 +90,7 @@ class LibraryBuilder {
}
void addExporters() {
final exportElements = element.exports;
final exportElements = element.exports2;
for (var i = 0; i < exportElements.length; i++) {
final exportElement = exportElements[i];
@ -132,6 +133,7 @@ class LibraryBuilder {
/// Build elements for declarations in the library units, add top-level
/// declarations to the local scope, for combining into export scopes.
void buildElements() {
element.exports2 = kind.exports.map(_buildExport).toList();
element.imports2 = kind.imports.map(_buildImport).toList();
for (var linkingUnit in units) {
@ -404,6 +406,89 @@ class LibraryBuilder {
}
}
List<NamespaceCombinator> _buildCombinators(
List<UnlinkedCombinator> combinators2,
) {
return combinators2.map((unlinked) {
if (unlinked.isShow) {
return ShowElementCombinatorImpl()
..offset = unlinked.keywordOffset
..end = unlinked.endOffset
..shownNames = unlinked.names;
} else {
// TODO(scheglov) Why no offsets?
return HideElementCombinatorImpl()..hiddenNames = unlinked.names;
}
}).toList();
}
ExportElement2Impl _buildExport(ExportDirectiveState state) {
final combinators = _buildCombinators(
state.directive.combinators,
);
final DirectiveUri uri;
if (state is ExportDirectiveWithFile) {
final exportedLibraryKind = state.exportedLibrary;
if (exportedLibraryKind != null) {
final exportedFile = exportedLibraryKind.file;
final exportedUri = exportedFile.uri;
final elementFactory = linker.elementFactory;
final exportedLibrary = elementFactory.libraryOfUri2(exportedUri);
uri = DirectiveUriWithLibraryImpl(
relativeUriString: state.selectedUri.relativeUriStr,
relativeUri: state.selectedUri.relativeUri,
source: exportedLibrary.source,
library: exportedLibrary,
);
} else {
uri = DirectiveUriWithSourceImpl(
relativeUriString: state.selectedUri.relativeUriStr,
relativeUri: state.selectedUri.relativeUri,
source: state.exportedSource,
);
}
} else if (state is ExportDirectiveWithInSummarySource) {
final exportedLibrarySource = state.exportedLibrarySource;
if (exportedLibrarySource != null) {
final exportedUri = exportedLibrarySource.uri;
final elementFactory = linker.elementFactory;
final exportedLibrary = elementFactory.libraryOfUri2(exportedUri);
uri = DirectiveUriWithLibraryImpl(
relativeUriString: state.selectedUri.relativeUriStr,
relativeUri: state.selectedUri.relativeUri,
source: exportedLibrary.source,
library: exportedLibrary,
);
} else {
uri = DirectiveUriWithSourceImpl(
relativeUriString: state.selectedUri.relativeUriStr,
relativeUri: state.selectedUri.relativeUri,
source: state.exportedSource,
);
}
} else {
final selectedUri = state.selectedUri;
if (selectedUri is file_state.DirectiveUriWithUri) {
uri = DirectiveUriWithRelativeUriImpl(
relativeUriString: selectedUri.relativeUriStr,
relativeUri: selectedUri.relativeUri,
);
} else if (selectedUri is file_state.DirectiveUriWithString) {
uri = DirectiveUriWithRelativeUriStringImpl(
relativeUriString: selectedUri.relativeUriStr,
);
} else {
uri = DirectiveUriImpl();
}
}
return ExportElement2Impl(
exportKeywordOffset: state.directive.exportKeywordOffset,
uri: uri,
)..combinators = combinators;
}
ImportElement2Impl _buildImport(ImportDirectiveState state) {
final importPrefix = state.directive.prefix.mapOrNull((unlinked) {
if (unlinked.deferredOffset != null) {
@ -423,17 +508,9 @@ class LibraryBuilder {
}
});
final combinators = state.directive.combinators.map((unlinked) {
if (unlinked.isShow) {
return ShowElementCombinatorImpl()
..offset = unlinked.keywordOffset
..end = unlinked.endOffset
..shownNames = unlinked.names;
} else {
// TODO(scheglov) Why no offsets?
return HideElementCombinatorImpl()..hiddenNames = unlinked.names;
}
}).toList();
final combinators = _buildCombinators(
state.directive.combinators,
);
final DirectiveUri uri;
if (state is ImportDirectiveWithFile) {

View file

@ -18,10 +18,10 @@ class FindElement extends _FindElementBase {
@override
CompilationUnitElement get unitElement => unit.declaredElement!;
ExportElement export(String targetUri) {
ExportElement? result;
ExportElement2 export(String targetUri) {
ExportElement2? result;
for (var export in libraryElement.exports) {
for (var export in libraryElement.exports2) {
var exportedUri = export.exportedLibrary?.source.uri.toString();
if (exportedUri == targetUri) {
if (result != null) {

View file

@ -373,7 +373,7 @@ export 'dart:math' hide pi;
await assertNoErrorsInCode('''
export 'dart:math';
''');
expect(findNode.export('dart:math').element!.exportedLibrary!.name,
expect(findNode.export('dart:math').element2!.exportedLibrary!.name,
'dart.math');
}

View file

@ -87,7 +87,7 @@ class ResolutionVerifier extends RecursiveAstVisitor<void> {
@override
void visitExportDirective(ExportDirective node) {
_checkResolved(node, node.element, (node) => node is ExportElement);
_checkResolved(node, node.element2, (node) => node is ExportElement2);
}
@override

View file

@ -7755,7 +7755,7 @@ c.A a2;
final cImport = unit.declaredElement!.library.imports2[1];
LibraryElement bLibrary = bImport.importedLibrary!;
LibraryElement aLibrary = bLibrary.exports[0].exportedLibrary!;
LibraryElement aLibrary = bLibrary.exports2[0].exportedLibrary!;
ClassElement aClass = aLibrary.getType('A')!;
{

View file

@ -2090,8 +2090,8 @@ export 'dart:math';
ResolvedUnitResult result = await driver.getResultValid(testFile);
expect(result.path, testFile);
// Has only exports for valid URIs.
List<ExportElement> imports = result.libraryElement.exports;
expect(imports.map((import) {
final exports = result.libraryElement.exports2;
expect(exports.map((import) {
return import.exportedLibrary?.source.uri.toString();
}), ['dart:async', null, 'dart:math']);
}

View file

@ -163,7 +163,7 @@ class _ElementWriter {
.toList();
_writeElements('imports', imports, _writeImportElement);
_writeElements('exports', e.exports, _writeExportElement);
_writeElements('exports', e.exports2, _writeExportElement);
_writelnWithIndent('definingUnit');
_withIndent(() {
@ -496,9 +496,9 @@ class _ElementWriter {
}
}
void _writeExportElement(ExportElement e) {
void _writeExportElement(ExportElement2 e) {
_writeIndentedLine(() {
_writeUri(e.exportedLibrary?.source);
_writeDirectiveUri(e.uri);
});
_withIndent(() {
@ -979,19 +979,6 @@ class _ElementWriter {
);
_writeElements('functions', e.functions, _writeFunctionElement);
}
void _writeUri(Source? source) {
if (source != null) {
Uri uri = source.uri;
String uriStr = uri.toString();
if (uri.isScheme('file')) {
uriStr = uri.pathSegments.last;
}
buffer.write(uriStr);
} else {
buffer.write('<unresolved>');
}
}
}
class _Replacement {

View file

@ -20038,7 +20038,7 @@ library
A: package:test/foo.dart;A
''',
withExportScope: true);
expect(library.exports[0].exportedLibrary!.source.shortName, 'foo.dart');
expect(library.exports2[0].exportedLibrary!.source.shortName, 'foo.dart');
}
test_export_configurations_useFirst() async {
@ -20067,7 +20067,8 @@ library
A: package:test/foo_io.dart;A
''',
withExportScope: true);
expect(library.exports[0].exportedLibrary!.source.shortName, 'foo_io.dart');
expect(
library.exports2[0].exportedLibrary!.source.shortName, 'foo_io.dart');
}
test_export_configurations_useSecond() async {
@ -20096,7 +20097,7 @@ library
A: package:test/foo_html.dart;A
''',
withExportScope: true);
ExportElement export = library.exports[0];
final export = library.exports2[0];
expect(export.exportedLibrary!.source.shortName, 'foo_html.dart');
}
@ -20357,7 +20358,9 @@ library
var library = await buildLibrary('''
export 'foo.dart';
''');
expect(library.exports[0].uri, 'foo.dart');
final uri = library.exports2[0].uri as DirectiveUriWithLibrary;
expect(uri.relativeUriString, 'foo.dart');
}
test_export_variable() async {
@ -25355,46 +25358,6 @@ library
''');
}
test_invalidUris() async {
var library = await buildLibrary(r'''
import ':[invaliduri]';
import ':[invaliduri]:foo.dart';
import 'a1.dart';
import ':[invaliduri]';
import ':[invaliduri]:foo.dart';
export ':[invaliduri]';
export ':[invaliduri]:foo.dart';
export 'a2.dart';
export ':[invaliduri]';
export ':[invaliduri]:foo.dart';
part ':[invaliduri]';
part 'a3.dart';
part ':[invaliduri]';
''');
checkElementText(library, r'''
library
imports
relativeUriString ':[invaliduri]'
relativeUriString ':[invaliduri]:foo.dart'
package:test/a1.dart
relativeUriString ':[invaliduri]'
relativeUriString ':[invaliduri]:foo.dart'
exports
<unresolved>
<unresolved>
package:test/a2.dart
<unresolved>
<unresolved>
definingUnit
parts
relativeUriString ':[invaliduri]'
source 'package:test/a3.dart'
relativeUriString ':[invaliduri]'
''');
}
test_library() async {
var library = await buildLibrary('');
checkElementText(library, r'''
@ -25434,6 +25397,96 @@ library
''');
}
test_library_exports_noRelativeUriStr() async {
final library = await buildLibrary(r'''
export '${'foo'}.dart';
''');
checkElementText(library, r'''
library
exports
noRelativeUriString
definingUnit
''');
}
test_library_exports_withRelativeUri_emptyUriSelf() async {
final library = await buildLibrary(r'''
export '';
''');
checkElementText(library, r'''
library
exports
package:test/test.dart
definingUnit
''');
}
test_library_exports_withRelativeUri_noSource() async {
final library = await buildLibrary(r'''
export 'foo:bar';
''');
checkElementText(library, r'''
library
exports
relativeUri 'foo:bar'
definingUnit
''');
}
test_library_exports_withRelativeUri_notExists() async {
final library = await buildLibrary(r'''
export 'a.dart';
''');
checkElementText(library, r'''
library
exports
package:test/a.dart
definingUnit
''');
}
test_library_exports_withRelativeUri_notLibrary_augmentation() async {
newFile('$testPackageLibPath/a.dart', r'''
library augment 'test.dart';
''');
final library = await buildLibrary(r'''
export 'a.dart';
''');
checkElementText(library, r'''
library
exports
source 'package:test/a.dart'
definingUnit
''');
}
test_library_exports_withRelativeUri_notLibrary_part() async {
newFile('$testPackageLibPath/a.dart', r'''
part of other.lib;
''');
final library = await buildLibrary(r'''
export 'a.dart';
''');
checkElementText(library, r'''
library
exports
source 'package:test/a.dart'
definingUnit
''');
}
test_library_exports_withRelativeUriString() async {
final library = await buildLibrary(r'''
export ':';
''');
checkElementText(library, r'''
library
exports
relativeUriString ':'
definingUnit
''');
}
test_library_imports_noRelativeUriStr() async {
final library = await buildLibrary(r'''
import '${'foo'}.dart';

View file

@ -398,7 +398,7 @@ class ResolvedAstPrinter extends ThrowingAstVisitor<void> {
_writeln('ExportDirective');
_withIndent(() {
_writeNamedChildEntities(node);
_writeElement('element', node.element);
_writeElement('element', node.element2);
_writeSource('selectedSource', node.selectedSource);
_writeRaw('selectedUriContent', node.selectedUriContent);
_writeRaw('uriContent', node.uriContent);

View file

@ -15,7 +15,7 @@ const isElementAnnotation = TypeMatcher<ElementAnnotation>();
const isExecutableElement = TypeMatcher<ExecutableElement>();
const isExportElement = TypeMatcher<ExportElement>();
const isExportElement = TypeMatcher<ExportElement2>();
const isFieldElement = TypeMatcher<FieldElement>();

View file

@ -344,7 +344,7 @@ class _DartNavigationComputerVisitor extends RecursiveAstVisitor<void> {
@override
void visitExportDirective(ExportDirective node) {
var exportElement = node.element;
var exportElement = node.element2;
if (exportElement != null) {
Element? libraryElement = exportElement.exportedLibrary;
_addUriDirectiveRegion(node, libraryElement);