blob: c5f9c01f6bdcdb247e5c32f26eb067e0e3831456 [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:dartdoc/src/model/attribute.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:meta/meta.dart';
/// A [ModelElement] that is a [Container] member.
mixin ContainerMember on ModelElement {
/// True if this [ContainerMember] is from an applicable [Extension].
/// False otherwise, including if this [ContainerMember]'s [enclosingElement]
/// is the extension it was declared in.
// TODO(jcollins-g): This semantic is a little confusing, because a declared
// extension member element returns false. The rationale is an
// extension member is not extending itself.
// FIXME(jcollins-g): Remove concrete implementation after [Extendable] is
// implemented.
bool get isExtended => false;
@override
Container get enclosingElement;
@override
String get filePath =>
'${canonicalLibraryOrThrow.dirName}/${enclosingElement.name}/$fileName';
/// The container that contains this member.
@protected
@visibleForTesting
late final Container definingEnclosingContainer =
getModelForElement(element.enclosingElement2!) as Container;
@override
Set<Attribute> get attributes => {
...super.attributes,
if (isExtended) Attribute.extended,
};
late final Container? canonicalEnclosingContainer = () {
final canonicalEnclosingContainer = computeCanonicalEnclosingContainer();
assert(canonicalEnclosingContainer == null ||
canonicalEnclosingContainer.isDocumented);
return canonicalEnclosingContainer;
}();
Container? computeCanonicalEnclosingContainer() =>
packageGraph.findCanonicalModelElementFor(enclosingElement) as Container?;
@override
// TODO(jcollins-g): dart-lang/dartdoc#2693.
Iterable<Container> get referenceParents =>
// If you don't want the ambiguity of where your comment references are
// resolved with respect to documentation inheritance, that has to be
// resolved in the source by not inheriting documentation.
[
enclosingElement,
(documentationFrom.first as ContainerMember).enclosingElement,
];
@override
List<Library> get referenceGrandparentOverrides =>
// TODO(jcollins-g): split Field documentation up between accessors
// and resolve the pieces with different scopes. dart-lang/dartdoc#2693.
// Until then, just pretend we're handling this correctly.
[
(documentationFrom.first as ModelElement).library,
if (this case Field(:var getter, :var setter))
packageGraph.findCanonicalModelElementFor(getter ?? setter)?.library
else
(packageGraph.findCanonicalModelElementFor(this) ?? this).library,
].nonNulls.toList();
}