blob: 19f5cc11e15e5809e3cad39dd23a5928c7e99c9b [file] [log] [blame]
// Copyright (c) 2020, 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/model.dart';
// TODO(jcollins-g): Mix-in ExtensionTarget on Method, ModelFunction, Typedef,
// and other possible documented symbols that could be extended (#2701).
mixin ExtensionTarget on ModelElement {
bool get hasModifiers;
bool get hasPotentiallyApplicableExtensions =>
potentiallyApplicableExtensions.isNotEmpty;
List<Extension> _potentiallyApplicableExtensions;
/// The set of potentiallyApplicableExtensions, for display in templates.
///
/// This is defined as those extensions where an instantiation of the type
/// defined by [element] can exist where this extension applies, not including
/// any extension that applies to every type.
Iterable<Extension> get potentiallyApplicableExtensions {
_potentiallyApplicableExtensions ??= packageGraph.documentedExtensions
.where((e) => !e.alwaysApplies)
.where((e) => e.couldApplyTo(this))
.toList(growable: false);
return _potentiallyApplicableExtensions;
}
List<Extension> get potentiallyApplicableExtensionsSorted =>
potentiallyApplicableExtensions.toList()..sort(byName);
}