Index: sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart |
diff --git a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart |
index 470c9f2046c7157189b4426b4631088717cce672..02b7de7db648e0c9f37d85aae61b03361c4913ed 100644 |
--- a/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart |
+++ b/sdk/lib/_internal/dartdoc/lib/src/dartdoc/utils.dart |
@@ -2,9 +2,18 @@ |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
-part of dartdoc; |
- |
// Generic utility functions. |
+library utils; |
+ |
+import 'dart:io'; |
+import 'dart:uri'; |
+import 'dart:math' as math; |
+ |
+import 'package:pathos/path.dart' as pathos; |
+ |
+import '../../../../compiler/implementation/mirrors/mirrors.dart'; |
+ |
+import '../export_map.dart'; |
/** Turns [name] into something that's safe to use as a file name. */ |
String sanitize(String name) => name.replaceAll(':', '_').replaceAll('/', '_'); |
@@ -40,7 +49,7 @@ String repeat(String text, int count, {String separator}) { |
/** Removes up to [indentation] leading whitespace characters from [text]. */ |
String unindent(String text, int indentation) { |
var start; |
- for (start = 0; start < min(indentation, text.length); start++) { |
+ for (start = 0; start < math.min(indentation, text.length); start++) { |
// Stop if we hit a non-whitespace character. |
if (text[start] != ' ') break; |
} |
@@ -77,3 +86,76 @@ void writeString(File file, String text) { |
randomAccessFile.writeStringSync(text); |
randomAccessFile.closeSync(); |
} |
+ |
+/** |
+ * Converts [uri], which should come from a Dart import or export, to a local |
+ * filesystem path. [basePath] is the base directory to use when converting |
+ * relative URIs; without it, relative URIs will not be converted. [packageRoot] |
+ * is the `packages` directory to use when converting `package:` URIs; without |
+ * it, `package:` URIs will not be converted. |
+ * |
+ * If a URI cannot be converted, this will return `null`. |
+ */ |
+String importUriToPath(Uri uri, {String basePath, String packageRoot}) { |
+ if (uri.scheme == 'file') return fileUriToPath(uri); |
+ |
+ if (basePath != null && uri.scheme == '') { |
+ return pathos.normalize(pathos.absolute(pathos.join(basePath, uri.path))); |
+ } |
+ |
+ if (packageRoot != null && uri.scheme == 'package') { |
+ return pathos.normalize(pathos.absolute( |
+ pathos.join(packageRoot, uri.path))); |
+ } |
+ |
+ // Ignore unsupported schemes. |
+ return null; |
+} |
+ |
+/** Converts a `file:` [Uri] to a local path string. */ |
+String fileUriToPath(Uri uri) { |
+ if (uri.scheme != 'file') { |
+ throw new ArgumentError("Uri $uri must have scheme 'file:'."); |
+ } |
+ if (Platform.operatingSystem != 'windows') return pathos.normalize(uri.path); |
+ return pathos.normalize(uri.path.replaceFirst("/", "").replaceAll("/", "\\")); |
+} |
+ |
+/** Converts a local path string to a `file:` [Uri]. */ |
+Uri pathToFileUri(String path) { |
+ path = pathos.absolute(path); |
+ if (Platform.operatingSystem != 'windows') { |
+ return Uri.parse('file://$path'); |
+ } else { |
+ return Uri.parse('file:///${path.replaceAll("\\", "/")}'); |
+ } |
+} |
+ |
+/** |
+ * If [map] contains an [Export] under [key], this merges that with [export]. |
+ * Otherwise, it sets [key] to [export]. |
+ */ |
+void addOrMergeExport(Map<String, Export> map, String key, Export export) { |
+ if (map.containsKey(key)) { |
+ map[key] = map[key].merge(export); |
+ } else { |
+ map[key] = export; |
+ } |
+} |
+ |
+/// A pair of values. |
+class Pair<E, F> { |
+ E first; |
+ F last; |
+ |
+ Pair(this.first, this.last); |
+ |
+ String toString() => '($first, $last)'; |
+ |
+ bool operator==(other) { |
+ if (other is! Pair) return false; |
+ return other.first == first && other.last == last; |
+ } |
+ |
+ int get hashCode => first.hashCode ^ last.hashCode; |
+} |