mirror of
https://github.com/dart-lang/sdk
synced 2024-09-19 20:51:50 +00:00
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:
parent
7a33665af5
commit
210536e46f
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -1125,6 +1125,7 @@ class FileState {
|
|||
return UnlinkedExportDirective(
|
||||
combinators: _serializeCombinators(node.combinators),
|
||||
configurations: _serializeConfigurations(node.configurations),
|
||||
exportKeywordOffset: node.exportKeyword.offset,
|
||||
uri: node.uri.stringValue,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -65,7 +65,7 @@ class _ElementMapper extends GeneralizingAstVisitor<Element> {
|
|||
|
||||
@override
|
||||
Element? visitExportDirective(ExportDirective node) {
|
||||
return node.element;
|
||||
return node.element2;
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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([]);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
//
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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}) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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')!;
|
||||
|
||||
{
|
||||
|
|
|
@ -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']);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -15,7 +15,7 @@ const isElementAnnotation = TypeMatcher<ElementAnnotation>();
|
|||
|
||||
const isExecutableElement = TypeMatcher<ExecutableElement>();
|
||||
|
||||
const isExportElement = TypeMatcher<ExportElement>();
|
||||
const isExportElement = TypeMatcher<ExportElement2>();
|
||||
|
||||
const isFieldElement = TypeMatcher<FieldElement>();
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue