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: ( 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 {}