diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 13891e7fa5..58453558d5 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -38,11 +38,33 @@ 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 - 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 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 f9b11470d9..5142dee80f 100644 --- a/analysis_options_presubmit.yaml +++ b/analysis_options_presubmit.yaml @@ -12,6 +12,8 @@ analyzer: deprecated_member_use_from_same_package: ignore ### Temporary presubmit ignore for NNBD migration import_of_legacy_library_into_null_safe: ignore + language: + strict-raw-types: true exclude: - 'doc/**' - 'lib/src/third_party/pkg/**' diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart index 5080811d30..fad967311b 100644 --- a/lib/dartdoc.dart +++ b/lib/dartdoc.dart @@ -17,6 +17,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'; @@ -529,17 +530,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/comment_references/parser.dart b/lib/src/comment_references/parser.dart index 5624c169f7..8a17681aff 100644 --- a/lib/src/comment_references/parser.dart +++ b/lib/src/comment_references/parser.dart @@ -39,15 +39,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/lib/src/dartdoc_options.dart b/lib/src/dartdoc_options.dart index c3e0d09254..f03e806dce 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'; @@ -335,7 +336,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; @@ -457,7 +458,7 @@ abstract class DartdocOption { /// The [DartdocOptionRoot] containing this object. DartdocOptionRoot get root { - DartdocOption p = this; + DartdocOption p = this; while (p is! DartdocOptionRoot) { p = p.parent; } @@ -467,7 +468,7 @@ abstract class DartdocOption { /// All object names starting at the root. Iterable get keys { var keyList = []; - DartdocOption option = this; + DartdocOption option = this; while (option is! DartdocOptionRoot) { keyList.add(option.name); option = option.parent; @@ -490,10 +491,12 @@ 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. - T? valueAt(Folder dir); + // 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. - T? valueAtCurrent() => valueAt(_directoryCurrent); + // TODO(jcollins-g): use of dynamic. https://github.com/dart-lang/dartdoc/issues/2814 + dynamic valueAtCurrent() => valueAt(_directoryCurrent); late final Folder _directoryCurrent = resourceProvider.getFolder(_directoryCurrentPath); @@ -523,8 +526,9 @@ abstract class DartdocOption { return _children[name]!; } - /// Get the immediate child of this node named [name] as a [DartdocOption]. - DartdocOption getAs(String name) => _children[name] as 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; /// Apply the function [visit] to [this] and all children. void traverse(void Function(DartdocOption option) visit) { 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 44967238da..85f085bd3c 100644 --- a/lib/src/generator/dartdoc_generator_backend.dart +++ b/lib/src/generator/dartdoc_generator_backend.dart @@ -5,12 +5,14 @@ // @dart=2.9 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; @@ -41,7 +43,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 dd39234d88..f59960f82e 100644 --- a/lib/src/generator/templates.dart +++ b/lib/src/generator/templates.dart @@ -29,8 +29,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' @@ -42,6 +43,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 d4510d7b66..5990461e0b 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -6,7 +6,7 @@ // ignore_for_file: camel_case_types, deprecated_member_use_from_same_package // ignore_for_file: unused_import // @dart=2.9 -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'; @@ -14,6 +14,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'; @@ -4229,6 +4230,7 @@ class _Renderer_Enum extends RendererBase { CT_, () => { ..._Renderer_InheritingContainer.propertyMap(), + ..._Renderer_TypeImplementing.propertyMap(), 'inheritanceChain': Property( getValue: (CT_ c) => c.inheritanceChain, renderVariable: (CT_ c, Property self, diff --git a/lib/src/io_utils.dart b/lib/src/io_utils.dart index 944bc36e1a..35047aa123 100644 --- a/lib/src/io_utils.dart +++ b/lib/src/io_utils.dart @@ -145,7 +145,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/model/comment_referable.dart b/lib/src/model/comment_referable.dart index 224b2409bd..02c33f5c2d 100644 --- a/lib/src/model/comment_referable.dart +++ b/lib/src/model/comment_referable.dart @@ -13,7 +13,12 @@ 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/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'; class ReferenceChildrenLookup { diff --git a/lib/src/model/enum.dart b/lib/src/model/enum.dart index 093dc23c5e..9f97612bbf 100644 --- a/lib/src/model/enum.dart +++ b/lib/src/model/enum.dart @@ -8,13 +8,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) { @@ -25,6 +25,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/model/package_graph.dart b/lib/src/model/package_graph.dart index b8cc3731ea..0e84852cc3 100644 --- a/lib/src/model/package_graph.dart +++ b/lib/src/model/package_graph.dart @@ -12,8 +12,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 2a79fec543..5c4d03d831 100644 --- a/lib/src/model_utils.dart +++ b/lib/src/model_utils.dart @@ -13,7 +13,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/mustachio/annotations.dart b/lib/src/mustachio/annotations.dart index a0c57e8689..5469ed983a 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 77d1db8f69..c179c2f43e 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. /// @@ -289,13 +289,8 @@ abstract class RendererBase { } String renderSimple( - Object context, - List ast, - Template template, - StringSink sink, { - required RendererBase parent, - required Set getters, -}) { + Object context, List ast, Template template, StringSink sink, + {required RendererBase parent, required Set getters}) { var renderer = SimpleRenderer(context, parent, template, sink, getters); renderer.renderBlock(ast); return renderer.sink.toString(); diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart index 9f0a4b653e..4b35f5f166 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 8e0aed669e..3da78c6170 100644 --- a/lib/src/render/element_type_renderer.dart +++ b/lib/src/render/element_type_renderer.dart @@ -2,9 +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. -// @dart=2.9 - -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 a03f1bbfa4..f975fdf1e6 100644 --- a/lib/src/render/renderer_factory.dart +++ b/lib/src/render/renderer_factory.dart @@ -2,9 +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. -// @dart=2.9 - -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/lib/src/special_elements.dart b/lib/src/special_elements.dart index a58297ca4b..786529212c 100644 --- a/lib/src/special_elements.dart +++ b/lib/src/special_elements.dart @@ -25,6 +25,9 @@ enum SpecialClass { /// From dart:core, pragma pragma, + + /// From dart:core, Enum + enumClass, } /// A declaration of a special [Class] and how to find it. @@ -72,6 +75,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/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/comment_referable/parser_test.dart b/test/comment_referable/parser_test.dart index c46a053cee..8f900d7e51 100644 --- a/test/comment_referable/parser_test.dart +++ b/test/comment_referable/parser_test.dart @@ -29,8 +29,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); diff --git a/test/end2end/dartdoc_integration_test.dart b/test/end2end/dartdoc_integration_test.dart index c26398e314..ed85db78e4 100644 --- a/test/end2end/dartdoc_integration_test.dart +++ b/test/end2end/dartdoc_integration_test.dart @@ -10,7 +10,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 21c21d1f6d..672b48f188 100644 --- a/test/end2end/dartdoc_test.dart +++ b/test/end2end/dartdoc_test.dart @@ -10,10 +10,20 @@ 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/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'; +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 291b1785a1..c0b1ce5fb6 100644 --- a/test/html_generator_test.dart +++ b/test/html_generator_test.dart @@ -6,12 +6,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'; @@ -162,12 +164,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/test/mustachio/foo.runtime_renderers.dart b/test/mustachio/foo.runtime_renderers.dart index 6a4960555b..aaeee2e041 100644 --- a/test/mustachio/foo.runtime_renderers.dart +++ b/test/mustachio/foo.runtime_renderers.dart @@ -6,7 +6,7 @@ // ignore_for_file: camel_case_types, deprecated_member_use_from_same_package // ignore_for_file: unused_import // @dart=2.9 -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'; @@ -14,6 +14,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 5f0071342f..d124393a8a 100644 --- a/test/mustachio/renderers_output_test.dart +++ b/test/mustachio/renderers_output_test.dart @@ -10,10 +10,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/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); diff --git a/tool/grind.dart b/tool/grind.dart index 6aa411cf35..887bc4f171 100644 --- a/tool/grind.dart +++ b/tool/grind.dart @@ -90,7 +90,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); @@ -187,7 +187,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' @@ -328,7 +333,7 @@ void buildbot() => null; void buildbotNoPublish() => 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)); } @@ -427,8 +432,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) { @@ -443,13 +451,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'); @@ -541,7 +549,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'; @@ -563,15 +572,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( @@ -688,12 +698,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, @@ -715,7 +725,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', @@ -724,7 +734,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', @@ -876,11 +886,6 @@ class FlutterRepo { ['--version'], workingDirectory: flutterPath, ); - await launcher.runStreamed( - bin, - ['precache'], - workingDirectory: flutterPath, - ); await launcher.runStreamed( bin, ['update-packages'], @@ -915,7 +920,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/mustachio/codegen_runtime_renderer.dart b/tool/mustachio/codegen_runtime_renderer.dart index ef7b526c7b..0cf76fb1a2 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 // @dart=2.9 -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'; diff --git a/tool/subprocess_launcher.dart b/tool/subprocess_launcher.dart index 4fc793fab4..345fafd478 100644 --- a/tool/subprocess_launcher.dart +++ b/tool/subprocess_launcher.dart @@ -27,7 +27,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 { @@ -73,7 +75,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, @@ -94,7 +97,7 @@ class CoverageSubprocessLauncher extends SubprocessLauncher { } } - Completer> coverageResult; + Completer>> coverageResult; if (coverageEnabled) { coverageResult = Completer(); @@ -170,21 +173,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 {