Skip to content
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
11 changes: 6 additions & 5 deletions lib/src/dartdoc_options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -481,15 +481,15 @@ class _OptionValueWithContext<T> {
T get resolvedValue {
if (value is List<String>) {
return (value as List<String>)
.map((v) => pathContext.canonicalize(resolveTildePath(v)))
.map((v) => pathContext.canonicalizeWithTilde(v))
.cast<String>()
.toList() as T;
} else if (value is String) {
return pathContext.canonicalize(resolveTildePath(value as String)) as T;
return pathContext.canonicalizeWithTilde(value as String) as T;
} else if (value is Map<String, String>) {
return (value as Map<String, String>)
.map<String, String>((String key, String value) {
return MapEntry(key, pathContext.canonicalize(resolveTildePath(value)));
return MapEntry(key, pathContext.canonicalizeWithTilde(value));
}) as T;
} else {
throw UnsupportedError('Type $T is not supported for resolvedValue');
Expand Down Expand Up @@ -1599,8 +1599,9 @@ Future<List<DartdocOption<Object>>> createDartdocOptions(
// to set the flutter root.
DartdocOptionSyntheticOnly<String>(
'flutterRoot',
(DartdocSyntheticOption<String> option, Folder dir) =>
resolveTildePath(Platform.environment['FLUTTER_ROOT']),
(DartdocSyntheticOption<String> option, Folder dir) => resourceProvider
.pathContext
.resolveTildePath(Platform.environment['FLUTTER_ROOT']),
resourceProvider,
optionIs: OptionKind.dir,
help: 'Root of the Flutter SDK, specified from environment.',
Expand Down
9 changes: 5 additions & 4 deletions lib/src/generator/dartdoc_generator_backend.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import 'package:dartdoc/src/model/package.dart';
import 'package:dartdoc/src/model/package_graph.dart';
import 'package:dartdoc/src/warnings.dart';
import 'package:mustache/mustache.dart';
import 'package:path/path.dart' as path;
import 'package:path/path.dart' as path show Context;

/// Configuration options for the Dartdoc's default backend.
class DartdocGeneratorBackendOptions implements TemplateOptions {
Expand Down Expand Up @@ -63,9 +63,10 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
final Templates templates;
final SidebarGenerator<Library> sidebarForLibrary;
final SidebarGenerator<Container> sidebarForContainer;
final path.Context _pathContext;

DartdocGeneratorBackend(
DartdocGeneratorBackendOptions options, this.templates)
DartdocGeneratorBackendOptions options, this.templates, this._pathContext)
: options = options ?? DartdocGeneratorBackendOptions(),
sidebarForContainer =
SidebarGenerator(templates.sidebarContainerTemplate),
Expand All @@ -90,7 +91,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
if (!options.useBaseHref) {
json = json.replaceAll(HTMLBASE_PLACEHOLDER, '');
}
writer.write(path.join('categories.json'), '${json}\n');
writer.write(_pathContext.join('categories.json'), '${json}\n');
}

@override
Expand All @@ -100,7 +101,7 @@ abstract class DartdocGeneratorBackend implements GeneratorBackend {
if (!options.useBaseHref) {
json = json.replaceAll(HTMLBASE_PLACEHOLDER, '');
}
writer.write(path.join('index.json'), '${json}\n');
writer.write(_pathContext.join('index.json'), '${json}\n');
}

@override
Expand Down
10 changes: 6 additions & 4 deletions lib/src/generator/html_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,22 @@ import 'package:dartdoc/src/generator/html_resources.g.dart' as resources;
import 'package:dartdoc/src/generator/resource_loader.dart';
import 'package:dartdoc/src/generator/template_data.dart';
import 'package:dartdoc/src/generator/templates.dart';
import 'package:path/path.dart' as path show Context;

Future<Generator> initHtmlGenerator(
DartdocGeneratorOptionContext context) async {
var templates = await Templates.fromContext(context);
var options = DartdocGeneratorBackendOptions.fromContext(context);
var backend = HtmlGeneratorBackend(options, templates);
var backend = HtmlGeneratorBackend(
options, templates, context.resourceProvider.pathContext);
return GeneratorFrontEnd(backend);
}

/// Generator backend for html output.
class HtmlGeneratorBackend extends DartdocGeneratorBackend {
HtmlGeneratorBackend(
DartdocGeneratorBackendOptions options, Templates templates)
: super(options, templates);
HtmlGeneratorBackend(DartdocGeneratorBackendOptions options,
Templates templates, path.Context pathContext)
: super(options, templates, pathContext);

@override
void generatePackage(FileWriter writer, PackageGraph graph, Package package) {
Expand Down
10 changes: 6 additions & 4 deletions lib/src/generator/markdown_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,22 @@ import 'package:dartdoc/src/generator/template_data.dart';
import 'package:dartdoc/src/generator/templates.dart';
import 'package:dartdoc/src/model/package.dart';
import 'package:dartdoc/src/model/package_graph.dart';
import 'package:path/path.dart' as path show Context;

Future<Generator> initMarkdownGenerator(
DartdocGeneratorOptionContext context) async {
var templates = await Templates.fromContext(context);
var options = DartdocGeneratorBackendOptions.fromContext(context);
var backend = MarkdownGeneratorBackend(options, templates);
var backend = MarkdownGeneratorBackend(
options, templates, context.resourceProvider.pathContext);
return GeneratorFrontEnd(backend);
}

/// Generator backend for markdown output.
class MarkdownGeneratorBackend extends DartdocGeneratorBackend {
MarkdownGeneratorBackend(
DartdocGeneratorBackendOptions options, Templates templates)
: super(options, templates);
MarkdownGeneratorBackend(DartdocGeneratorBackendOptions options,
Templates templates, path.Context pathContext)
: super(options, templates, pathContext);

@override
void generatePackage(FileWriter writer, PackageGraph graph, Package package) {
Expand Down
2 changes: 1 addition & 1 deletion lib/src/generator/templates.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import 'package:dartdoc/src/generator/template_data.dart';
import 'package:dartdoc/src/mustachio/annotations.dart';
import 'package:meta/meta.dart';
import 'package:mustache/mustache.dart';
import 'package:path/path.dart' as path;
import 'package:path/path.dart' as path show Context;

// resource_loader and the Resource API doesn't support viewing resources like
// a directory listing, so we have to explicitly list the partials.
Expand Down
45 changes: 26 additions & 19 deletions lib/src/io_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,10 @@ 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:analyzer/src/test_utilities/mock_sdk.dart';
import 'package:path/path.dart' as path;
import 'package:path/path.dart' as path show Context;

Encoding utf8AllowMalformed = Utf8Codec(allowMalformed: true);

/// Return a resolved path including the home directory in place of tilde
/// references.
String resolveTildePath(String originalPath) {
if (originalPath == null || !originalPath.startsWith('~/')) {
return originalPath;
}

String homeDir;

if (io.Platform.isWindows) {
homeDir = path.absolute(io.Platform.environment['USERPROFILE']);
} else {
homeDir = path.absolute(io.Platform.environment['HOME']);
}

return path.join(homeDir, originalPath.substring(2));
}

bool isSdkLibraryDocumented(SdkLibrary library) {
if (library is MockSdkLibrary) {
// Not implemented in [MockSdkLibrary].
Expand All @@ -42,6 +24,31 @@ bool isSdkLibraryDocumented(SdkLibrary library) {
return library.isDocumented;
}

extension PathExtensions on path.Context {
/// Returns a canonicalized path including the home directory in place of
/// tilde references.
String canonicalizeWithTilde(String originalPath) =>
canonicalize(resolveTildePath(originalPath));

/// Return a resolved path including the home directory in place of tilde
/// references.
String resolveTildePath(String originalPath) {
if (originalPath == null || !originalPath.startsWith('~/')) {
return originalPath;
}

String homeDir;

if (io.Platform.isWindows) {
homeDir = absolute(io.Platform.environment['USERPROFILE']);
} else {
homeDir = absolute(io.Platform.environment['HOME']);
}

return join(homeDir, originalPath.substring(2));
}
}

extension ResourceProviderExtensions on ResourceProvider {
Folder createSystemTemp(String prefix) {
if (this is PhysicalResourceProvider) {
Expand Down
5 changes: 3 additions & 2 deletions lib/src/model/documentable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import 'package:analyzer/file_system/file_system.dart';
import 'package:dartdoc/src/dartdoc_options.dart';
import 'package:dartdoc/src/io_utils.dart';
import 'package:path/path.dart' as p;

import 'model.dart';

Expand Down Expand Up @@ -83,7 +82,9 @@ mixin MarkdownFileDocumentation implements Documentable, Canonicalization {
File get documentationFile;

@override
String get location => p.toUri(documentationFile.path).toString();
String get location => packageGraph.resourceProvider.pathContext
.toUri(documentationFile.path)
.toString();

@override
Set<String> get locationPieces => <String>{location};
Expand Down
19 changes: 10 additions & 9 deletions lib/src/model/documentation_comment.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/render/model_element_renderer.dart';
import 'package:dartdoc/src/utils.dart';
import 'package:dartdoc/src/warnings.dart';
import 'package:path/path.dart' as path;
import 'package:path/path.dart' as path show Context;

final _templatePattern = RegExp(
r'[ ]*{@template\s+(.+?)}([\s\S]+?){@endtemplate}[ ]*(\n?)',
Expand Down Expand Up @@ -235,7 +235,8 @@ mixin DocumentationComment
'SOURCE_PATH':
(sourceFileName == null || package?.packagePath == null)
? null
: path.relative(sourceFileName, from: package.packagePath),
: pathContext.relative(sourceFileName,
from: package.packagePath),
'PACKAGE_PATH': package?.packagePath,
'PACKAGE_NAME': package?.name,
'LIBRARY_NAME': library?.fullyQualifiedName,
Expand Down Expand Up @@ -271,8 +272,8 @@ mixin DocumentationComment
// Already warned about an invalid parameter if this happens.
return '';
}
var lang =
args['lang'] ?? path.extension(args['src']).replaceFirst('.', '');
var lang = args['lang'] ??
pathContext.extension(args['src']).replaceFirst('.', '');

var replacement = match[0]; // default to fully matched string.

Expand Down Expand Up @@ -327,14 +328,14 @@ mixin DocumentationComment
var file = src + fragExtension;
var region = args['region'] ?? '';
if (region.isNotEmpty) {
var dir = path.dirname(src);
var basename = path.basenameWithoutExtension(src);
var ext = path.extension(src);
file = path.join(dir, '$basename-$region$ext$fragExtension');
var dir = pathContext.dirname(src);
var basename = pathContext.basenameWithoutExtension(src);
var ext = pathContext.extension(src);
file = pathContext.join(dir, '$basename-$region$ext$fragExtension');
}
args['file'] = config.examplePathPrefix == null
? file
: path.join(config.examplePathPrefix, file);
: pathContext.join(config.examplePathPrefix, file);
return args;
}

Expand Down
3 changes: 1 addition & 2 deletions lib/src/model/library.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/package_meta.dart' show PackageMeta;
import 'package:dartdoc/src/quiver.dart' as quiver;
import 'package:dartdoc/src/warnings.dart';
import 'package:path/path.dart' as path;

/// Find all hashable children of a given element that are defined in the
/// [LibraryElement] given at initialization.
Expand Down Expand Up @@ -441,7 +440,7 @@ class Library extends ModelElement with Categorization, TopLevelContainer {
} else if (element.name != null && element.name.isNotEmpty) {
_name = element.name;
} else {
_name = path.basename(source.fullName);
_name = pathContext.basename(source.fullName);
if (_name.endsWith('.dart')) {
_name = _name.substring(0, _name.length - '.dart'.length);
}
Expand Down
10 changes: 6 additions & 4 deletions lib/src/model/model_element.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import 'package:dartdoc/src/source_linker.dart';
import 'package:dartdoc/src/tuple.dart';
import 'package:dartdoc/src/warnings.dart';
import 'package:meta/meta.dart';
import 'package:path/path.dart' as path;
import 'package:path/path.dart' as path show Context;

/// Items mapped less than zero will sort before custom annotations.
/// Items mapped above zero are sorted after custom annotations.
Expand Down Expand Up @@ -808,11 +808,13 @@ abstract class ModelElement extends Canonicalization

@override
String get location {
// Call nothing from here that can emit warnings or you'll cause stack overflows.
// Call nothing from here that can emit warnings or you'll cause stack
// overflows.
var sourceUri = pathContext.toUri(sourceFileName);
if (characterLocation != null) {
return '(${path.toUri(sourceFileName)}:${characterLocation.toString()})';
return '($sourceUri:${characterLocation.toString()})';
}
return '(${path.toUri(sourceFileName)})';
return '($sourceUri)';
}

/// Returns a link to extended documentation, or the empty string if that
Expand Down
10 changes: 6 additions & 4 deletions lib/src/model/package.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import 'package:dartdoc/src/io_utils.dart';
import 'package:dartdoc/src/model/model.dart';
import 'package:dartdoc/src/package_meta.dart';
import 'package:dartdoc/src/warnings.dart';
import 'package:path/path.dart' as path;
import 'package:path/path.dart' as path show Context;
import 'package:pub_semver/pub_semver.dart';

@Deprecated('Public variable intended to be private; will be removed as early '
Expand Down Expand Up @@ -168,7 +168,7 @@ class Package extends LibraryContainer
// assembled from multiple locations?
packageGraph.hasEmbedderSdk &&
packageMeta.isSdk &&
libraries.any((l) => path.isWithin(
libraries.any((l) => _pathContext.isWithin(
packageGraph.packageMeta.dir.path,
(l.element.source.fullName))) ||
// autoIncludeDependencies means everything is local.
Expand Down Expand Up @@ -279,7 +279,7 @@ class Package extends LibraryContainer
String get href => '$baseHref$filePath';

@override
String get location => path.toUri(packageMeta.resolvedDir).toString();
String get location => _pathContext.toUri(packageMeta.resolvedDir).toString();

@override
String get name => _name;
Expand Down Expand Up @@ -371,7 +371,7 @@ class Package extends LibraryContainer
String _packagePath;

String get packagePath {
_packagePath ??= path.canonicalize(packageMeta.dir.path);
_packagePath ??= _pathContext.canonicalize(packageMeta.dir.path);
return _packagePath;
}

Expand All @@ -386,4 +386,6 @@ class Package extends LibraryContainer

@override
List<String> get containerOrder => config.packageOrder;

path.Context get _pathContext => _packageGraph.resourceProvider.pathContext;
}
Loading