Index: sdk/lib/_internal/dartdoc/lib/universe_serializer.dart |
diff --git a/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart b/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart |
index ea87229c886ae62fdb68246d31946e2aedb3429e..24633fdb5f287de40958e7fad3836f0ece30e594 100755 |
--- a/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart |
+++ b/sdk/lib/_internal/dartdoc/lib/universe_serializer.dart |
@@ -8,11 +8,14 @@ |
*/ |
library universe_serializer; |
+import 'dartdoc.dart'; |
+ |
+// TODO(rnystrom): Use "package:" URL (#4968). |
+import '../../../../../pkg/pathos/lib/path.dart' as path; |
+import '../../compiler/implementation/mirrors/dart2js_mirror.dart' as dart2js; |
import '../../compiler/implementation/mirrors/mirrors.dart'; |
import '../../compiler/implementation/mirrors/mirrors_util.dart'; |
-import '../../compiler/implementation/mirrors/dart2js_mirror.dart' as dart2js; |
import '../../libraries.dart'; |
-import 'dartdoc.dart'; |
String _stripUri(String uri) { |
String prefix = "/dart/"; |
@@ -40,7 +43,7 @@ class Element { |
final String id; |
/** Raw text of the comment associated with the Element if any. */ |
final String comment; |
- /** Raw html comment for the Element from MDN. */ |
+ /** Raw html comment for the Element from MDN. */ |
String mdnCommentHtml; |
/** |
* The URL to the page on MDN that content was pulled from for the current |
@@ -136,7 +139,7 @@ class LibraryElement extends Element { |
* or implemented by classes in this library. |
*/ |
List<LibraryElement> dependencies; |
- |
+ |
/** |
* Construct a LibraryElement from a [mirror]. |
* |
@@ -197,21 +200,30 @@ class LibraryElement extends Element { |
// TODO(jacobr): this is a hack. Remove once these libraries are removed |
// from the sdk. |
var uri = mirror.uri; |
- var path = uri.path; |
- var pattern = new RegExp(r'[\\/]dart[\\/]pkg[\\/]([^\\/]+)[\\/]lib[\\/](.+)$'); |
- var match = pattern.firstMatch(path); |
- var package; |
- if (match != null) { |
- package = match.group(1); |
- path = match.group(2); |
+ var uriPath = uri.path; |
+ |
+ var parts = path.split(uriPath); |
+ |
+ // Find either pkg/ or packages/ |
+ var pkgDir = parts.lastIndexOf('pkg'); |
+ var packageDir = parts.lastIndexOf('packages'); |
+ |
+ if (pkgDir >= 0) { |
+ packageDir = pkgDir; |
} |
- // TODO(jacobr): add a second pattern for a more typical pub environment. |
- if (package != null) { |
- return 'package:$package/$path'; |
- } else { |
+ |
+ var libDir = parts.lastIndexOf('lib'); |
+ var rest = parts.getRange(libDir + 1, parts.length - libDir - 1); |
+ |
+ // If there's no lib, we can't find the package. |
+ if (libDir < 0 || libDir < packageDir) { |
// TODO(jacobr): this is a lousy fallback. |
- print("Unable to determine package for $path."); |
+ print("Unable to determine package for $uriPath."); |
return mirror.uri.toString(); |
+ } else if (packageDir >= 0 && rest.length >= 1) { |
+ // For URI: foo/bar/packages/widget/lib/sprocket.dart will return: |
+ // 'package:widget/sprocket.dart' |
+ return 'package:${parts[packageDir + 1]}/${rest.join('/')}'; |
} |
} else { |
return mirror.uri.toString(); |
@@ -253,7 +265,7 @@ class ClassElement extends Element { |
List<Reference> interfaces; |
/** Whether the class implements or extends [Error] or [Exception]. */ |
bool isThrowable; |
- |
+ |
/** |
* Constructs a [ClassElement] from a [ClassMirror]. |
* |
@@ -393,7 +405,7 @@ class ParameterElement extends Element { |
* Returns the initialized field, if this parameter is an initializing formal. |
*/ |
final Reference initializedField; |
- |
+ |
ParameterElement(ParameterMirror mirror) |
: super(mirror, 'param', mirror.simpleName, mirror.simpleName, null, |
null), |
@@ -402,7 +414,7 @@ class ParameterElement extends Element { |
defaultValue = mirror.defaultValue, |
isNamed = _optionalBool(mirror.isNamed), |
initializedField = _optionalReference(mirror.initializedField) { |
- |
+ |
if (mirror.type is FunctionTypeMirror) { |
addChild(new FunctionTypeElement(mirror.type)); |
} |
@@ -411,7 +423,7 @@ class ParameterElement extends Element { |
class FunctionTypeElement extends Element { |
final Reference returnType; |
- |
+ |
FunctionTypeElement(FunctionTypeMirror mirror) |
: super(mirror, 'functiontype', mirror.simpleName, mirror.simpleName, null, null), |
returnType = _optionalReference(mirror.returnType) { |
@@ -431,7 +443,7 @@ class FunctionTypeElement extends Element { |
class TypeParameterElement extends Element { |
/** |
* Upper bound for the parameter. |
- * |
+ * |
* In the following code sample, [:Bar:] is an upper bound: |
* [: class Bar<T extends Foo> { } :] |
*/ |
@@ -505,7 +517,7 @@ class Reference { |
} |
} |
} |
- |
+ |
// TODO(jacobr): compute the referenceId correctly for the general case so |
// that this method can work with all element types not just LibraryElements. |
Reference.fromElement(LibraryElement e) : name = e.name, refId = e.id; |