diff --git a/lib/src/generator/templates.runtime_renderers.dart b/lib/src/generator/templates.runtime_renderers.dart index 41f9ba780d..873c928dbe 100644 --- a/lib/src/generator/templates.runtime_renderers.dart +++ b/lib/src/generator/templates.runtime_renderers.dart @@ -7213,14 +7213,6 @@ class _Renderer_Enum extends RendererBase { ); }, ), - 'hasPublicEnumValues': Property( - getValue: (CT_ c) => c.hasPublicEnumValues, - renderVariable: - (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable(c, remainingNames, 'bool'), - - getBool: (CT_ c) => c.hasPublicEnumValues, - ), 'inheritanceChain': Property( getValue: (CT_ c) => c.inheritanceChain, renderVariable: @@ -11498,29 +11490,6 @@ class _Renderer_InheritingContainer extends RendererBase { CT_, () => { ..._Renderer_Container.propertyMap(), - 'allFields': Property( - getValue: (CT_ c) => c.allFields, - renderVariable: - (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'List', - ), - - renderIterable: - ( - CT_ c, - RendererBase r, - List ast, - StringSink sink, - ) { - return c.allFields.map( - (e) => - _render_Field(e, ast, r.template, sink, parent: r), - ); - }, - ), 'allModelElements': Property( getValue: (CT_ c) => c.allModelElements, renderVariable: @@ -11953,57 +11922,6 @@ class _Renderer_InheritingContainer extends RendererBase { ); }, ), - 'inheritedMethods': Property( - getValue: (CT_ c) => c.inheritedMethods, - renderVariable: - (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'Iterable', - ), - - renderIterable: - ( - CT_ c, - RendererBase r, - List ast, - StringSink sink, - ) { - return c.inheritedMethods.map( - (e) => - _render_Method(e, ast, r.template, sink, parent: r), - ); - }, - ), - 'inheritedOperators': Property( - getValue: (CT_ c) => c.inheritedOperators, - renderVariable: - (CT_ c, Property self, List remainingNames) => - self.renderSimpleVariable( - c, - remainingNames, - 'List', - ), - - renderIterable: - ( - CT_ c, - RendererBase r, - List ast, - StringSink sink, - ) { - return c.inheritedOperators.map( - (e) => _render_Operator( - e, - ast, - r.template, - sink, - parent: r, - ), - ); - }, - ), 'instanceFields': Property( getValue: (CT_ c) => c.instanceFields, renderVariable: @@ -14263,7 +14181,7 @@ class _Renderer_LibraryContainer extends RendererBase { } } -String renderLibraryRedirect(LibraryTemplateData context, Template template) { +String renderLibrary(LibraryTemplateData context, Template template) { var buffer = StringBuffer(); _render_LibraryTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -14501,7 +14419,7 @@ class _Renderer_LibraryTemplateData extends RendererBase { } } -String renderLibrary(LibraryTemplateData context, Template template) { +String renderLibraryRedirect(LibraryTemplateData context, Template template) { var buffer = StringBuffer(); _render_LibraryTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -20021,7 +19939,7 @@ class _Renderer_Package extends RendererBase { } } -String renderSearchPage(PackageTemplateData context, Template template) { +String renderIndex(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); @@ -20379,7 +20297,7 @@ class _Renderer_PackageTemplateData extends RendererBase { } } -String renderIndex(PackageTemplateData context, Template template) { +String renderSearchPage(PackageTemplateData context, Template template) { var buffer = StringBuffer(); _render_PackageTemplateData(context, template.ast, template, buffer); return buffer.toString(); diff --git a/lib/src/model/enum.dart b/lib/src/model/enum.dart index bf6f96514b..db78ea3186 100644 --- a/lib/src/model/enum.dart +++ b/lib/src/model/enum.dart @@ -6,11 +6,9 @@ import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/dart/element/element2.dart'; import 'package:dartdoc/src/model/kind.dart'; import 'package:dartdoc/src/model/model.dart'; -import 'package:dartdoc/src/model_utils.dart' as model_utils; import 'package:meta/meta.dart'; class Enum extends InheritingContainer with Constructable, MixedInTypes { - @override final EnumElement2 element; @@ -51,12 +49,12 @@ class Enum extends InheritingContainer with Constructable, MixedInTypes { declaredFields.where((f) => f is! EnumField && f.isConst); @override - late final List publicEnumValues = - allFields.whereType().wherePublic.toList(growable: false); - - @override - bool get hasPublicEnumValues => - allFields.whereType().any((e) => e.isPublic); + late final List publicEnumValues = [ + for (var value in element.constants2) + getModelForPropertyInducingElement(value, library, + getter: getModelFor(value.getter2!, library) as ContainerAccessor, + setter: null) as Field + ]; @override bool get isAbstract => false; diff --git a/lib/src/model/inheriting_container.dart b/lib/src/model/inheriting_container.dart index 109d92b84d..550ae7301d 100644 --- a/lib/src/model/inheriting_container.dart +++ b/lib/src/model/inheriting_container.dart @@ -99,15 +99,13 @@ abstract class InheritingContainer extends Container { ...typeParameters, ]; + @visibleForTesting Iterable get inheritedMethods { var methodNames = declaredMethods.map((m) => m.element.name3).toSet(); - var inheritedMethodElements = _inheritedElements + var inheritedMethodElements = element.inheritedMembers.values .whereType() - .where((e) => - !e.isOperator && - e is! PropertyAccessorElement2 && - !methodNames.contains(e.name3)) - .toSet(); + .where((e) => !e.isOperator) + .where((e) => !methodNames.contains(e.name3)); return [ for (var e in inheritedMethodElements) @@ -115,13 +113,14 @@ abstract class InheritingContainer extends Container { ]; } + @visibleForTesting List get inheritedOperators { var operatorNames = declaredOperators.map((o) => o.element.lookupName).toSet(); - var inheritedOperatorElements = _inheritedElements + var inheritedOperatorElements = element.inheritedMembers.values .whereType() - .where((e) => e.isOperator && !operatorNames.contains(e.lookupName)) - .toSet(); + .where((e) => e.isOperator) + .where((e) => !operatorNames.contains(e.name3)); return [ for (var e in inheritedOperatorElements) @@ -132,74 +131,10 @@ abstract class InheritingContainer extends Container { late final DefinedElementType modelType = getTypeFor(element.thisType, library) as DefinedElementType; - /// A list of the inherited executable elements, one element per inherited - /// `Name`. - /// - /// In this list, elements that are "closer" in the inheritance chain to - /// _this_ element are preferred over elements that are further away. In the - /// case of ties, concrete inherited elements are prefered to non-concrete - /// ones. - late final List _inheritedElements = () { - if (element case ClassElement2 classElement - when classElement.isDartCoreObject) { - return const []; - } - - // The mapping of all of the inherited element names to their _concrete_ - // implementation element. - var concreteInheritanceMap = - packageGraph.inheritanceManager.getInheritedConcreteMap(element); - // The mapping of all inherited element names to the nearest inherited - // element that they resolve to. - var inheritanceMap = - packageGraph.inheritanceManager.getInheritedMap(element); - - var inheritanceChainElements = - inheritanceChain.map((c) => c.element).toList(growable: false); - - // A combined map of names to inherited _concrete_ Elements, and other - // inherited Elements. - var combinedMap = { - for (var MapEntry(:key, :value) in concreteInheritanceMap.entries) - key.name: value, - }; - for (var MapEntry(key: name, value: inheritedElement) - in inheritanceMap.entries) { - var combinedMapElement = combinedMap[name.name]; - if (combinedMapElement == null) { - combinedMap[name.name] = inheritedElement; - continue; - } - - // Elements in the inheritance chain starting from `this.element` up to, - // but not including, `Object`. - var enclosingElement = - inheritedElement.enclosingElement2 as InterfaceElement2; - assert(inheritanceChainElements.contains(enclosingElement) || - enclosingElement.isDartCoreObject); - - // If the concrete element from `getInheritedConcreteMap2` is farther in - // the inheritance chain from this class than the (non-concrete) one - // provided by `getInheritedMap2`, prefer the latter. This correctly - // accounts for intermediate abstract classes that have method/field - // implementations. - var enclosingElementFromCombined = - combinedMapElement.enclosingElement2 as InterfaceElement2; - if (inheritanceChainElements.indexOf(enclosingElementFromCombined) < - inheritanceChainElements.indexOf(enclosingElement)) { - combinedMap[name.name] = inheritedElement; - } - } - - // Finally, return all of the elements ultimately collected in the combined - // map. - return combinedMap.values.toList(growable: false); - }(); - /// All fields defined on this container, _including inherited fields_. - late List allFields = () { + late final List _allFields = () { var inheritedAccessorElements = { - ..._inheritedElements.whereType() + ...element.inheritedMembers.values.whereType() }; // This structure keeps track of inherited accessors, allowing lookup @@ -285,17 +220,15 @@ abstract class InheritingContainer extends Container { List get allModelElements => _allModelElements; @override - Iterable get constantFields => allFields.where((f) => f.isConst); + Iterable get constantFields => _allFields.where((f) => f.isConst); @override - Iterable get declaredFields => allFields.where((f) => !f.isInherited); + Iterable get declaredFields => _allFields.where((f) => !f.isInherited); /// The [InheritingContainer] with the library in which [element] is defined. InheritingContainer get definingContainer => getModelFor(element, library) as InheritingContainer; - @override - @override InterfaceElement2 get element; @@ -333,10 +266,10 @@ abstract class InheritingContainer extends Container { List get inheritanceChain; @visibleForTesting - Iterable get inheritedFields => allFields.where((f) => f.isInherited); + Iterable get inheritedFields => _allFields.where((f) => f.isInherited); @override - Iterable get instanceFields => allFields.where((f) => !f.isStatic); + Iterable get instanceFields => _allFields.where((f) => !f.isStatic); @override late final List availableInstanceFieldsSorted = [ @@ -371,8 +304,8 @@ abstract class InheritingContainer extends Container { List get _extensionInstanceMethods => [ for (var extension in potentiallyApplicableExtensionsSorted) for (var method in extension.instanceMethods) - getModelFor(method.element, library, - enclosingContainer: extension) as Method, + getModelFor(method.element, library, enclosingContainer: extension) + as Method, ]; @override @@ -677,11 +610,6 @@ mixin MixedInTypes on InheritingContainer { mixedInTypes.wherePublic; } -extension on InterfaceElement2 { - bool get isDartCoreObject => - name3 == 'Object' && library2.name3 == 'dart.core'; -} - extension DefinedElementTypeIterableExtension on Iterable { /// The [ModelElement] for each element. List get modelElements => diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 8921abe3d6..482ae95815 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -243,7 +243,7 @@ void main() async { test('typedef references display aliases', () { var g = C.instanceMethods.named('g'); - var c = C2.allFields.named('c'); + var c = C2.declaredFields.named('c'); var d = C2.instanceMethods.named('d'); expectAliasedTypeName(c.modelType as Aliased, equals('T1')); @@ -263,8 +263,8 @@ void main() async { test('typedef references to special types work', skip: 'dart-lang/sdk#45291', () { var a = generalizedTypedefs.properties.named('a'); - var b = C2.allFields.named('b'); - var f = C.allFields.named('f'); + var b = C2.declaredFields.named('b'); + var f = C.declaredFields.named('f'); expectAliasedTypeName(a.modelType as Aliased, equals('T0')); expectAliasedTypeName(b.modelType as Aliased, equals('T0')); expectAliasedTypeName(f.modelType as Aliased, equals('T0')); @@ -1699,7 +1699,7 @@ void main() async { var MixedInImplementation = fakeLibrary.classes.wherePublic.named('MixedInImplementation'); var MixInImplementation = fakeLibrary.mixins.named('MixInImplementation'); - var mixinGetter = MixInImplementation.allFields.named('mixinGetter'); + var mixinGetter = MixInImplementation.instanceFields.named('mixinGetter'); expect(ThingToImplementInMixin.hasModifiers, isTrue); expect(MixInImplementation.hasModifiers, isTrue); @@ -1713,7 +1713,7 @@ void main() async { orderedEquals([MixedInImplementation]), ); expect( - MixedInImplementation.allFields + MixedInImplementation.inheritedFields .named('mixinGetter') .canonicalModelElement, equals(mixinGetter), @@ -2118,7 +2118,7 @@ void main() async { T8 = generalizedTypedefs.typedefs.named('T8'); C1 = generalizedTypedefs.classes.named('C1'); C2 = generalizedTypedefs.classes.named('C2'); - C1a = C1.allFields.named('a'); + C1a = C1.declaredFields.named('a'); }); test('Verify basic ability to link anything', () { @@ -2178,8 +2178,8 @@ void main() async { // This group tests lookups from the perspective of the reexported // elements, to verify that various fallbacks work correctly. ExtendingAgain = two_exports.classes.named('ExtendingAgain'); - aField = ExtendingAgain.allFields.named('aField'); - anotherField = ExtendingAgain.allFields.named('anotherField'); + aField = ExtendingAgain.inheritedFields.named('aField'); + anotherField = ExtendingAgain.declaredFields.named('anotherField'); aNotReexportedVariable = local_scope.properties.named('aNotReexportedVariable'); @@ -2397,9 +2397,9 @@ void main() async { baseForDocComments.constructors.named('BaseForDocComments.new'); somethingShadowyParameter = defaultConstructor.parameters.named('somethingShadowy'); - initializeMe = baseForDocComments.allFields.named('initializeMe'); + initializeMe = baseForDocComments.declaredFields.named('initializeMe'); somethingShadowy = - baseForDocComments.allFields.named('somethingShadowy'); + baseForDocComments.declaredFields.named('somethingShadowy'); doAwesomeStuff = baseForDocComments.instanceMethods.named('doAwesomeStuff'); anotherMethod = @@ -2433,18 +2433,18 @@ void main() async { ExtraSpecialList = fakeLibrary.classes.named('ExtraSpecialList'); forInheriting = fakeLibrary.classes .named('ImplicitProperties') - .allFields + .declaredFields .named('forInheriting'); action = packageGraph.libraries .named('reexport.somelib') .classes .named('BaseReexported') - .allFields + .declaredFields .named('action'); aConstructorShadowed = baseForDocComments.constructors .named('BaseForDocComments.aConstructorShadowed'); aConstructorShadowedField = - baseForDocComments.allFields.named('aConstructorShadowed'); + baseForDocComments.declaredFields.named('aConstructorShadowed'); FactoryConstructorThings = fakeLibrary.classes.named('FactoryConstructorThings'); @@ -2462,11 +2462,11 @@ void main() async { differentName = anotherName.parameters.named('differentName'); redHerring = anotherConstructor.parameters.named('redHerring'); - aNameField = FactoryConstructorThings.allFields.named('aName'); + aNameField = FactoryConstructorThings.declaredFields.named('aName'); yetAnotherNameField = - FactoryConstructorThings.allFields.named('yetAnotherName'); + FactoryConstructorThings.declaredFields.named('yetAnotherName'); initViaFieldFormal = - FactoryConstructorThings.allFields.named('initViaFieldFormal'); + FactoryConstructorThings.declaredFields.named('initViaFieldFormal'); aMethod = FactoryConstructorThings.instanceMethods.named('aMethod'); yetAnotherName = aMethod.parameters.named('yetAnotherName'); @@ -2499,7 +2499,7 @@ void main() async { expect(referenceLookup(FactoryConstructorThings, 'aName'), equals(MatchingLinkResult(aNameField))); var anotherNameField = - FactoryConstructorThings.allFields.named('anotherName'); + FactoryConstructorThings.declaredFields.named('anotherName'); expect(referenceLookup(FactoryConstructorThings, 'anotherName'), equals(MatchingLinkResult(anotherNameField))); expect(referenceLookup(FactoryConstructorThings, 'yetAnotherName'), @@ -3645,13 +3645,14 @@ String? topLevelFunction(int param1, bool param2, Cool coolBeans, // classB has a variety of inherited and partially overridden fields. // All should have valid locations on their accessors. - for (var a in classB.allFields.expand(expandAccessors)) { + for (var a in classB.inheritedFields.expand(expandAccessors)) { expectValidLocation(a.characterLocation!); } // Enums also have fields and have historically had problems. var macrosFromAccessors = fakeLibrary.enums.named('MacrosFromAccessors'); - for (var a in macrosFromAccessors.allFields.expand(expandAccessors)) { + for (var a + in macrosFromAccessors.inheritedFields.expand(expandAccessors)) { if (a.name == 'values') { continue; } @@ -3791,7 +3792,7 @@ String? topLevelFunction(int param1, bool param2, Cool coolBeans, expect( exLibrary.classes .named('Apple') - .allFields + .instanceFields .named('internalField') .isPublic, isFalse); diff --git a/test/enums_test.dart b/test/enums_test.dart index 0c88525247..224cbe02c8 100644 --- a/test/enums_test.dart +++ b/test/enums_test.dart @@ -657,12 +657,9 @@ export 'src/library.dart'; void test_values_haveIndices() async { var library = await bootPackageWithLibrary('enum E { one, two, three }'); - var oneValue = - library.enums.named('E').publicEnumValues.named('one') as EnumField; - var twoValue = - library.enums.named('E').publicEnumValues.named('two') as EnumField; - var threeValue = - library.enums.named('E').publicEnumValues.named('three') as EnumField; + var oneValue = library.enums.named('E').publicEnumValues.named('one'); + var twoValue = library.enums.named('E').publicEnumValues.named('two'); + var threeValue = library.enums.named('E').publicEnumValues.named('three'); // TODO(srawlins): These should link back to the E enum. Something like // `'const E(0)'`. diff --git a/test/options_test.dart b/test/options_test.dart index 525672679e..c59deb8fc5 100644 --- a/test/options_test.dart +++ b/test/options_test.dart @@ -225,7 +225,7 @@ class Foo { final foo = packageGraph.localPackages.first.libraries.first.classes.named('Foo'); // The name is not linked, but also does not error. - expect(foo.allFields.first.modelType.linkedName, 'Client?'); + expect(foo.declaredFields.first.modelType.linkedName, 'Client?'); } void test_includeCommandLineOption_overridesOptionsFileOption() async {