From 722e29f21b751fbb212b5075abed2db5aae2bdff Mon Sep 17 00:00:00 2001 From: Jonas Finnemann Jensen Date: Wed, 30 Apr 2025 12:50:41 +0200 Subject: [PATCH 1/2] Fix duplicate entries of elements in a category when re-exported. If a package has two libraries `foo.dart` and `bar.dart` where * `foo.dart` contains `Foo` with an `/// {@category ...}` annotation, and, * `bar.dart` re-exports `foo.dart`. Then the category page shall not list `Foo` twice, which is simply a bug. This change fixes this issue. --- lib/src/model/category.dart | 20 ++++++++++---------- test/end2end/model_special_cases_test.dart | 19 +++++++++++++++++++ test/templates/category_test.dart | 21 ++++++++++++++++++++- testing/test_package/lib/src/somelib.dart | 1 + 4 files changed, 50 insertions(+), 11 deletions(-) diff --git a/lib/src/model/category.dart b/lib/src/model/category.dart index 225ff7532b..e128e8552b 100644 --- a/lib/src/model/category.dart +++ b/lib/src/model/category.dart @@ -32,33 +32,33 @@ class Category @override final DartdocOptionContext config; - final List _classes = []; + final Set _classes = {}; - final List _exceptions = []; + final Set _exceptions = {}; @override - final List constants = []; + final Set constants = {}; @override - final List extensions = []; + final Set extensions = {}; @override - final List extensionTypes = []; + final Set extensionTypes = {}; @override - final List enums = []; + final Set enums = {}; @override - final List functions = []; + final Set functions = {}; @override - final List mixins = []; + final Set mixins = {}; @override - final List properties = []; + final Set properties = {}; @override - final List typedefs = []; + final Set typedefs = {}; final CategoryDefinition _categoryDefinition; diff --git a/test/end2end/model_special_cases_test.dart b/test/end2end/model_special_cases_test.dart index 9e70eef192..a413b5508b 100644 --- a/test/end2end/model_special_cases_test.dart +++ b/test/end2end/model_special_cases_test.dart @@ -393,6 +393,25 @@ void main() { expect(SubForDocComments.categories.first.isDocumented, isFalse); expect(SubForDocComments.displayedCategories, isEmpty); }); + + test('No duplicate entries', () { + final categories = ginormousPackageGraph.localPackages + .firstWhere((p) => p.name == 'test_package') + .categories; + for (final c in categories) { + expect(c.classes.length, equals(c.classes.toSet().length)); + expect(c.exceptions.length, equals(c.exceptions.toSet().length)); + expect(c.extensions.length, equals(c.extensions.toSet().length)); + expect( + c.extensionTypes.length, equals(c.extensionTypes.toSet().length)); + expect(c.enums.length, equals(c.enums.toSet().length)); + expect(c.mixins.length, equals(c.mixins.toSet().length)); + expect(c.constants.length, equals(c.constants.toSet().length)); + expect(c.properties.length, equals(c.properties.toSet().length)); + expect(c.functions.length, equals(c.functions.toSet().length)); + expect(c.typedefs.length, equals(c.typedefs.toSet().length)); + } + }); }); group('Package', () { diff --git a/test/templates/category_test.dart b/test/templates/category_test.dart index 29db4bb567..54fbe8d3b5 100644 --- a/test/templates/category_test.dart +++ b/test/templates/category_test.dart @@ -125,7 +125,9 @@ extension type ExType(int it) {} '''), d.file('other.dart', ''' /// {@category Documented} -library; +library; + +export 'lib.dart' show C1, E1; '''), ], files: [ @@ -229,6 +231,15 @@ library; ); }); + test('classes are not duplicated', () async { + expect( + topicOneLines + .where((l) => l.contains('C1')), + // Once in the sidebar and once in the main body + hasLength(2), + ); + }); + test('sidebar contains enums', () async { expect( topicOneLines, @@ -240,6 +251,14 @@ library; ); }); + test('enums are not duplicated', () async { + expect( + topicOneLines.where((l) => l.contains('E1')), + // Once in the sidebar and once in the main body + hasLength(2), + ); + }); + test('sidebar contains mixins', () async { expect( topicOneLines, diff --git a/testing/test_package/lib/src/somelib.dart b/testing/test_package/lib/src/somelib.dart index ad7f083f64..c36b1cb4d8 100644 --- a/testing/test_package/lib/src/somelib.dart +++ b/testing/test_package/lib/src/somelib.dart @@ -1,5 +1,6 @@ library reexport.somelib; +/// {@category Unreal} class SomeClass {} class SomeOtherClass {} From b2a609ef79c96d056ee572561dd2558e5e83a41a Mon Sep 17 00:00:00 2001 From: Jonas Finnemann Jensen Date: Wed, 30 Apr 2025 13:27:56 +0200 Subject: [PATCH 2/2] Rebuild renderer --- .../generator/templates.runtime_renderers.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index bc01161928..84608a02d7 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -1541,7 +1541,7 @@ class _Renderer_Category extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'List', + 'Set', ), renderIterable: ( @@ -1735,7 +1735,7 @@ class _Renderer_Category extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'List', + 'Set', ), renderIterable: ( @@ -1777,7 +1777,7 @@ class _Renderer_Category extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'List', + 'Set', ), renderIterable: ( @@ -1804,7 +1804,7 @@ class _Renderer_Category extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'List', + 'Set', ), renderIterable: ( @@ -1917,7 +1917,7 @@ class _Renderer_Category extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'List', + 'Set', ), renderIterable: ( @@ -2054,7 +2054,7 @@ class _Renderer_Category extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'List', + 'Set', ), renderIterable: ( @@ -2167,7 +2167,7 @@ class _Renderer_Category extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'List', + 'Set', ), renderIterable: ( @@ -2320,7 +2320,7 @@ class _Renderer_Category extends RendererBase { self.renderSimpleVariable( c, remainingNames, - 'List', + 'Set', ), renderIterable: (