Skip to content

Commit b4068d3

Browse files
committed
Merge branch 'main' into misc/split-scss-into-files
2 parents a810a83 + fa339a1 commit b4068d3

15 files changed

+108
-252
lines changed

.github/workflows/scorecards-analysis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121

2222
steps:
2323
- name: "Checkout code"
24-
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
24+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
2525
with:
2626
persist-credentials: false
2727

@@ -41,14 +41,14 @@ jobs:
4141

4242
# Upload the results as artifacts (optional).
4343
- name: "Upload artifact"
44-
uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874
44+
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882
4545
with:
4646
name: SARIF file
4747
path: results.sarif
4848
retention-days: 5
4949

5050
# Upload the results to GitHub's code scanning dashboard.
5151
- name: "Upload to code-scanning"
52-
uses: github/codeql-action/upload-sarif@4dd16135b69a43b6c8efb853346f8437d92d3c93
52+
uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd
5353
with:
5454
sarif_file: results.sarif

.github/workflows/test.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
run: echo "name=today::$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
4949
shell: bash
5050
- name: Cache clean flutter
51-
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
51+
uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a
5252
if: matrix.job == 'flutter'
5353
env:
5454
# Increment version to invalidate bad/obsolete caches.
@@ -57,7 +57,7 @@ jobs:
5757
path: ~/.dartdoc_grinder
5858
key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ steps.date.outputs.today }}
5959
- name: Cache .pub-cache
60-
uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
60+
uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a
6161
if: matrix.job == 'flutter'
6262
env:
6363
# Increment version to invalidate bad/obsolete caches.
@@ -68,7 +68,7 @@ jobs:
6868
- name: Configure git
6969
if: runner.os == 'Windows'
7070
run: git config --global core.autocrlf input
71-
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
71+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
7272
- uses: dart-lang/setup-dart@0a8a0fc875eb934c15d08629302413c671d3f672
7373
with:
7474
sdk: ${{ matrix.sdk }}

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+
}

0 commit comments

Comments
 (0)