From 8f7a20ce55ed50bd7e6827b4e98d759ab36d4bcd Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Tue, 21 Sep 2021 14:41:42 -0700 Subject: [PATCH 1/9] Try to cache the clean version of flutter Dartdoc uses (#2802) * Just try to get something working * simplify * Store the current date in output * well it doesn't complain locally now? * Empty commit to trigger CI --- .github/workflows/test.yaml | 22 ++++++++++++++++++++++ tool/grind.dart | 14 +++++++------- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f5ed341553..436c9accc1 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -38,6 +38,28 @@ jobs: job: sdk-analyzer steps: + - name: Store date + id: date + run: echo "::set-output name=today::$(date +'%Y-%m-%d')" + shell: bash + - name: Cache clean flutter + uses: actions/cache@v2 + if: matrix.job == 'flutter' + env: + # Increment version to invalidate bad/obsolete caches. + cache-name: cache-grinder-flutter-v1 + with: + path: ~/.dartdoc_grinder + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ steps.date.outputs.today }} + - name: Cache .pub-cache + uses: actions/cache@v2 + if: matrix.job == 'flutter' + env: + # Increment version to invalidate bad/obsolete caches. + cache-name: cache-dart-pub-v1 + with: + path: ~/.pub-cache + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ steps.date.outputs.today }} - name: Configure git if: runner.os == 'Windows' run: git config --global core.autocrlf input diff --git a/tool/grind.dart b/tool/grind.dart index 8fce2ae6c8..28d60dc34e 100644 --- a/tool/grind.dart +++ b/tool/grind.dart @@ -88,7 +88,7 @@ Future get cleanFlutterRepo async { int.parse(lastSynced.readAsStringSync())); } if (lastSyncedTime == null || - DateTime.now().difference(lastSyncedTime) > Duration(hours: 4)) { + DateTime.now().difference(lastSyncedTime) > Duration(hours: 24)) { // Rebuild the repository. if (cleanFlutterDir.existsSync()) { cleanFlutterDir.deleteSync(recursive: true); @@ -185,7 +185,12 @@ final Directory flutterDirDevTools = Map _createThrowawayPubCache() { var pubCache = Directory.systemTemp.createTempSync('pubcache'); var pubCacheBin = Directory(path.join(pubCache.path, 'bin')); - pubCacheBin.createSync(); + var defaultCache = Directory(defaultPubCache); + if (defaultCache.existsSync()) { + copy(defaultCache, pubCache); + } else { + pubCacheBin.createSync(); + } return Map.fromIterables([ 'PUB_CACHE', 'PATH' @@ -870,11 +875,6 @@ class FlutterRepo { ['--version'], workingDirectory: flutterPath, ); - await launcher.runStreamed( - bin, - ['precache'], - workingDirectory: flutterPath, - ); await launcher.runStreamed( bin, ['update-packages'], From b1b9ee8b341c085bbd454b1acd2de7016ee3cf2a Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Wed, 22 Sep 2021 09:04:19 -0700 Subject: [PATCH 2/9] Reduce broad imports of dartdoc.dart (#2806) --- lib/dartdoc.dart | 12 +----------- lib/src/dartdoc_options.dart | 3 ++- lib/src/failure.dart | 16 ++++++++++++++++ lib/src/generator/dartdoc_generator_backend.dart | 6 ++++-- lib/src/generator/templates.dart | 4 +++- .../generator/templates.runtime_renderers.dart | 3 ++- lib/src/model/comment_referable.dart | 3 ++- lib/src/model/package_graph.dart | 2 +- lib/src/model_utils.dart | 2 +- lib/src/package_meta.dart | 3 ++- lib/src/render/element_type_renderer.dart | 2 +- lib/src/render/renderer_factory.dart | 2 +- test/end2end/dartdoc_integration_test.dart | 2 +- test/end2end/dartdoc_test.dart | 10 +++++++++- test/html_generator_test.dart | 4 +++- test/mustachio/foo.runtime_renderers.dart | 3 ++- test/mustachio/renderers_output_test.dart | 7 ++++++- tool/mustachio/codegen_runtime_renderer.dart | 3 ++- 18 files changed, 59 insertions(+), 28 deletions(-) create mode 100644 lib/src/failure.dart diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart index 287a71edbb..c5678fd469 100644 --- a/lib/dartdoc.dart +++ b/lib/dartdoc.dart @@ -15,6 +15,7 @@ import 'dart:io' show Platform, exitCode, stderr; import 'package:analyzer/file_system/file_system.dart'; import 'package:dartdoc/options.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; +import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/generator/empty_generator.dart'; import 'package:dartdoc/src/generator/generator.dart'; import 'package:dartdoc/src/generator/html_generator.dart'; @@ -527,17 +528,6 @@ class Dartdoc { } } -/// This class is returned if dartdoc fails in an expected way (for instance, if -/// there is an analysis error in the library). -class DartdocFailure { - final String message; - - DartdocFailure(this.message); - - @override - String toString() => message; -} - /// The results of a [Dartdoc.generateDocs] call. class DartdocResults { final PackageMeta packageMeta; diff --git a/lib/src/dartdoc_options.dart b/lib/src/dartdoc_options.dart index 9c83b85068..65adb82f77 100644 --- a/lib/src/dartdoc_options.dart +++ b/lib/src/dartdoc_options.dart @@ -20,9 +20,10 @@ import 'dart:io' show Platform, stdout; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:args/args.dart'; -import 'package:dartdoc/dartdoc.dart'; import 'package:dartdoc/src/experiment_options.dart'; +import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/io_utils.dart'; +import 'package:dartdoc/src/package_meta.dart'; import 'package:dartdoc/src/source_linker.dart'; import 'package:dartdoc/src/tool_definition.dart'; import 'package:dartdoc/src/tool_runner.dart'; diff --git a/lib/src/failure.dart b/lib/src/failure.dart new file mode 100644 index 0000000000..fcee30ad2d --- /dev/null +++ b/lib/src/failure.dart @@ -0,0 +1,16 @@ +// Copyright (c) 2021, 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. + +/// A class representing a failure during dartdoc execution. +/// +/// An instance of this is returned if dartdoc fails in an expected way (for +/// instance, if there is an analysis error in the library). +class DartdocFailure { + final String message; + + DartdocFailure(this.message); + + @override + String toString() => message; +} diff --git a/lib/src/generator/dartdoc_generator_backend.dart b/lib/src/generator/dartdoc_generator_backend.dart index 8b2d6aae8c..7ab32db4cf 100644 --- a/lib/src/generator/dartdoc_generator_backend.dart +++ b/lib/src/generator/dartdoc_generator_backend.dart @@ -3,12 +3,14 @@ // BSD-style license that can be found in the LICENSE file. import 'package:analyzer/file_system/file_system.dart'; -import 'package:dartdoc/dartdoc.dart'; import 'package:dartdoc/options.dart'; +import 'package:dartdoc/src/generator/generator.dart'; import 'package:dartdoc/src/generator/generator_frontend.dart'; import 'package:dartdoc/src/generator/generator_utils.dart' as generator_util; import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/generator/templates.dart'; +import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/version.dart'; import 'package:dartdoc/src/warnings.dart'; import 'package:path/path.dart' as path show Context; @@ -39,7 +41,7 @@ class DartdocGeneratorBackendOptions implements TemplateOptions { DartdocGeneratorBackendOptions.fromContext( DartdocGeneratorOptionContext context) : relCanonicalPrefix = context.relCanonicalPrefix, - toolVersion = dartdocVersion, + toolVersion = packageVersion, favicon = context.favicon, prettyIndexJson = context.prettyIndexJson, useBaseHref = context.useBaseHref, diff --git a/lib/src/generator/templates.dart b/lib/src/generator/templates.dart index 9ce0ef7fc2..52915a6f45 100644 --- a/lib/src/generator/templates.dart +++ b/lib/src/generator/templates.dart @@ -27,8 +27,9 @@ library dartdoc.templates; import 'package:analyzer/file_system/file_system.dart'; -import 'package:dartdoc/dartdoc.dart'; import 'package:dartdoc/options.dart'; +import 'package:dartdoc/src/element_type.dart'; +import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/generator/resource_loader.dart'; import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/generator/templates.aot_renderers_for_html.dart' @@ -40,6 +41,7 @@ import 'package:dartdoc/src/generator/templates.runtime_renderers.dart' import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; +import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/mustachio/annotations.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:meta/meta.dart'; diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index 2cf98c9c6b..f7fa4d9ad4 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -5,7 +5,7 @@ // ignore_for_file: camel_case_types, deprecated_member_use_from_same_package // ignore_for_file: unused_import -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -13,6 +13,7 @@ import 'package:dartdoc/src/model/extension_target.dart'; import 'package:dartdoc/src/model/feature.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; +import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/mustachio/parser.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:dartdoc/src/warnings.dart'; diff --git a/lib/src/model/comment_referable.dart b/lib/src/model/comment_referable.dart index d7696cfa0e..b60174ecfa 100644 --- a/lib/src/model/comment_referable.dart +++ b/lib/src/model/comment_referable.dart @@ -11,7 +11,8 @@ import 'dart:core'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/scope.dart'; -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/package_graph.dart'; import 'package:meta/meta.dart'; class ReferenceChildrenLookup { diff --git a/lib/src/model/package_graph.dart b/lib/src/model/package_graph.dart index 937641a0e4..07b26ef911 100644 --- a/lib/src/model/package_graph.dart +++ b/lib/src/model/package_graph.dart @@ -10,8 +10,8 @@ import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/src/generated/sdk.dart'; import 'package:analyzer/src/generated/source.dart'; import 'package:analyzer/src/generated/source_io.dart'; -import 'package:dartdoc/dartdoc.dart' show DartdocFailure; import 'package:dartdoc/src/dartdoc_options.dart'; +import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/logging.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; import 'package:dartdoc/src/model/model.dart'; diff --git a/lib/src/model_utils.dart b/lib/src/model_utils.dart index 26dc519338..05de7de0c1 100644 --- a/lib/src/model_utils.dart +++ b/lib/src/model_utils.dart @@ -11,7 +11,7 @@ import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/src/dart/ast/utilities.dart'; -import 'package:dartdoc/dartdoc.dart' show DartdocFailure; +import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:glob/glob.dart'; import 'package:path/path.dart' as path; diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart index 603a9f4e3a..0bf497a874 100644 --- a/lib/src/package_meta.dart +++ b/lib/src/package_meta.dart @@ -11,7 +11,8 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/file_system/physical_file_system.dart'; import 'package:analyzer/src/generated/sdk.dart'; -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/src/dartdoc_options.dart'; +import 'package:dartdoc/src/failure.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart' as p; import 'package:yaml/yaml.dart'; diff --git a/lib/src/render/element_type_renderer.dart b/lib/src/render/element_type_renderer.dart index 5ef50c24af..3da78c6170 100644 --- a/lib/src/render/element_type_renderer.dart +++ b/lib/src/render/element_type_renderer.dart @@ -2,7 +2,7 @@ // 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/dartdoc.dart'; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/render/parameter_renderer.dart'; abstract class ElementTypeRenderer { diff --git a/lib/src/render/renderer_factory.dart b/lib/src/render/renderer_factory.dart index 9bc6d3ba11..f975fdf1e6 100644 --- a/lib/src/render/renderer_factory.dart +++ b/lib/src/render/renderer_factory.dart @@ -2,7 +2,7 @@ // 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/dartdoc.dart'; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/render/category_renderer.dart'; import 'package:dartdoc/src/render/documentation_renderer.dart'; import 'package:dartdoc/src/render/element_type_renderer.dart'; diff --git a/test/end2end/dartdoc_integration_test.dart b/test/end2end/dartdoc_integration_test.dart index c8bddf94ab..fa4e39d2f1 100644 --- a/test/end2end/dartdoc_integration_test.dart +++ b/test/end2end/dartdoc_integration_test.dart @@ -8,7 +8,7 @@ import 'dart:async'; import 'dart:io'; import 'dart:mirrors'; -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/src/package_meta.dart'; import 'package:path/path.dart' as path; import 'package:test/test.dart'; diff --git a/test/end2end/dartdoc_test.dart b/test/end2end/dartdoc_test.dart index 9e53722e9f..ffca881e24 100644 --- a/test/end2end/dartdoc_test.dart +++ b/test/end2end/dartdoc_test.dart @@ -8,10 +8,18 @@ import 'dart:async'; import 'dart:io' show Platform; import 'package:analyzer/file_system/file_system.dart'; -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/dartdoc.dart' show Dartdoc, DartdocResults; import 'package:dartdoc/options.dart'; +import 'package:dartdoc/src/dartdoc_options.dart'; +import 'package:dartdoc/src/failure.dart'; +import 'package:dartdoc/src/generator/generator.dart'; import 'package:dartdoc/src/io_utils.dart'; import 'package:dartdoc/src/logging.dart'; +import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/package_builder.dart'; +import 'package:dartdoc/src/model/package_graph.dart'; +import 'package:dartdoc/src/package_config_provider.dart'; +import 'package:dartdoc/src/package_meta.dart'; import 'package:dartdoc/src/warnings.dart'; import 'package:path/path.dart' as path; import 'package:pub_semver/pub_semver.dart'; diff --git a/test/html_generator_test.dart b/test/html_generator_test.dart index 899fb1b49d..0eb9d8ff61 100644 --- a/test/html_generator_test.dart +++ b/test/html_generator_test.dart @@ -4,12 +4,14 @@ import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/file_system/memory_file_system.dart'; -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/dartdoc.dart' show DartdocFileWriter; import 'package:dartdoc/src/generator/generator_frontend.dart'; import 'package:dartdoc/src/generator/html_generator.dart'; import 'package:dartdoc/src/generator/html_resources.g.dart'; import 'package:dartdoc/src/generator/resource_loader.dart'; import 'package:dartdoc/src/generator/templates.dart'; +import 'package:dartdoc/src/package_config_provider.dart'; +import 'package:dartdoc/src/package_meta.dart'; import 'package:dartdoc/src/warnings.dart'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; diff --git a/test/mustachio/foo.runtime_renderers.dart b/test/mustachio/foo.runtime_renderers.dart index 118a2c88b0..e1b31ca1eb 100644 --- a/test/mustachio/foo.runtime_renderers.dart +++ b/test/mustachio/foo.runtime_renderers.dart @@ -5,7 +5,7 @@ // ignore_for_file: camel_case_types, deprecated_member_use_from_same_package // ignore_for_file: unused_import -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -13,6 +13,7 @@ import 'package:dartdoc/src/model/extension_target.dart'; import 'package:dartdoc/src/model/feature.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; +import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/mustachio/parser.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:dartdoc/src/warnings.dart'; diff --git a/test/mustachio/renderers_output_test.dart b/test/mustachio/renderers_output_test.dart index 89bbc0ebea..f7d0b99313 100644 --- a/test/mustachio/renderers_output_test.dart +++ b/test/mustachio/renderers_output_test.dart @@ -8,10 +8,15 @@ import 'dart:async'; import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/file_system/memory_file_system.dart'; -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/dartdoc.dart' show Dartdoc, DartdocFileWriter; import 'package:dartdoc/options.dart'; +import 'package:dartdoc/src/dartdoc_options.dart'; +import 'package:dartdoc/src/generator/generator.dart'; import 'package:dartdoc/src/generator/html_generator.dart'; import 'package:dartdoc/src/io_utils.dart'; +import 'package:dartdoc/src/model/package_builder.dart'; +import 'package:dartdoc/src/package_config_provider.dart'; +import 'package:dartdoc/src/package_meta.dart'; import 'package:test/test.dart'; /// Convenience factory to build a [DartdocGeneratorOptionContext] and associate diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index 4636e2478c..59905ebc84 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -81,7 +81,7 @@ class RuntimeRenderersBuilder { // ignore_for_file: camel_case_types, deprecated_member_use_from_same_package // ignore_for_file: unused_import -import 'package:dartdoc/dartdoc.dart'; +import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; import 'package:dartdoc/src/model/comment_referable.dart'; @@ -89,6 +89,7 @@ import 'package:dartdoc/src/model/extension_target.dart'; import 'package:dartdoc/src/model/feature.dart'; import 'package:dartdoc/src/model/feature_set.dart'; import 'package:dartdoc/src/model/language_feature.dart'; +import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/mustachio/parser.dart'; import 'package:dartdoc/src/mustachio/renderer_base.dart'; import 'package:dartdoc/src/warnings.dart'; From f146d9d04264be0f51f86b0d9b743d20f089bbda Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 27 Sep 2021 08:51:16 -0700 Subject: [PATCH 3/9] Enforce strict-raw-types (#2791) * Enforce strict-raw-types * presubmit Co-authored-by: Janice Collins --- analysis_options.yaml | 2 ++ analysis_options_presubmit.yaml | 2 ++ lib/src/dartdoc_options.dart | 2 +- lib/src/io_utils.dart | 2 +- lib/src/mustachio/annotations.dart | 2 +- lib/src/mustachio/renderer_base.dart | 6 ++--- test/html_generator_test.dart | 5 ++-- tool/grind.dart | 39 ++++++++++++++++------------ tool/subprocess_launcher.dart | 16 +++++++----- 9 files changed, 45 insertions(+), 31 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 73752b0ec1..261318542d 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -7,6 +7,8 @@ analyzer: todo: ignore unused_import: warning unused_shown_name: warning + language: + strict-raw-types: true exclude: - 'doc/**' - 'lib/src/third_party/pkg/**' diff --git a/analysis_options_presubmit.yaml b/analysis_options_presubmit.yaml index 26dffd27ac..6802b0962b 100644 --- a/analysis_options_presubmit.yaml +++ b/analysis_options_presubmit.yaml @@ -10,6 +10,8 @@ analyzer: ### Extra ignores for presubmit deprecated_member_use: ignore deprecated_member_use_from_same_package: ignore + language: + strict-raw-types: true exclude: - 'doc/**' - 'lib/src/third_party/pkg/**' diff --git a/lib/src/dartdoc_options.dart b/lib/src/dartdoc_options.dart index 65adb82f77..674da23f73 100644 --- a/lib/src/dartdoc_options.dart +++ b/lib/src/dartdoc_options.dart @@ -338,7 +338,7 @@ class _OptionValueWithContext { /// /// Use via implementations [DartdocOptionSet], [DartdocOptionArgFile], /// [DartdocOptionArgOnly], and [DartdocOptionFileOnly]. -abstract class DartdocOption { +abstract class DartdocOption { /// This is the value returned if we couldn't find one otherwise. final T defaultsTo; diff --git a/lib/src/io_utils.dart b/lib/src/io_utils.dart index 2be1ffa625..0cf7693ad4 100644 --- a/lib/src/io_utils.dart +++ b/lib/src/io_utils.dart @@ -144,7 +144,7 @@ class _TaskQueueItem { /// the number of simultaneous tasks. /// /// The tasks return results of type T. -class TaskQueue { +class TaskQueue { /// Creates a task queue with a maximum number of simultaneous jobs. /// The [maxJobs] parameter defaults to the number of CPU cores on the /// system. diff --git a/lib/src/mustachio/annotations.dart b/lib/src/mustachio/annotations.dart index 17e837983e..671ce0c9cd 100644 --- a/lib/src/mustachio/annotations.dart +++ b/lib/src/mustachio/annotations.dart @@ -20,7 +20,7 @@ class Renderer { final Symbol name; /// The type of the context type, specified as the [Context] type argument. - final Context context; + final Context context; /// The unparsed, string form of the URI of the _standard_ HTML template. /// diff --git a/lib/src/mustachio/renderer_base.dart b/lib/src/mustachio/renderer_base.dart index 85fcfa8f9d..e85f341cbf 100644 --- a/lib/src/mustachio/renderer_base.dart +++ b/lib/src/mustachio/renderer_base.dart @@ -132,12 +132,12 @@ class Template { } /// The base class for a generated Mustache renderer. -abstract class RendererBase { +abstract class RendererBase { /// The context object which this renderer can render. final T context; /// The renderer of the parent context, if any, otherwise `null`. - final RendererBase parent; + final RendererBase parent; /// The current template being rendered. /// @@ -288,7 +288,7 @@ abstract class RendererBase { String renderSimple( Object context, List ast, Template template, StringSink sink, - {@required RendererBase parent, Set getters}) { + {@required RendererBase parent, Set getters}) { var renderer = SimpleRenderer(context, parent, template, sink, getters); renderer.renderBlock(ast); return renderer.sink.toString(); diff --git a/test/html_generator_test.dart b/test/html_generator_test.dart index 0eb9d8ff61..2c1d3ac93f 100644 --- a/test/html_generator_test.dart +++ b/test/html_generator_test.dart @@ -162,12 +162,13 @@ const Matcher doesExist = _DoesExist(); class _DoesExist extends Matcher { const _DoesExist(); @override - bool matches(Object item, Map matchState) => (item as Resource).exists; + bool matches(Object item, Map matchState) => + (item as Resource).exists; @override Description describe(Description description) => description.add('exists'); @override Description describeMismatch(Object item, Description mismatchDescription, - Map matchState, bool verbose) { + Map matchState, bool verbose) { if (item is! File && item is! Folder) { return mismatchDescription .addDescriptionOf(item) diff --git a/tool/grind.dart b/tool/grind.dart index 28d60dc34e..bb0bce9d4b 100644 --- a/tool/grind.dart +++ b/tool/grind.dart @@ -327,7 +327,7 @@ void presubmit() => null; void buildbot() => null; @Task('Generate docs for the Dart SDK') -Future buildSdkDocs() async { +Future buildSdkDocs() async { log('building SDK docs'); await _buildSdkDocs(sdkDocsDir.path, Future.value(Directory.current.path)); } @@ -426,8 +426,11 @@ class WarningsCollection { } /// Returns a map of warning texts to the number of times each has been seen. -WarningsCollection jsonMessageIterableToWarnings(Iterable messageIterable, - String tempPath, String pubDir, String branch) { +WarningsCollection jsonMessageIterableToWarnings( + Iterable> messageIterable, + String tempPath, + String pubDir, + String branch) { var warningTexts = WarningsCollection(tempPath, pubDir, branch); if (messageIterable == null) return warningTexts; for (Map message in messageIterable) { @@ -442,13 +445,13 @@ WarningsCollection jsonMessageIterableToWarnings(Iterable messageIterable, } @Task('Display delta in SDK warnings') -Future compareSdkWarnings() async { +Future compareSdkWarnings() async { var originalDartdocSdkDocs = Directory.systemTemp.createTempSync('dartdoc-comparison-sdkdocs'); - Future originalDartdoc = createComparisonDartdoc(); - Future currentDartdocSdkBuild = _buildSdkDocs( + var originalDartdoc = createComparisonDartdoc(); + var currentDartdocSdkBuild = _buildSdkDocs( sdkDocsDir.path, Future.value(Directory.current.path), 'current'); - Future originalDartdocSdkBuild = + var originalDartdocSdkBuild = _buildSdkDocs(originalDartdocSdkDocs.path, originalDartdoc, 'original'); var currentDartdocWarnings = jsonMessageIterableToWarnings( await currentDartdocSdkBuild, sdkDocsDir.absolute.path, null, 'HEAD'); @@ -540,7 +543,8 @@ Future testWithAnalyzerSdk() async { workingDirectory: sdkDartdoc); } -Future> _buildSdkDocs(String sdkDocsPath, Future futureCwd, +Future>> _buildSdkDocs( + String sdkDocsPath, Future futureCwd, [String label]) async { label ??= ''; if (label != '') label = '-$label'; @@ -562,15 +566,16 @@ Future> _buildSdkDocs(String sdkDocsPath, Future futureCwd, workingDirectory: cwd); } -Future> _buildTestPackageDocs(String outputDir, String cwd, +Future>> _buildTestPackageDocs( + String outputDir, String cwd, {List params, String label = '', String testPackagePath}) async { if (label != '') label = '-$label'; testPackagePath ??= testPackage.absolute.path; params ??= []; var launcher = SubprocessLauncher('build-test-package-docs$label'); - Future testPackagePubGet = launcher.runStreamed(sdkBin('pub'), ['get'], + var testPackagePubGet = launcher.runStreamed(sdkBin('pub'), ['get'], workingDirectory: testPackagePath); - Future dartdocPubGet = + var dartdocPubGet = launcher.runStreamed(sdkBin('pub'), ['get'], workingDirectory: cwd); await Future.wait([testPackagePubGet, dartdocPubGet]); return await launcher.runStreamed( @@ -687,12 +692,12 @@ Future serveSdkDocs() async { Future compareFlutterWarnings() async { var originalDartdocFlutter = Directory.systemTemp.createTempSync('dartdoc-comparison-flutter'); - Future originalDartdoc = createComparisonDartdoc(); + var originalDartdoc = createComparisonDartdoc(); var envCurrent = _createThrowawayPubCache(); var envOriginal = _createThrowawayPubCache(); - Future currentDartdocFlutterBuild = _buildFlutterDocs(flutterDir.path, + var currentDartdocFlutterBuild = _buildFlutterDocs(flutterDir.path, Future.value(Directory.current.path), envCurrent, 'docs-current'); - Future originalDartdocFlutterBuild = _buildFlutterDocs( + var originalDartdocFlutterBuild = _buildFlutterDocs( originalDartdocFlutter.path, originalDartdoc, envOriginal, @@ -714,7 +719,7 @@ Future compareFlutterWarnings() async { if (Platform.environment['SERVE_FLUTTER'] == '1') { var launcher = SubprocessLauncher('serve-flutter-docs'); await launcher.runStreamed(sdkBin('pub'), ['get']); - Future original = launcher.runStreamed(sdkBin('pub'), [ + var original = launcher.runStreamed(sdkBin('pub'), [ 'global', 'run', 'dhttpd', @@ -723,7 +728,7 @@ Future compareFlutterWarnings() async { '--path', path.join(originalDartdocFlutter.absolute.path, 'dev', 'docs', 'doc'), ]); - Future current = launcher.runStreamed(sdkBin('pub'), [ + var current = launcher.runStreamed(sdkBin('pub'), [ 'global', 'run', 'dhttpd', @@ -909,7 +914,7 @@ class FlutterRepo { SubprocessLauncher launcher; } -Future> _buildFlutterDocs( +Future>> _buildFlutterDocs( String flutterPath, Future futureCwd, Map env, [String label]) async { var flutterRepo = await FlutterRepo.copyFromExistingFlutterRepo( diff --git a/tool/subprocess_launcher.dart b/tool/subprocess_launcher.dart index e25646e753..3385f9d1d8 100644 --- a/tool/subprocess_launcher.dart +++ b/tool/subprocess_launcher.dart @@ -25,7 +25,9 @@ class CoverageSubprocessLauncher extends SubprocessLauncher { Platform.environment.containsKey('COVERAGE_TOKEN'); /// A list of all coverage results picked up by all launchers. - static List>> coverageResults = []; + // TODO(srawlins): Refactor this to one or more type aliases once the feature + // is enabled. + static List>>> coverageResults = []; static Directory _tempDir; static Directory get tempDir { @@ -71,7 +73,8 @@ class CoverageSubprocessLauncher extends SubprocessLauncher { } @override - Future> runStreamed(String executable, List arguments, + Future>> runStreamed( + String executable, List arguments, {String workingDirectory, Map environment, bool includeParentEnvironment = true, @@ -92,7 +95,7 @@ class CoverageSubprocessLauncher extends SubprocessLauncher { } } - Completer> coverageResult; + Completer>> coverageResult; if (coverageEnabled) { coverageResult = Completer(); @@ -168,21 +171,22 @@ class SubprocessLauncher { /// Windows (though some of the bashisms will no longer make sense). /// TODO(jcollins-g): refactor to return a stream of stderr/stdout lines /// and their associated JSON objects. - Future> runStreamed(String executable, List arguments, + Future>> runStreamed( + String executable, List arguments, {String workingDirectory, Map environment, bool includeParentEnvironment = true, void Function(String) perLine}) async { environment ??= {}; environment.addAll(environmentDefaults); - List jsonObjects; + List> jsonObjects; /// Allow us to pretend we didn't pass the JSON flag in to dartdoc by /// printing what dartdoc would have printed without it, yet storing /// json objects into [jsonObjects]. Iterable jsonCallback(String line) { if (perLine != null) perLine(line); - Map result; + Map result; try { result = json.decoder.convert(line); } on FormatException { From 0823f2f103f77ac25dccca9c8f04e9177b115287 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Mon, 27 Sep 2021 12:32:59 -0700 Subject: [PATCH 4/9] Remove some imports of model.dart (#2809) --- lib/src/model/comment_referable.dart | 6 +++++- test/end2end/dartdoc_test.dart | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/src/model/comment_referable.dart b/lib/src/model/comment_referable.dart index b60174ecfa..3c872f0339 100644 --- a/lib/src/model/comment_referable.dart +++ b/lib/src/model/comment_referable.dart @@ -11,7 +11,11 @@ import 'dart:core'; import 'package:analyzer/dart/element/element.dart'; import 'package:analyzer/dart/element/scope.dart'; -import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/accessor.dart'; +import 'package:dartdoc/src/model/container.dart'; +import 'package:dartdoc/src/model/library.dart'; +import 'package:dartdoc/src/model/model_element.dart'; +import 'package:dartdoc/src/model/nameable.dart'; import 'package:dartdoc/src/model/package_graph.dart'; import 'package:meta/meta.dart'; diff --git a/test/end2end/dartdoc_test.dart b/test/end2end/dartdoc_test.dart index ffca881e24..640f4b1218 100644 --- a/test/end2end/dartdoc_test.dart +++ b/test/end2end/dartdoc_test.dart @@ -15,7 +15,9 @@ import 'package:dartdoc/src/failure.dart'; import 'package:dartdoc/src/generator/generator.dart'; import 'package:dartdoc/src/io_utils.dart'; import 'package:dartdoc/src/logging.dart'; -import 'package:dartdoc/src/model/model.dart'; +import 'package:dartdoc/src/model/class.dart'; +import 'package:dartdoc/src/model/documentable.dart'; +import 'package:dartdoc/src/model/model_element.dart'; import 'package:dartdoc/src/model/package_builder.dart'; import 'package:dartdoc/src/model/package_graph.dart'; import 'package:dartdoc/src/package_config_provider.dart'; From a3ca4cf744f312a463850e3ca0f2d654c501443f Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Mon, 27 Sep 2021 15:19:47 -0700 Subject: [PATCH 5/9] Fix an enum-related assert in canonicalization (#2812) * Allow magical accessors from nowhere if they are Enum related * intermediate * dartfmt * Add a stub Enum class since that's now in the required list --- lib/src/model/enum.dart | 10 ++++++++-- lib/src/special_elements.dart | 5 +++++ testing/sky_engine/sdk/core.dart | 6 ++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/src/model/enum.dart b/lib/src/model/enum.dart index bb9259a19a..8423136c2c 100644 --- a/lib/src/model/enum.dart +++ b/lib/src/model/enum.dart @@ -6,13 +6,13 @@ import 'package:analyzer/dart/element/element.dart'; import 'package:dartdoc/src/model/model.dart'; import 'package:dartdoc/src/render/enum_field_renderer.dart'; +import 'package:dartdoc/src/special_elements.dart'; -class Enum extends InheritingContainer { +class Enum extends InheritingContainer with TypeImplementing { Enum(ClassElement element, Library library, PackageGraph packageGraph) : super(element, library, packageGraph); List _inheritanceChain; - @override List get inheritanceChain { if (_inheritanceChain == null) { @@ -23,6 +23,12 @@ class Enum extends InheritingContainer { in superChain.map((e) => (e.modelElement as InheritingContainer))) { _inheritanceChain.addAll(c.inheritanceChain); } + + _inheritanceChain.addAll(interfaces.expand( + (e) => (e.modelElement as InheritingContainer).inheritanceChain)); + + assert(_inheritanceChain + .contains(packageGraph.specialClasses[SpecialClass.enumClass])); } return _inheritanceChain.toList(growable: false); } diff --git a/lib/src/special_elements.dart b/lib/src/special_elements.dart index 67b45197b4..73842d6647 100644 --- a/lib/src/special_elements.dart +++ b/lib/src/special_elements.dart @@ -23,6 +23,9 @@ enum SpecialClass { /// From dart:core, pragma pragma, + + /// From dart:core, Enum + enumClass, } /// A declaration of a special [Class] and how to find it. @@ -70,6 +73,8 @@ class _SpecialClassDefinition { const Map _specialClassDefinitions = { 'Object': _SpecialClassDefinition( SpecialClass.object, 'Object', 'dart.core', 'dart:core'), + 'Enum': _SpecialClassDefinition( + SpecialClass.enumClass, 'Enum', 'dart.core', 'dart:core'), 'Interceptor': _SpecialClassDefinition(SpecialClass.interceptor, 'Interceptor', '_interceptors', 'dart:_interceptors', required: false), diff --git a/testing/sky_engine/sdk/core.dart b/testing/sky_engine/sdk/core.dart index f53c9aace5..d095997b31 100644 --- a/testing/sky_engine/sdk/core.dart +++ b/testing/sky_engine/sdk/core.dart @@ -57,6 +57,12 @@ abstract class Map extends Object { class Null extends Object {} +abstract class Enum { + int get index; + + String get _name; +} + abstract class num implements Comparable { num operator %(num other); num operator *(num other); From 04945d9cacd84d64cec9e2cd5965261126dea570 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Tue, 28 Sep 2021 09:19:17 -0700 Subject: [PATCH 6/9] Fix StringTrie so it handles partial matches better (#2813) --- lib/src/comment_references/parser.dart | 19 +++++++++++++------ test/comment_referable/parser_test.dart | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/lib/src/comment_references/parser.dart b/lib/src/comment_references/parser.dart index 0f709823fe..ce40bf37f2 100644 --- a/lib/src/comment_references/parser.dart +++ b/lib/src/comment_references/parser.dart @@ -36,15 +36,22 @@ class StringTrie { /// Does [this] node represent a valid entry in the trie? bool valid = false; - /// Greedily match on the string trie. Returns the index of the first - /// non-operator character if valid, otherwise -1. - int match(String toMatch, [int index = 0]) { - if (index < 0 || index >= toMatch.length) return valid ? index : 1; + /// Greedily match on the string trie starting at the given index. Returns + /// the index of the first non-operator character if a match is valid, + /// otherwise -1. + int match(String toMatch, [int index = 0, int lastValid = -1]) { + if (index < 0 || index > toMatch.length) { + return lastValid; + } + if (index == toMatch.length) { + return valid ? index : lastValid; + } var matchChar = toMatch.codeUnitAt(index); if (children.containsKey(matchChar)) { - return children[matchChar].match(toMatch, index + 1); + lastValid = valid ? index : lastValid; + return children[matchChar].match(toMatch, index + 1, lastValid); } - return valid ? index : -1; + return valid ? index : lastValid; } void addWord(String toAdd) { diff --git a/test/comment_referable/parser_test.dart b/test/comment_referable/parser_test.dart index 12d9b97c68..4eae8647dd 100644 --- a/test/comment_referable/parser_test.dart +++ b/test/comment_referable/parser_test.dart @@ -27,8 +27,30 @@ void main() { isEmpty); } + group('StringTrie tests', () { + test('test partials', () { + var trie = StringTrie()..addWord('longerString'); + expect(trie.match('l'), equals(-1)); + expect(trie.match('longerStringWithExtras'), equals(12)); + expect(trie.match('longerString'), equals(12)); + expect(trie.match('prefix-longerString'), equals(-1)); + }); + + test('substrings', () { + var trie = StringTrie(); + trie.addWord('aString'); + trie.addWord('aStr'); + trie.addWord('a'); + expect(trie.match('a'), equals(1)); + expect(trie.match('aS'), equals(1)); + expect(trie.match('aStr'), equals(4)); + expect(trie.match('aStringTwo'), equals(7)); + }); + }); + group('Basic comment reference parsing', () { test('Check that basic references parse', () { + expectParseEquivalent('Funvas.u', ['Funvas', 'u']); expectParseEquivalent('valid', ['valid']); expectParseEquivalent('new valid', ['valid'], constructorHint: true); expectParseEquivalent('valid()', ['valid'], callableHint: true); From a4142c4bd9e3b27be9226af976de792580118bbc Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Tue, 28 Sep 2021 10:54:11 -0700 Subject: [PATCH 7/9] Try updating setup-dart (#2807) --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 436c9accc1..79119acbc9 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -64,7 +64,7 @@ jobs: if: runner.os == 'Windows' run: git config --global core.autocrlf input - uses: actions/checkout@v2 - - uses: dart-lang/setup-dart@v1.0 + - uses: dart-lang/setup-dart@v1.2 with: sdk: ${{ matrix.sdk }} - name: Install dependencies From 69ca0c9ea44925eb6dba0add4eed7d67021f9262 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Tue, 28 Sep 2021 10:59:03 -0700 Subject: [PATCH 8/9] getAs -> getValueAs --- lib/src/dartdoc_options.dart | 5 +++- .../templates.runtime_renderers.dart | 1 + lib/src/warnings.dart | 24 ++++++++----------- test/mustachio/foo.runtime_renderers.dart | 1 + tool/mustachio/codegen_runtime_renderer.dart | 1 + 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/lib/src/dartdoc_options.dart b/lib/src/dartdoc_options.dart index f3cbc7242d..5dce4b6d44 100644 --- a/lib/src/dartdoc_options.dart +++ b/lib/src/dartdoc_options.dart @@ -491,9 +491,11 @@ abstract class DartdocOption { /// type. If [mustExist] is true, will throw [DartdocFileMissing] for command /// line parameters and file paths in config files that don't point to /// corresponding files or directories. + // TODO(jcollins-g): use of dynamic. https://github.com/dart-lang/dartdoc/issues/2814 dynamic valueAt(Folder dir); /// Calls [valueAt] with the working directory at the start of the program. + // TODO(jcollins-g): use of dynamic. https://github.com/dart-lang/dartdoc/issues/2814 dynamic valueAtCurrent() => valueAt(_directoryCurrent); late final Folder _directoryCurrent = @@ -525,7 +527,8 @@ abstract class DartdocOption { } /// Get the immediate child of this node named [name] as a [DartdocOption]. - DartdocOption getAs(String name) => _children[name] as DartdocOption; + U getValueAs(String name, Folder dir) => + _children[name]?.valueAt(dir) as U; /// Apply the function [visit] to [this] and all children. void traverse(void Function(DartdocOption option) visit) { diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index cbde01c0d1..5990461e0b 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -5,6 +5,7 @@ // ignore_for_file: camel_case_types, deprecated_member_use_from_same_package // ignore_for_file: unused_import +// @dart=2.9 import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; diff --git a/lib/src/warnings.dart b/lib/src/warnings.dart index ddf05aa2fd..85b1a3318a 100644 --- a/lib/src/warnings.dart +++ b/lib/src/warnings.dart @@ -380,7 +380,7 @@ class PackageWarningOptions { // Interpret errors/warnings/ignore options. In the event of conflict, // warning overrides error and ignore overrides warning. var errorsForDir = - option.parent.getAs?>('errors').valueAt(dir) ?? []; + option.parent.getValueAs?>('errors', dir) ?? []; for (var warningName in errorsForDir) { var packageWarnings = packageWarningsByName[warningName]; if (packageWarnings != null) { @@ -388,7 +388,7 @@ class PackageWarningOptions { } } var warningsForDir = - option.parent.getAs?>('warnings').valueAt(dir) ?? []; + option.parent.getValueAs?>('warnings', dir) ?? []; for (var warningName in warningsForDir) { var packageWarnings = packageWarningsByName[warningName]; if (packageWarnings != null) { @@ -396,7 +396,7 @@ class PackageWarningOptions { } } var ignoredForDir = - option.parent.getAs?>('ignore').valueAt(dir) ?? []; + option.parent.getValueAs?>('ignore', dir) ?? []; for (var warningName in ignoredForDir) { var packageWarnings = packageWarningsByName[warningName]; if (packageWarnings != null) { @@ -405,18 +405,14 @@ class PackageWarningOptions { } // Check whether warnings are allowed at all in this package. - var allowWarningsInPackages = option.parent - .getAs?>('allowWarningsInPackages') - .valueAt(dir); - var allowErrorsInPackages = option.parent - .getAs?>('allowErrorsInPackages') - .valueAt(dir); + var allowWarningsInPackages = + option.parent.getValueAs?>('allowWarningsInPackages', dir); + var allowErrorsInPackages = + option.parent.getValueAs?>('allowErrorsInPackages', dir); var ignoreWarningsInPackages = option.parent - .getAs?>('ignoreWarningsInPackages') - .valueAt(dir); - var ignoreErrorsInPackages = option.parent - .getAs?>('ignoreErrorsInPackages') - .valueAt(dir); + .getValueAs?>('ignoreWarningsInPackages', dir); + var ignoreErrorsInPackages = + option.parent.getValueAs?>('ignoreErrorsInPackages', dir); if (allowWarningsInPackages != null && !allowWarningsInPackages.contains(packageMeta.name)) { PackageWarning.values diff --git a/test/mustachio/foo.runtime_renderers.dart b/test/mustachio/foo.runtime_renderers.dart index e1b31ca1eb..aaeee2e041 100644 --- a/test/mustachio/foo.runtime_renderers.dart +++ b/test/mustachio/foo.runtime_renderers.dart @@ -5,6 +5,7 @@ // ignore_for_file: camel_case_types, deprecated_member_use_from_same_package // ignore_for_file: unused_import +// @dart=2.9 import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; diff --git a/tool/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index 697552d121..0cf76fb1a2 100644 --- a/tool/mustachio/codegen_runtime_renderer.dart +++ b/tool/mustachio/codegen_runtime_renderer.dart @@ -80,6 +80,7 @@ class RuntimeRenderersBuilder { // ignore_for_file: camel_case_types, deprecated_member_use_from_same_package // ignore_for_file: unused_import +// @dart=2.9 import 'package:dartdoc/src/element_type.dart'; import 'package:dartdoc/src/generator/template_data.dart'; import 'package:dartdoc/src/model/annotation.dart'; From 9c5a03e2fc46b2918f80c996ce19b6fdfa0cfcf0 Mon Sep 17 00:00:00 2001 From: Janice Collins Date: Tue, 28 Sep 2021 10:59:48 -0700 Subject: [PATCH 9/9] comment --- lib/src/dartdoc_options.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/dartdoc_options.dart b/lib/src/dartdoc_options.dart index 5dce4b6d44..f03e806dce 100644 --- a/lib/src/dartdoc_options.dart +++ b/lib/src/dartdoc_options.dart @@ -526,7 +526,7 @@ abstract class DartdocOption { return _children[name]!; } - /// Get the immediate child of this node named [name] as a [DartdocOption]. + /// Get the immediate child of this node named [name] and its value at [dir]. U getValueAs(String name, Folder dir) => _children[name]?.valueAt(dir) as U;