Skip to content

Commit 61c4ac3

Browse files
committed
Merge branch 'main' into misc/remove-unused-build-config
2 parents 04be14e + fa339a1 commit 61c4ac3

13 files changed

+102
-246
lines changed

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2885,6 +2885,13 @@ class _Renderer_Container extends RendererBase<Container> {
28852885
_render_Operator(e, ast, r.template, sink, parent: r));
28862886
},
28872887
),
2888+
'isDartCoreObject': Property(
2889+
getValue: (CT_ c) => c.isDartCoreObject,
2890+
renderVariable: (CT_ c, Property<CT_> self,
2891+
List<String> remainingNames) =>
2892+
self.renderSimpleVariable(c, remainingNames, 'bool'),
2893+
getBool: (CT_ c) => c.isDartCoreObject,
2894+
),
28882895
'isEnum': Property(
28892896
getValue: (CT_ c) => c.isEnum,
28902897
renderVariable: (CT_ c, Property<CT_> self,
@@ -16364,14 +16371,14 @@ const _invisibleGetters = {
1636416371
'hasFooterVersion',
1636516372
'hashCode',
1636616373
'implementers',
16367-
'inheritThrough',
1636816374
'inheritanceManager',
1636916375
'libraries',
1637016376
'libraryCount',
1637116377
'libraryExports',
1637216378
'localPackages',
1637316379
'localPublicLibraries',
1637416380
'name',
16381+
'objectClass',
1637516382
'packageGraph',
1637616383
'packageMap',
1637716384
'packageMeta',
@@ -16384,8 +16391,7 @@ const _invisibleGetters = {
1638416391
'referenceParents',
1638516392
'resourceProvider',
1638616393
'runtimeType',
16387-
'sdkLibrarySources',
16388-
'specialClasses'
16394+
'sdkLibrarySources'
1638916395
},
1639016396
'PackageMeta': {
1639116397
'dir',

lib/src/model/class.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ class Class extends InheritingContainer with Constructable, MixedInTypes {
4545

4646
Class(this.element, Library library, PackageGraph packageGraph)
4747
: super(library, packageGraph) {
48-
packageGraph.specialClasses.addSpecial(this);
48+
if (element.name == 'Object' &&
49+
library.element.name == 'dart.core' &&
50+
package.name == 'Dart') {
51+
packageGraph.objectClass = this;
52+
}
4953
}
5054

5155
@override

lib/src/model/comment_referable.dart

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,13 @@ extension on Scope {
223223
/// A set of utility methods for helping build
224224
/// [CommentReferable.referenceChildren] out of collections of other
225225
/// [CommentReferable]s.
226-
extension CommentReferableEntryGenerators on Iterable<CommentReferable> {
226+
extension CommentReferableEntryGenerators<T extends CommentReferable>
227+
on Iterable<T> {
227228
/// Creates reference entries for this Iterable.
228229
///
229230
/// If there is a conflict with [referable], the included [MapEntry] uses
230231
/// [referable]'s [CommentReferable.referenceName] as a prefix.
231-
Map<String, CommentReferable> explicitOnCollisionWith(
232-
CommentReferable referable) =>
233-
{
232+
Map<String, T> explicitOnCollisionWith(CommentReferable referable) => {
234233
for (var r in this)
235234
if (r.referenceName == referable.referenceName)
236235
'${referable.referenceName}.${r.referenceName}': r
@@ -239,13 +238,13 @@ extension CommentReferableEntryGenerators on Iterable<CommentReferable> {
239238
};
240239

241240
/// A mapping from each [CommentReferable]'s name to itself.
242-
Map<String, CommentReferable> get asMapByName => {
241+
Map<String, T> get asMapByName => {
243242
for (var r in this) r.referenceName: r,
244243
};
245244

246245
/// Returns all values not of this type.
247-
List<CommentReferable> whereNotType<T>() => [
246+
List<T> whereNotType<U>() => [
248247
for (var referable in this)
249-
if (referable is! T) referable,
248+
if (referable is! U) referable,
250249
];
251250
}

lib/src/model/container.dart

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ abstract class Container extends ModelElement
4949
/// Whether this is a mixin.
5050
bool get isMixin => element is MixinElement;
5151

52+
/// Whether this container represents the Object class from 'dart:core'.
53+
bool get isDartCoreObject =>
54+
element.name == 'Object' && element.library?.name == 'dart.core';
55+
5256
/// The model elements of all of the members of this container, including
5357
/// declared and inherited ones.
5458
Iterable<ModelElement> get allModelElements => [
@@ -156,33 +160,6 @@ abstract class Container extends ModelElement
156160
late final Set<Element> _allElements =
157161
allModelElements.map((e) => e.element).toSet();
158162

159-
late final Map<String, List<ModelElement>> _membersByName = () {
160-
var membersByName = <String, List<ModelElement>>{};
161-
for (var element in allModelElements) {
162-
membersByName.putIfAbsent(element.name, () => []).add(element);
163-
}
164-
return membersByName;
165-
}();
166-
167-
/// Given a [ModelElement] that is a member of some other class, returns
168-
/// the member of this class that has the same name and runtime type.
169-
///
170-
/// This enables object substitution for canonicalization, such as Interceptor
171-
/// for Object.
172-
T memberByExample<T extends ModelElement>(T example) {
173-
// [T] is insufficiently specific to disambiguate between different
174-
// subtypes of [Inheritable] or other mixins/implementations of
175-
// [ModelElement] via [Iterable.whereType].
176-
var possibleMembers = _membersByName[example.name]!
177-
.where((e) => e.runtimeType == example.runtimeType);
178-
if (example is Accessor) {
179-
possibleMembers = possibleMembers
180-
.where((e) => example.isGetter == (e as Accessor).isGetter);
181-
}
182-
assert(possibleMembers.length == 1);
183-
return possibleMembers.first as T;
184-
}
185-
186163
bool get hasPublicStaticFields => staticFields.any((e) => e.isPublic);
187164

188165
List<Field> get publicStaticFieldsSorted =>

lib/src/model/inheritable.dart

Lines changed: 53 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import 'package:analyzer/dart/element/element.dart';
66
import 'package:collection/collection.dart' show IterableExtension;
77
import 'package:dartdoc/src/model/attribute.dart';
8+
import 'package:dartdoc/src/model/comment_referable.dart';
89
import 'package:dartdoc/src/model/model.dart';
9-
import 'package:dartdoc/src/special_elements.dart';
1010

1111
/// Mixin for subclasses of [ModelElement] representing elements that can be
1212
/// inherited from one class to another.
@@ -43,6 +43,9 @@ mixin Inheritable on ContainerMember {
4343
canonicalEnclosingContainer?.canonicalLibrary;
4444

4545
@override
46+
// TODO(srawlins): Do something about this overridden field. Maybe split out
47+
// the super implementation.
48+
// ignore: overridden_fields
4649
late final ModelElement? canonicalModelElement = canonicalEnclosingContainer
4750
?.allCanonicalModelElements
4851
.firstWhereOrNull((m) =>
@@ -55,22 +58,40 @@ mixin Inheritable on ContainerMember {
5558
var searchElement = element.declaration;
5659
// TODO(jcollins-g): generate warning if an inherited element's definition
5760
// is in an intermediate non-canonical class in the inheritance chain?
58-
Container? previous;
59-
Container? previousNonSkippable;
6061
Container? found;
61-
for (var c in _inheritance.reversed) {
62-
// Filter out mixins.
63-
if (c.containsElement(searchElement)) {
64-
if ((packageGraph.inheritThrough.contains(previous) &&
65-
c != definingEnclosingContainer) ||
66-
(packageGraph.inheritThrough.contains(c) &&
67-
c == definingEnclosingContainer)) {
68-
return previousNonSkippable!
69-
.memberByExample(this)
70-
.canonicalEnclosingContainer;
62+
var reverseInheritance = _inheritance.reversed.toList();
63+
for (var i = 0; i < reverseInheritance.length; i++) {
64+
var container = reverseInheritance[i];
65+
if (container.containsElement(searchElement)) {
66+
var previousIsHiddenAndNotDefining = i > 0 &&
67+
_isHiddenInterface(reverseInheritance[i - 1]) &&
68+
container != definingEnclosingContainer;
69+
var thisIsHiddenAndDefining = _isHiddenInterface(container) &&
70+
container == definingEnclosingContainer;
71+
// If the previous container in the search is one of the "hidden"
72+
// interfaces, and it's not this member's defining container, OR if
73+
// this container in the search is one of the "hidden" interfaces,
74+
// and it is also this member's defining container, then we can just
75+
// immediately return the canonical enclosing container of the
76+
// overridden member in the previous, non-hidden container in the
77+
// inheritance.
78+
if (previousIsHiddenAndNotDefining || thisIsHiddenAndDefining) {
79+
var previousVisible = reverseInheritance
80+
.take(i)
81+
.lastWhere((e) => !_isHiddenInterface(e));
82+
var membersInPreviousVisible = previousVisible.allModelElements
83+
.where((e) => e.name == name)
84+
.whereType<Inheritable>()
85+
.whereNotType<Field>();
86+
assert(
87+
membersInPreviousVisible.length == 1,
88+
'found multiple members named "$name" in '
89+
'"${previousVisible.name}": '
90+
'${membersInPreviousVisible.toList()}');
91+
return membersInPreviousVisible.first.canonicalEnclosingContainer;
7192
}
72-
var canonicalContainer =
73-
packageGraph.findCanonicalModelElementFor(c) as Container?;
93+
var canonicalContainer = packageGraph
94+
.findCanonicalModelElementFor(container) as Container?;
7495
// TODO(jcollins-g): invert this lookup so traversal is recursive
7596
// starting from the ModelElement.
7697
if (canonicalContainer != null) {
@@ -80,10 +101,6 @@ mixin Inheritable on ContainerMember {
80101
break;
81102
}
82103
}
83-
previous = c;
84-
if (!packageGraph.inheritThrough.contains(c)) {
85-
previousNonSkippable = c;
86-
}
87104
}
88105
if (found != null) {
89106
return found;
@@ -96,6 +113,20 @@ mixin Inheritable on ContainerMember {
96113
return super.computeCanonicalEnclosingContainer();
97114
}
98115

116+
/// Whether [c] is a "hidden" interface.
117+
///
118+
/// A hidden interface should never be considered the canonical enclosing
119+
/// container of a container member.
120+
///
121+
/// Add classes here if they are similar to the Dart SDK's 'Interceptor' class
122+
/// in that they are to be ignored even when they are the implementers of
123+
/// [Inheritable]s, and the class these inherit from should instead claim
124+
/// implementation.
125+
bool _isHiddenInterface(Container? c) =>
126+
c != null &&
127+
c.element.name == 'Interceptor' &&
128+
c.element.library?.name == '_interceptors';
129+
99130
/// A roughly ordered list of this element's enclosing container's inheritance
100131
/// chain.
101132
///
@@ -104,10 +135,9 @@ mixin Inheritable on ContainerMember {
104135
var inheritance = [
105136
...(enclosingElement as InheritingContainer).inheritanceChain,
106137
];
107-
var object = packageGraph.specialClasses[SpecialClass.object]!;
108138

109139
assert(
110-
definingEnclosingContainer == object ||
140+
definingEnclosingContainer.isDartCoreObject ||
111141
inheritance.contains(definingEnclosingContainer), () {
112142
var inheritanceDescriptions = inheritance
113143
.map((e) =>
@@ -121,8 +151,8 @@ mixin Inheritable on ContainerMember {
121151
}());
122152
// Unless the code explicitly extends dart:core's Object, we won't get
123153
// an entry here. So add it.
124-
if (inheritance.last != object) {
125-
inheritance.add(object);
154+
if (!inheritance.last.isDartCoreObject) {
155+
inheritance.add(packageGraph.objectClass);
126156
}
127157
return inheritance;
128158
}

lib/src/model/mixin.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import 'package:dartdoc/src/model/comment_referable.dart';
99
import 'package:dartdoc/src/model/kind.dart';
1010
import 'package:dartdoc/src/model/model.dart';
1111
import 'package:dartdoc/src/model_utils.dart' as model_utils;
12-
import 'package:dartdoc/src/special_elements.dart';
1312
import 'package:meta/meta.dart';
1413

1514
class Mixin extends InheritingContainer {
@@ -20,8 +19,7 @@ class Mixin extends InheritingContainer {
2019
...element.superclassConstraints
2120
.map((InterfaceType i) =>
2221
getTypeFor(i, library) as ParameterizedElementType)
23-
.where((t) =>
24-
t.modelElement != packageGraph.specialClasses[SpecialClass.object])
22+
.where((t) => t.modelElement != packageGraph.objectClass)
2523
];
2624

2725
@override

lib/src/model/model_element.dart

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import 'package:analyzer/source/line_info.dart';
1414
// ignore: implementation_imports
1515
import 'package:analyzer/src/dart/element/member.dart'
1616
show ExecutableMember, Member, ParameterMember;
17-
import 'package:collection/collection.dart';
1817
import 'package:dartdoc/src/dartdoc_options.dart';
1918
import 'package:dartdoc/src/model/annotation.dart';
2019
import 'package:dartdoc/src/model/attribute.dart';
@@ -27,7 +26,6 @@ import 'package:dartdoc/src/model_utils.dart';
2726
import 'package:dartdoc/src/render/parameter_renderer.dart';
2827
import 'package:dartdoc/src/runtime_stats.dart';
2928
import 'package:dartdoc/src/source_linker.dart';
30-
import 'package:dartdoc/src/special_elements.dart';
3129
import 'package:dartdoc/src/type_utils.dart';
3230
import 'package:dartdoc/src/warnings.dart';
3331
import 'package:meta/meta.dart';
@@ -385,10 +383,7 @@ abstract class ModelElement
385383
/// invalid code from analyzer's perspective, some are present in `sky_engine`
386384
/// (`@Native`) so we don't want to crash here.
387385
late final List<Annotation> annotations = element.metadata
388-
.whereNot((m) =>
389-
m.element == null ||
390-
packageGraph.specialClasses[SpecialClass.pragma]!.element.constructors
391-
.contains(m.element))
386+
.where((m) => m.isVisibleAnnotation)
392387
.map((m) => Annotation(m, library, packageGraph))
393388
.toList(growable: false);
394389

@@ -791,3 +786,19 @@ abstract class ModelElement
791786

792787
String get linkedObjectType => _packageGraph.dartCoreObject;
793788
}
789+
790+
extension on ElementAnnotation {
791+
/// Whether this annotation should be displayed in documentation.
792+
///
793+
/// At the moment, `pragma` is the only invisible annotation.
794+
bool get isVisibleAnnotation {
795+
if (element == null) return false;
796+
797+
if (element case ConstructorElement(:var enclosingElement3)) {
798+
return !(enclosingElement3.name == 'pragma' &&
799+
enclosingElement3.library.name == 'dart.core');
800+
}
801+
802+
return true;
803+
}
804+
}

lib/src/model/package_builder.dart

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import 'package:dartdoc/src/package_config_provider.dart';
2929
import 'package:dartdoc/src/package_meta.dart'
3030
show PackageMeta, PackageMetaProvider;
3131
import 'package:dartdoc/src/runtime_stats.dart';
32-
import 'package:dartdoc/src/special_elements.dart';
3332
import 'package:meta/meta.dart';
3433
import 'package:path/path.dart' as p show Context;
3534

@@ -479,13 +478,7 @@ class PubPackageBuilder implements PackageBuilder {
479478
/// Adds all libraries with documentable elements to
480479
/// [uninitializedPackageGraph].
481480
Future<void> _getLibraries(PackageGraph uninitializedPackageGraph) async {
482-
var embedderSdk = _embedderSdk;
483-
var findSpecialsSdk = switch (embedderSdk) {
484-
EmbedderSdk(:var urlMappings) when urlMappings.isNotEmpty => embedderSdk,
485-
_ => _sdk,
486-
};
487481
var files = await _getFilesToDocument();
488-
var specialFiles = specialLibraryFiles(findSpecialsSdk);
489482

490483
logInfo('Discovering libraries...');
491484
var foundLibraries = <LibraryElement>{};
@@ -495,12 +488,7 @@ class PubPackageBuilder implements PackageBuilder {
495488
files,
496489
);
497490
_checkForMissingIncludedFiles(foundLibraries);
498-
await _discoverLibraries(
499-
uninitializedPackageGraph.addSpecialLibraryToGraph,
500-
foundLibraries,
501-
specialFiles.difference(files),
502-
addingSpecials: true,
503-
);
491+
uninitializedPackageGraph.allLibrariesAdded = true;
504492
}
505493

506494
/// Throws an exception if any configured-to-be-included files were not found

0 commit comments

Comments
 (0)