| // Copyright (c) 2026, 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. | |
| /// @docImport 'api_declaration.dart'; | |
| library; | |
| import 'package:analyzer/dart/analysis/analysis_context.dart'; | |
| import 'package:analyzer/dart/element/element.dart'; | |
| /// Contextual state provided to [ApiSummaryCustomizer] during an API summary | |
| /// scan. | |
| final class ApiSummaryContext { | |
| /// The name of the package whose API is being summarized. | |
| final String packageName; | |
| /// The analysis context for the package being summarized. | |
| final AnalysisContext analysisContext; | |
| /// The libraries that comprise the package's public API. | |
| /// | |
| /// This is empty during [ApiSummaryCustomizer.setupComplete], and populated | |
| /// before [ApiSummaryCustomizer.initialScanComplete] is called. | |
| final List<LibraryElement> publicApiLibraries; | |
| /// The top level elements exported by the libraries in [publicApiLibraries]. | |
| /// | |
| /// This is empty during [ApiSummaryCustomizer.setupComplete], and populated | |
| /// before [ApiSummaryCustomizer.initialScanComplete] is called. | |
| final Set<Element> topLevelPublicElements; | |
| ApiSummaryContext({ | |
| required this.packageName, | |
| required this.analysisContext, | |
| List<LibraryElement>? publicApiLibraries, | |
| Set<Element>? topLevelPublicElements, | |
| }) : publicApiLibraries = publicApiLibraries ?? [], | |
| topLevelPublicElements = topLevelPublicElements ?? {}; | |
| } | |
| /// Clients of the API summary tool may extend this class to customize its | |
| /// behavior. | |
| /// | |
| /// Clients should not *implement* this class, however, because additional | |
| /// methods may be added in the future. | |
| base class ApiSummaryCustomizer { | |
| const ApiSummaryCustomizer(); | |
| /// Called after [ApiSummaryContext.packageName] and | |
| /// [ApiSummaryContext.analysisContext] have been set, but before any analysis | |
| /// has been performed. | |
| /// | |
| /// The initial scan won't be performed until the returned Future completes. | |
| Future<void> setupComplete(ApiSummaryContext context) async {} | |
| /// Called after [ApiSummaryContext.publicApiLibraries] and | |
| /// [ApiSummaryContext.topLevelPublicElements] have been populated, but before | |
| /// declaration details are built. | |
| /// | |
| /// Further analysis won't be performed until the returned Future completes. | |
| Future<void> initialScanComplete(ApiSummaryContext context) async {} | |
| /// Whether to include full member signatures (constructors, methods) for | |
| /// non-public declarations that are implicitly exposed via public signatures. | |
| bool get includeImplicitNonPublicMembers => false; | |
| /// Whether to include declarations of referenced types from external packages | |
| /// or SDK libraries. | |
| /// | |
| /// If true, referenced types will be included in the summary with a status of | |
| /// [ApiDeclarationStatus.referenced] and without their members. | |
| bool get includeReferencedTypes => false; | |
| /// Called after [initialScanComplete] to determine if details about an | |
| /// element should be shown in the API summary. | |
| /// | |
| /// The default behavior is to show details about elements in | |
| /// [ApiSummaryContext.topLevelPublicElements], or non-public package elements | |
| /// when [includeImplicitNonPublicMembers] is true. | |
| bool shouldShowDetails(Element element, ApiSummaryContext context) { | |
| if (context.topLevelPublicElements.contains(element)) { | |
| return true; | |
| } | |
| if (includeImplicitNonPublicMembers && element.library != null) { | |
| final uri = element.library!.uri; | |
| if (uri.scheme == 'package' && | |
| uri.pathSegments.isNotEmpty && | |
| uri.pathSegments[0] == context.packageName) { | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| } |