Skip to content

Commit 353a184

Browse files
committed
Refactor how Object and Pragma are discovered and handled
1 parent 6bbd3d7 commit 353a184

11 files changed

+34
-169
lines changed

lib/src/model/class.dart

+5-1
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/container.dart

+4
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 => [

lib/src/model/inheritable.dart

+3-5
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:collection/collection.dart' show IterableExtension;
77
import 'package:dartdoc/src/model/attribute.dart';
88
import 'package:dartdoc/src/model/comment_referable.dart';
99
import 'package:dartdoc/src/model/model.dart';
10-
import 'package:dartdoc/src/special_elements.dart';
1110

1211
/// Mixin for subclasses of [ModelElement] representing elements that can be
1312
/// inherited from one class to another.
@@ -136,10 +135,9 @@ mixin Inheritable on ContainerMember {
136135
var inheritance = [
137136
...(enclosingElement as InheritingContainer).inheritanceChain,
138137
];
139-
var object = packageGraph.specialClasses[SpecialClass.object]!;
140138

141139
assert(
142-
definingEnclosingContainer == object ||
140+
definingEnclosingContainer.isDartCoreObject ||
143141
inheritance.contains(definingEnclosingContainer), () {
144142
var inheritanceDescriptions = inheritance
145143
.map((e) =>
@@ -153,8 +151,8 @@ mixin Inheritable on ContainerMember {
153151
}());
154152
// Unless the code explicitly extends dart:core's Object, we won't get
155153
// an entry here. So add it.
156-
if (inheritance.last != object) {
157-
inheritance.add(object);
154+
if (!inheritance.last.isDartCoreObject) {
155+
inheritance.add(packageGraph.objectClass);
158156
}
159157
return inheritance;
160158
}

lib/src/model/mixin.dart

+1-3
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

+14-6
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,16 @@ abstract class ModelElement
791786

792787
String get linkedObjectType => _packageGraph.dartCoreObject;
793788
}
789+
790+
extension on ElementAnnotation {
791+
bool get isVisibleAnnotation {
792+
if (element == null) return false;
793+
794+
if (element case ConstructorElement(:var enclosingElement3)) {
795+
return !(enclosingElement3.name == 'pragma' &&
796+
enclosingElement3.library.name == 'dart.core');
797+
}
798+
799+
return true;
800+
}
801+
}

lib/src/model/package_builder.dart

+1-13
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

lib/src/model/package_graph.dart

+4-36
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import 'package:dartdoc/src/model/model.dart';
2626
import 'package:dartdoc/src/model_utils.dart' as utils;
2727
import 'package:dartdoc/src/package_meta.dart'
2828
show PackageMeta, PackageMetaProvider;
29-
import 'package:dartdoc/src/special_elements.dart';
3029
import 'package:dartdoc/src/tool_definition.dart';
3130
import 'package:dartdoc/src/tool_runner.dart';
3231
import 'package:dartdoc/src/warnings.dart';
@@ -118,29 +117,6 @@ class PackageGraph with CommentReferable, Nameable {
118117
bool _shouldIncludeLibrary(LibraryElement libraryElement) =>
119118
config.include.isEmpty || config.include.contains(libraryElement.name);
120119

121-
/// Adds [resolvedLibrary] as a special library to the package graph, which
122-
/// adds the library to [_allLibraries], but does not add it to any [Package]'s
123-
/// list of libraries.
124-
///
125-
/// Call during initialization to add a library possibly containing
126-
/// special/non-documented elements to this [PackageGraph]. Must be called
127-
/// after any normal libraries.
128-
void addSpecialLibraryToGraph(DartDocResolvedLibrary resolvedLibrary) {
129-
allLibrariesAdded = true;
130-
assert(!_localDocumentationBuilt);
131-
final libraryElement = resolvedLibrary.element.library;
132-
_allLibraries.putIfAbsent(
133-
libraryElement.source.fullName,
134-
() => Library.fromLibraryResult(
135-
resolvedLibrary,
136-
this,
137-
Package.fromPackageMeta(
138-
packageMetaProvider.fromElement(libraryElement, config.sdkDir)!,
139-
packageGraph),
140-
),
141-
);
142-
}
143-
144120
/// Call after all libraries are added.
145121
Future<void> initializePackageGraph() async {
146122
assert(!_localDocumentationBuilt);
@@ -170,9 +146,6 @@ class PackageGraph with CommentReferable, Nameable {
170146
}
171147
allImplementersAdded = true;
172148
allExtensionsAdded = true;
173-
174-
// We should have found all special classes by now.
175-
specialClasses.assertSpecials();
176149
}
177150

178151
/// Generate a list of futures for any docs that actually require precaching.
@@ -230,8 +203,8 @@ class PackageGraph with CommentReferable, Nameable {
230203
// more than once for them.
231204
final Map<Element, ModelNode> _modelNodes = {};
232205

233-
/// The collection of "special" classes for which we need some special access.
234-
final specialClasses = SpecialClasses();
206+
/// The Object class declared in the Dart SDK's 'dart:core' library.
207+
late InheritingContainer objectClass;
235208

236209
/// Populate's [_modelNodes] with elements in [resolvedLibrary].
237210
///
@@ -706,14 +679,9 @@ class PackageGraph with CommentReferable, Nameable {
706679
?.linkedName ??
707680
'Object';
708681

709-
/// The set of [Class] objects that are similar to 'pragma' in that we should
710-
/// never count them as documentable annotations.
711-
late final Set<Class> _invisibleAnnotations = {
712-
if (specialClasses[SpecialClass.pragma] case var pragma?) pragma,
713-
};
714-
715682
bool isAnnotationVisible(Class class_) =>
716-
!_invisibleAnnotations.contains(class_);
683+
class_.element.name == 'pragma' &&
684+
class_.element.library.name == 'dart.core';
717685

718686
@override
719687
String toString() {

lib/src/special_elements.dart

-84
This file was deleted.

test/classes_test.dart

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:dartdoc/src/special_elements.dart';
65
import 'package:test/test.dart';
76
import 'package:test_reflective_loader/test_reflective_loader.dart';
87

@@ -194,9 +193,8 @@ class C implements D {}
194193
class D implements Object {}
195194
''');
196195

197-
var object = library.packageGraph.specialClasses[SpecialClass.object]!;
198196
var toString = library.classes.named('A').instanceMethods.named('toString');
199-
expect(toString.canonicalEnclosingContainer, object);
197+
expect(toString.canonicalEnclosingContainer!.isDartCoreObject, isTrue);
200198
}
201199

202200
// TODO(srawlins): Test everything else about classes.

test/end2end/model_special_cases_test.dart

+1-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import 'package:dartdoc/src/model/model.dart';
1616
import 'package:dartdoc/src/model_utils.dart';
1717
import 'package:dartdoc/src/package_config_provider.dart';
1818
import 'package:dartdoc/src/package_meta.dart';
19-
import 'package:dartdoc/src/special_elements.dart';
2019
import 'package:html/parser.dart' as html;
2120
import 'package:test/test.dart';
2221

@@ -412,8 +411,6 @@ void main() {
412411
htmlLibrary.classes.singleWhere((c) => c.name == 'EventTarget');
413412
var hashCode = eventTarget.instanceFields.wherePublic
414413
.singleWhere((f) => f.name == 'hashCode');
415-
var objectModelElement =
416-
sdkAsPackageGraph.specialClasses[SpecialClass.object];
417414
expect(
418415
eventTarget.superChain,
419416
contains(isA<ParameterizedElementType>()
@@ -429,7 +426,7 @@ void main() {
429426
"EventTarget appears to have an explicit override of 'hashCode', "
430427
'which makes this test case invalid.',
431428
);
432-
expect(hashCode.canonicalEnclosingContainer, equals(objectModelElement));
429+
expect(hashCode.canonicalEnclosingContainer!.isDartCoreObject, isTrue);
433430
expect(
434431
eventTarget.publicSuperChainReversed
435432
.any((et) => et.name == 'Interceptor'),

test/packages_test.dart

-14
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'package:dartdoc/src/model/documentable.dart';
1010
import 'package:dartdoc/src/model/kind.dart';
1111
import 'package:dartdoc/src/package_config_provider.dart';
1212
import 'package:dartdoc/src/package_meta.dart';
13-
import 'package:dartdoc/src/special_elements.dart';
1413
import 'package:test/test.dart';
1514
import 'package:test_reflective_loader/test_reflective_loader.dart';
1615

@@ -416,19 +415,6 @@ dartdoc:
416415
var sdkPackage = packageGraph.defaultPackage;
417416
expect(sdkPackage.documentation, startsWith('Welcome'));
418417
});
419-
420-
test('Pragma is hidden in docs', () async {
421-
var packageGraph = await utils.bootBasicPackage(
422-
sdkFolder.path, packageMetaProvider, packageConfigProvider,
423-
additionalArguments: [
424-
'--input',
425-
packageMetaProvider.defaultSdkDir.path,
426-
]);
427-
428-
var pragmaModelElement =
429-
packageGraph.specialClasses[SpecialClass.pragma]!;
430-
expect(pragmaModelElement.name, equals('pragma'));
431-
});
432418
});
433419

434420
group('using default options', () {

0 commit comments

Comments
 (0)