Skip to content

Reintroduce remote linking file type assumption #3425

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5,546 changes: 2,773 additions & 2,773 deletions lib/resources/docs.dart.js

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions lib/resources/docs.dart.js.map

Large diffs are not rendered by default.

26 changes: 15 additions & 11 deletions lib/src/generator/file_structure.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,31 @@ const _validFormats = {'html', 'md'};
/// together.
abstract class FileStructure {
factory FileStructure.fromDocumentable(Documentable documentable) {
if (!_validFormats.contains(documentable.config.format)) {
throw DartdocFailure(
'Internal error: unrecognized config.format: ${documentable.config.format}');
/// This assumes all remote packages are HTML.
/// Add configurability for remote formats in dartdoc_options if changing
/// that becomes desireable.
var format = documentable.config.format;
if (documentable.package.documentedWhere == DocumentLocation.remote) {
format = 'html';
}
if (!_validFormats.contains(format)) {
throw DartdocFailure('Internal error: unrecognized format: $format');
}
switch (documentable) {
case LibraryContainer():
// [LibraryContainer]s are not ModelElements, but have documentation.
return FileStructure._fromLibraryContainer(documentable);
return FileStructure._fromLibraryContainer(documentable, format);
case ModelElement():
// This should be the common case.
return FileStructure._fromModelElement(documentable);
return FileStructure._fromModelElement(documentable, format);
default:
throw UnimplementedError(
'Tried to build a FileStructure for an unknown subtype of Documentable: ${documentable.runtimeType}');
}
}

factory FileStructure._fromLibraryContainer(
LibraryContainer libraryContainer) {
final format = libraryContainer.config.format;
LibraryContainer libraryContainer, String format) {
switch (libraryContainer) {
case Category():
return FileStructureImpl(format, libraryContainer.name, 'topic');
Expand All @@ -50,8 +55,8 @@ abstract class FileStructure {
}
}

factory FileStructure._fromModelElement(ModelElement modelElement) {
final format = modelElement.config.format;
factory FileStructure._fromModelElement(
ModelElement modelElement, String format) {
switch (modelElement) {
case Library():
return FileStructureImpl(format, modelElement.dirName, 'library');
Expand All @@ -66,8 +71,7 @@ abstract class FileStructure {
return FileStructureImpl(format, modelElement.name,
modelElement.isConst ? 'constant' : null);
default:
return FileStructureImpl(
modelElement.config.format, modelElement.name, null);
return FileStructureImpl(format, modelElement.name, null);
}
}

Expand Down
44 changes: 22 additions & 22 deletions lib/src/generator/templates.runtime_renderers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4112,6 +4112,28 @@ class _Renderer_Documentable extends RendererBase<Documentable> {
parent: r);
},
),
'package': Property(
getValue: (CT_ c) => c.package,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) {
if (remainingNames.isEmpty) {
return self.getValue(c).toString();
}
var name = remainingNames.first;
var nextProperty =
_Renderer_Package.propertyMap().getValue(name);
return nextProperty.renderVariable(
self.getValue(c) as Package,
nextProperty,
[...remainingNames.skip(1)]);
},
isNullValue: (CT_ c) => false,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
_render_Package(c.package, ast, r.template, sink,
parent: r);
},
),
'packageGraph': Property(
getValue: (CT_ c) => c.packageGraph,
renderVariable: (CT_ c, Property<CT_> self,
Expand Down Expand Up @@ -16601,28 +16623,6 @@ class _Renderer_Warnable extends RendererBase<Warnable> {
parent: r, getters: _invisibleGetters['Element']!);
},
),
'package': Property(
getValue: (CT_ c) => c.package,
renderVariable:
(CT_ c, Property<CT_> self, List<String> remainingNames) {
if (remainingNames.isEmpty) {
return self.getValue(c).toString();
}
var name = remainingNames.first;
var nextProperty =
_Renderer_Package.propertyMap().getValue(name);
return nextProperty.renderVariable(
self.getValue(c) as Package,
nextProperty,
[...remainingNames.skip(1)]);
},
isNullValue: (CT_ c) => false,
renderValue: (CT_ c, RendererBase<CT_> r,
List<MustachioNode> ast, StringSink sink) {
_render_Package(c.package, ast, r.template, sink,
parent: r);
},
),
}) as Map<String, Property<CT_>>;

_Renderer_Warnable(Warnable context, RendererBase<Object>? parent,
Expand Down
2 changes: 2 additions & 0 deletions lib/src/model/documentable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ abstract class Documentable extends Nameable {

PackageGraph get packageGraph;

Package get package;

bool get isDocumented;

DartdocOptionContext get config;
Expand Down
2 changes: 0 additions & 2 deletions lib/src/warnings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,6 @@ const Map<PackageWarning, PackageWarningDefinition> packageWarningDefinitions =
mixin Warnable implements Canonicalization, CommentReferable {
Element? get element;

Package get package;

void warn(
PackageWarning kind, {
String? message,
Expand Down
10 changes: 6 additions & 4 deletions test/dartdoc_test_base.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ analyzer:
packagePath, name, Uri.file('$packagePath/'));
}

Future<PackageGraph> _bootPackageFromFiles(
Iterable<d.Descriptor> files) async {
Future<PackageGraph> _bootPackageFromFiles(Iterable<d.Descriptor> files,
{List<String> additionalArguments = const []}) async {
var packagePathBasename =
resourceProvider.pathContext.basename(packagePath);
var packagePathDirname = resourceProvider.pathContext.dirname(packagePath);
Expand All @@ -82,6 +82,7 @@ analyzer:
packagePath,
packageMetaProvider,
packageConfigProvider,
additionalArguments: additionalArguments,
);
}

Expand All @@ -90,7 +91,8 @@ analyzer:
/// extra files in the package such as `dartdoc_options.yaml`.
Future<Library> bootPackageWithLibrary(String libraryContent,
{String libraryPreamble = '',
Iterable<d.Descriptor> extraFiles = const []}) async {
Iterable<d.Descriptor> extraFiles = const [],
List<String> additionalArguments = const []}) async {
return (await _bootPackageFromFiles([
d.dir('lib', [
d.file('lib.dart', '''
Expand All @@ -101,7 +103,7 @@ $libraryContent
'''),
]),
...extraFiles
]))
], additionalArguments: additionalArguments))
.libraries
.named(libraryName);
}
Expand Down
3 changes: 3 additions & 0 deletions test/end2end/model_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ class TestLibraryContainer extends LibraryContainer with Nameable {
@override
PackageGraph get packageGraph => throw UnimplementedError();

@override
Package get package => throw UnimplementedError();

TestLibraryContainer(
this.name, this.containerOrder, LibraryContainer? enclosingContainer)
: enclosingName = enclosingContainer?.name ?? '';
Expand Down
14 changes: 14 additions & 0 deletions test/generator/file_structure_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,18 @@ Hello there, I am an *amazing* markdown file.
expect(aMethod.fileStructure.fileName, equals('aMethod.html'));
expect(operatorPlus.fileStructure.fileName, equals('operator_plus.html'));
}

void test_fileNamesForMarkdownElements() async {
var library = await bootPackageWithLibrary('''
class AClass {
}
''', additionalArguments: ['--format=md']);
var AClass = library.classes.named('AClass');
// The inherited toString implementation is not canonical, so be sure
// to get the canonical reference.
var AClassToString =
AClass.inheritedMethods.named('toString').canonicalModelElement!;
expect(AClass.fileStructure.fileName, equals('AClass-class.md'));
expect(AClassToString.fileStructure.fileName, equals('toString.html'));
}
}