Skip to content

Commit 50e4b67

Browse files
authored
Remove use of NodeLocator2 (#3538)
1 parent b2de813 commit 50e4b67

File tree

6 files changed

+84
-149
lines changed

6 files changed

+84
-149
lines changed

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12715,7 +12715,7 @@ class _Renderer_Package extends RendererBase<Package> {
1271512715
}
1271612716
}
1271712717

12718-
String renderSearchPage(PackageTemplateData context, Template template) {
12718+
String renderIndex(PackageTemplateData context, Template template) {
1271912719
var buffer = StringBuffer();
1272012720
_render_PackageTemplateData(context, template.ast, template, buffer);
1272112721
return buffer.toString();
@@ -12953,7 +12953,7 @@ class _Renderer_PackageTemplateData extends RendererBase<PackageTemplateData> {
1295312953
}
1295412954
}
1295512955

12956-
String renderIndex(PackageTemplateData context, Template template) {
12956+
String renderSearchPage(PackageTemplateData context, Template template) {
1295712957
var buffer = StringBuffer();
1295812958
_render_PackageTemplateData(context, template.ast, template, buffer);
1295912959
return buffer.toString();

lib/src/model/accessor.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,15 @@ class Accessor extends ModelElement implements EnclosedElement {
5656
late final GetterSetterCombo definingCombo =
5757
modelBuilder.fromElement(element.variable) as GetterSetterCombo;
5858

59-
late final String _sourceCode = isSynthetic
60-
? _sourceCodeRenderer.renderSourceCode(
61-
packageGraph.getModelNodeFor(definingCombo.element)!.sourceCode)
62-
: super.sourceCode;
59+
String get _sourceCode {
60+
if (!isSynthetic) {
61+
return super.sourceCode;
62+
}
63+
var modelNode = packageGraph.getModelNodeFor(definingCombo.element);
64+
return modelNode == null
65+
? ''
66+
: _sourceCodeRenderer.renderSourceCode(modelNode.sourceCode);
67+
}
6368

6469
@override
6570
String get sourceCode => _sourceCode;

lib/src/model/library.dart

Lines changed: 2 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'dart:collection';
77
import 'package:analyzer/dart/element/element.dart';
88
import 'package:analyzer/dart/element/scope.dart';
99
import 'package:analyzer/dart/element/type_system.dart';
10-
import 'package:analyzer/dart/element/visitor.dart';
1110
import 'package:analyzer/source/line_info.dart';
1211
// ignore: implementation_imports
1312
import 'package:analyzer/src/generated/sdk.dart' show SdkLibrary;
@@ -16,116 +15,6 @@ import 'package:dartdoc/src/model/model.dart';
1615
import 'package:dartdoc/src/package_meta.dart' show PackageMeta;
1716
import 'package:dartdoc/src/warnings.dart';
1817

19-
/// Finds all hashable children of a given element that are defined in the
20-
/// [LibraryElement] given at initialization.
21-
// TODO(srawlins): Do we not need to visit the parameters in
22-
// [ConstructorElement], [FunctionElement], [MethodElement],
23-
// [PropertyAccessorElement], [TypeAliasElement]?
24-
class _HashableChildLibraryElementVisitor
25-
extends RecursiveElementVisitor<void> {
26-
final DartDocResolvedLibrary resolvedLibrary;
27-
final PackageGraph packageGraph;
28-
29-
_HashableChildLibraryElementVisitor(this.resolvedLibrary, this.packageGraph);
30-
31-
@override
32-
void visitClassElement(ClassElement element) {
33-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
34-
super.visitClassElement(element);
35-
}
36-
37-
@override
38-
void visitConstructorElement(ConstructorElement element) {
39-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
40-
}
41-
42-
@override
43-
void visitEnumElement(EnumElement element) {
44-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
45-
super.visitEnumElement(element);
46-
}
47-
48-
@override
49-
void visitExtensionElement(ExtensionElement element) {
50-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
51-
super.visitExtensionElement(element);
52-
}
53-
54-
@override
55-
void visitFieldElement(FieldElement element) {
56-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
57-
}
58-
59-
@override
60-
void visitFieldFormalParameterElement(FieldFormalParameterElement element) {
61-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
62-
}
63-
64-
@override
65-
void visitFunctionElement(FunctionElement element) {
66-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
67-
}
68-
69-
@override
70-
void visitLibraryElement(LibraryElement element) {
71-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
72-
super.visitLibraryElement(element);
73-
}
74-
75-
@override
76-
void visitMixinElement(MixinElement element) {
77-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
78-
super.visitMixinElement(element);
79-
}
80-
81-
@override
82-
void visitMultiplyDefinedElement(MultiplyDefinedElement element) {
83-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
84-
super.visitMultiplyDefinedElement(element);
85-
}
86-
87-
@override
88-
void visitMethodElement(MethodElement element) {
89-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
90-
}
91-
92-
@override
93-
void visitParameterElement(ParameterElement element) {
94-
// [ParameterElement]s without names do not provide sufficiently distinct
95-
// hashes / comparison, so just skip them all. (dart-lang/sdk#30146)
96-
}
97-
98-
@override
99-
void visitPrefixElement(PrefixElement element) {
100-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
101-
}
102-
103-
@override
104-
void visitPropertyAccessorElement(PropertyAccessorElement element) {
105-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
106-
}
107-
108-
@override
109-
void visitSuperFormalParameterElement(SuperFormalParameterElement element) {
110-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
111-
}
112-
113-
@override
114-
void visitTopLevelVariableElement(TopLevelVariableElement element) {
115-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
116-
}
117-
118-
@override
119-
void visitTypeAliasElement(TypeAliasElement element) {
120-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
121-
}
122-
123-
@override
124-
void visitTypeParameterElement(TypeParameterElement element) {
125-
packageGraph.populateModelNodeFor(element, resolvedLibrary);
126-
}
127-
}
128-
12918
class _LibrarySentinel implements Library {
13019
@override
13120
dynamic noSuchMethod(Invocation invocation) =>
@@ -165,10 +54,9 @@ class Library extends ModelElement
16554

16655
factory Library.fromLibraryResult(DartDocResolvedLibrary resolvedLibrary,
16756
PackageGraph packageGraph, Package package) {
168-
var element = resolvedLibrary.element;
57+
packageGraph.gatherModelNodes(resolvedLibrary);
16958

170-
_HashableChildLibraryElementVisitor(resolvedLibrary, packageGraph)
171-
.visitLibraryElement(element);
59+
var element = resolvedLibrary.element;
17260

17361
var exportedAndLocalElements = {
17462
// Initialize the list of elements defined in this library and

lib/src/model/model_element.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ abstract class ModelElement extends Canonicalization
385385
Iterable<Category?> get displayedCategories => const [];
386386

387387
@override
388-
late final ModelNode? modelNode = packageGraph.getModelNodeFor(element);
388+
ModelNode? get modelNode => packageGraph.getModelNodeFor(element);
389389

390390
/// This element's [Annotation]s.
391391
///

lib/src/model/package_builder.dart

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ import 'package:analyzer/src/context/builder.dart' show EmbedderYamlLocator;
1616
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart'
1717
show AnalysisContextCollectionImpl;
1818
// ignore: implementation_imports
19-
import 'package:analyzer/src/dart/ast/utilities.dart' show NodeLocator2;
20-
// ignore: implementation_imports
2119
import 'package:analyzer/src/dart/sdk/sdk.dart'
2220
show EmbedderSdk, FolderBasedDartSdk;
2321
// ignore: implementation_imports
@@ -479,27 +477,9 @@ class PubPackageBuilder implements PackageBuilder {
479477
/// the library.
480478
class DartDocResolvedLibrary {
481479
final LibraryElement element;
482-
final Map<String, CompilationUnit> _units;
480+
final List<CompilationUnit> units;
483481

484482
DartDocResolvedLibrary(ResolvedLibraryResult result)
485483
: element = result.element,
486-
_units = {
487-
for (var unit in result.units) unit.path: unit.unit,
488-
};
489-
490-
/// Returns the [AstNode] for a given [Element].
491-
///
492-
/// Uses a precomputed map of `element.source.fullName` to [CompilationUnit]
493-
/// to avoid linear traversal in
494-
/// `ResolvedLibraryElementImpl.getElementDeclaration`.
495-
AstNode? getAstNode(Element element) {
496-
var fullName = element.source?.fullName;
497-
if (fullName != null && !element.isSynthetic && element.nameOffset != -1) {
498-
var unit = _units[fullName];
499-
if (unit != null) {
500-
return NodeLocator2(element.nameOffset).searchWithin(unit);
501-
}
502-
}
503-
return null;
504-
}
484+
units = result.units.map((unit) => unit.unit).toList();
505485
}

lib/src/model/package_graph.dart

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'dart:collection';
66

7+
import 'package:analyzer/dart/ast/ast.dart';
78
import 'package:analyzer/dart/element/element.dart';
89
import 'package:analyzer/file_system/file_system.dart';
910
// ignore: implementation_imports
@@ -170,15 +171,76 @@ class PackageGraph with CommentReferable, Nameable, ModelBuilder {
170171
// than once for them.
171172
final Map<Element, ModelNode> _modelNodes = {};
172173

173-
void populateModelNodeFor(
174-
Element element, DartDocResolvedLibrary resolvedLibrary) {
174+
/// Populate's [_modelNodes] with elements in [resolvedLibrary].
175+
///
176+
/// This is done as [Library] model objects are created, while we are holding
177+
/// onto [resolvedLibrary] objects.
178+
// TODO(srawlins): I suspect we populate this mapping with way too many
179+
// objects, too eagerly. They are only needed when writing the source code of
180+
// an element to HTML, and maybe for resolving doc comments. We should find a
181+
// way to get this data only when needed. But it's not immediately obvious to
182+
// me how, because the data is on AST nodes, not the element model.
183+
void gatherModelNodes(DartDocResolvedLibrary resolvedLibrary) {
184+
for (var unit in resolvedLibrary.units) {
185+
for (var declaration in unit.declarations) {
186+
_populateModelNodeFor(declaration);
187+
switch (declaration) {
188+
case ClassDeclaration():
189+
for (var member in declaration.members) {
190+
_populateModelNodeFor(member);
191+
}
192+
case EnumDeclaration():
193+
if (declaration.declaredElement?.isPublic ?? false) {
194+
for (var member in declaration.members) {
195+
_populateModelNodeFor(member);
196+
}
197+
}
198+
case MixinDeclaration():
199+
for (var member in declaration.members) {
200+
_populateModelNodeFor(member);
201+
}
202+
case ExtensionDeclaration():
203+
if (declaration.declaredElement?.isPublic ?? false) {
204+
for (var member in declaration.members) {
205+
_populateModelNodeFor(member);
206+
}
207+
}
208+
case ExtensionTypeDeclaration():
209+
if (declaration.declaredElement?.isPublic ?? false) {
210+
for (var member in declaration.members) {
211+
_populateModelNodeFor(member);
212+
}
213+
}
214+
}
215+
}
216+
}
217+
}
218+
219+
void _populateModelNodeFor(Declaration declaration) {
220+
if (declaration is FieldDeclaration) {
221+
var fields = declaration.fields.variables;
222+
for (var field in fields) {
223+
var element = field.declaredElement!;
224+
_modelNodes.putIfAbsent(
225+
element, () => ModelNode(field, element, resourceProvider));
226+
}
227+
return;
228+
}
229+
if (declaration is TopLevelVariableDeclaration) {
230+
var fields = declaration.variables.variables;
231+
for (var field in fields) {
232+
var element = field.declaredElement!;
233+
_modelNodes.putIfAbsent(
234+
element, () => ModelNode(field, element, resourceProvider));
235+
}
236+
return;
237+
}
238+
var element = declaration.declaredElement!;
175239
_modelNodes.putIfAbsent(
176-
element,
177-
() => ModelNode(
178-
resolvedLibrary.getAstNode(element), element, resourceProvider));
240+
element, () => ModelNode(declaration, element, resourceProvider));
179241
}
180242

181-
ModelNode? getModelNodeFor(Element? element) => _modelNodes[element!];
243+
ModelNode? getModelNodeFor(Element element) => _modelNodes[element];
182244

183245
late SpecialClasses specialClasses;
184246

0 commit comments

Comments
 (0)