Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// **docgen** is a tool for creating machine readable representations of Dart | 5 /// **docgen** is a tool for creating machine readable representations of Dart |
| 6 /// code metadata, including: classes, members, comments and annotations. | 6 /// code metadata, including: classes, members, comments and annotations. |
| 7 /// | 7 /// |
| 8 /// docgen is run on a `.dart` file or a directory containing `.dart` files. | 8 /// docgen is run on a `.dart` file or a directory containing `.dart` files. |
| 9 /// | 9 /// |
| 10 /// $ dart docgen.dart [OPTIONS] [FILE/DIR] | 10 /// $ dart docgen.dart [OPTIONS] [FILE/DIR] |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 29 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirro r.dart' | 29 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirro r.dart' |
| 30 as dart2js; | 30 as dart2js; |
| 31 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart' ; | 31 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors.dart' ; |
| 32 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util. dart' | 32 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util. dart' |
| 33 as dart2js_util; | 33 as dart2js_util; |
| 34 import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider. dart'; | 34 import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider. dart'; |
| 35 import '../../../sdk/lib/_internal/libraries.dart'; | 35 import '../../../sdk/lib/_internal/libraries.dart'; |
| 36 | 36 |
| 37 var logger = new Logger('Docgen'); | 37 var logger = new Logger('Docgen'); |
| 38 | 38 |
| 39 var outputDirectory = 'docs'; | |
| 40 | |
| 39 const String USAGE = 'Usage: dart docgen.dart [OPTIONS] fooDir/barFile'; | 41 const String USAGE = 'Usage: dart docgen.dart [OPTIONS] fooDir/barFile'; |
| 40 | 42 |
| 41 | 43 |
| 42 List<String> skippedAnnotations = const [ | 44 List<String> skippedAnnotations = const [ |
| 43 'metadata.DocsEditable', '_js_helper.JSName', '_js_helper.Creates', | 45 'metadata.DocsEditable', '_js_helper.JSName', '_js_helper.Creates', |
| 44 '_js_helper.Returns']; | 46 '_js_helper.Returns']; |
| 45 | 47 |
| 46 /// Set of libraries declared in the SDK, so libraries that can be accessed | 48 /// Set of libraries declared in the SDK, so libraries that can be accessed |
| 47 /// when running dart by default. | 49 /// when running dart by default. |
| 48 Iterable<LibraryMirror> _sdkLibraries; | 50 Iterable<LibraryMirror> _sdkLibraries; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 67 /// Resolves reference links in doc comments. | 69 /// Resolves reference links in doc comments. |
| 68 markdown.Resolver linkResolver; | 70 markdown.Resolver linkResolver; |
| 69 | 71 |
| 70 /// Index of all indexable items. This also ensures that no class is | 72 /// Index of all indexable items. This also ensures that no class is |
| 71 /// created more than once. | 73 /// created more than once. |
| 72 Map<String, Indexable> entityMap = new Map<String, Indexable>(); | 74 Map<String, Indexable> entityMap = new Map<String, Indexable>(); |
| 73 | 75 |
| 74 /// This is set from the command line arguments flag --include-private | 76 /// This is set from the command line arguments flag --include-private |
| 75 bool _includePrivate = false; | 77 bool _includePrivate = false; |
| 76 | 78 |
| 79 /// Library names to explicitly exclude. Set from the command line option | |
| 80 /// --exclude-lib | |
|
Bob Nystrom
2013/11/14 22:43:04
"."
Also, current doc comment convention is that
Alan Knight
2013/11/15 18:49:56
Done.
| |
| 81 List<String> _excluded; | |
| 82 | |
| 77 // TODO(janicejl): Make MDN content generic or pluggable. Maybe move | 83 // TODO(janicejl): Make MDN content generic or pluggable. Maybe move |
| 78 // MDN-specific code to its own library that is imported into the default impl? | 84 // MDN-specific code to its own library that is imported into the default impl? |
| 79 /// Map of all the comments for dom elements from MDN. | 85 /// Map of all the comments for dom elements from MDN. |
| 80 Map _mdn; | 86 Map _mdn; |
| 81 | 87 |
| 82 /// Docgen constructor initializes the link resolver for markdown parsing. | 88 /// Docgen constructor initializes the link resolver for markdown parsing. |
| 83 /// Also initializes the command line arguments. | 89 /// Also initializes the command line arguments. |
| 84 /// | 90 /// |
| 85 /// [packageRoot] is the packages directory of the directory being analyzed. | 91 /// [packageRoot] is the packages directory of the directory being analyzed. |
| 86 /// If [includeSdk] is `true`, then any SDK libraries explicitly imported will | 92 /// If [includeSdk] is `true`, then any SDK libraries explicitly imported will |
| 87 /// also be documented. | 93 /// also be documented. |
| 88 /// If [parseSdk] is `true`, then all Dart SDK libraries will be documented. | 94 /// If [parseSdk] is `true`, then all Dart SDK libraries will be documented. |
| 89 /// This option is useful when only the SDK libraries are needed. | 95 /// This option is useful when only the SDK libraries are needed. |
| 90 /// | 96 /// |
| 91 /// Returned Future completes with true if document generation is successful. | 97 /// Returned Future completes with true if document generation is successful. |
| 92 Future<bool> docgen(List<String> files, {String packageRoot, | 98 Future<bool> docgen(List<String> files, {String packageRoot, |
| 93 bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false, | 99 bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false, |
| 94 bool parseSdk: false, bool append: false, String introduction: ''}) { | 100 bool parseSdk: false, bool append: false, String introduction: '', |
| 101 out: 'docs', List<String> excludeLibraries}) { | |
| 102 _excluded = excludeLibraries; | |
| 95 _includePrivate = includePrivate; | 103 _includePrivate = includePrivate; |
| 104 outputDirectory = out; | |
| 96 if (!append) { | 105 if (!append) { |
| 97 var dir = new Directory('docs'); | 106 var dir = new Directory(outputDirectory); |
| 98 if (dir.existsSync()) dir.deleteSync(recursive: true); | 107 if (dir.existsSync()) dir.deleteSync(recursive: true); |
| 99 } | 108 } |
| 100 | 109 |
| 101 if (packageRoot == null && !parseSdk) { | 110 if (packageRoot == null && !parseSdk) { |
| 102 var type = FileSystemEntity.typeSync(files.first); | 111 var type = FileSystemEntity.typeSync(files.first); |
| 103 if (type == FileSystemEntityType.DIRECTORY) { | 112 if (type == FileSystemEntityType.DIRECTORY) { |
| 104 packageRoot = _findPackageRoot(files.first); | 113 packageRoot = _findPackageRoot(files.first); |
| 105 } else if (type == FileSystemEntityType.FILE) { | 114 } else if (type == FileSystemEntityType.FILE) { |
| 106 logger.warning('WARNING: No package root defined. If Docgen fails, try ' | 115 logger.warning('WARNING: No package root defined. If Docgen fails, try ' |
| 107 'again by setting the --package-root option.'); | 116 'again by setting the --package-root option.'); |
| 108 } | 117 } |
| 109 } | 118 } |
| 110 logger.info('Package Root: ${packageRoot}'); | 119 logger.info('Package Root: ${packageRoot}'); |
| 111 linkResolver = (name) => | 120 linkResolver = (name) => |
| 112 fixReference(name, _currentLibrary, _currentClass, _currentMember); | 121 fixReference(name, _currentLibrary, _currentClass, _currentMember); |
| 122 var librariesWeAskedFor = !parseSdk ? _listLibraries(files) : _listSdk(); | |
|
Bob Nystrom
2013/11/14 22:43:04
"We" seems funny to me. How about "requestedLibrar
Alan Knight
2013/11/15 18:49:56
Done.
| |
| 113 | 123 |
| 114 return getMirrorSystem(files, packageRoot: packageRoot, parseSdk: parseSdk) | 124 return getMirrorSystem(librariesWeAskedFor, packageRoot: packageRoot, |
| 125 parseSdk: parseSdk) | |
| 115 .then((MirrorSystem mirrorSystem) { | 126 .then((MirrorSystem mirrorSystem) { |
| 116 if (mirrorSystem.libraries.isEmpty) { | 127 if (mirrorSystem.libraries.isEmpty) { |
| 117 throw new StateError('No library mirrors were created.'); | 128 throw new StateError('No library mirrors were created.'); |
| 118 } | 129 } |
| 119 var librariesWeAskedFor = _listLibraries(files); | |
| 120 var librariesWeGot = mirrorSystem.libraries.values.where( | 130 var librariesWeGot = mirrorSystem.libraries.values.where( |
| 121 (each) => each.uri.scheme == 'file'); | 131 (each) => each.uri.scheme == 'file'); |
| 122 _sdkLibraries = mirrorSystem.libraries.values.where( | 132 _sdkLibraries = mirrorSystem.libraries.values.where( |
| 123 (each) => each.uri.scheme == 'dart'); | 133 (each) => each.uri.scheme == 'dart'); |
| 124 _coreLibrary = _sdkLibraries.singleWhere((lib) => | 134 _coreLibrary = _sdkLibraries.singleWhere((lib) => |
| 125 lib.uri.toString().startsWith('dart:core')); | 135 lib.uri.toString().startsWith('dart:core')); |
| 126 var librariesWeGotByPath = new Map.fromIterables( | 136 var librariesWeGotByPath = new Map.fromIterables( |
| 127 librariesWeGot.map((each) => each.uri.toFilePath()), | 137 librariesWeGot.map((each) => each.uri.toFilePath()), |
| 128 librariesWeGot); | 138 librariesWeGot); |
| 129 var librariesToDocument = librariesWeAskedFor.map( | 139 var librariesToDocument = librariesWeAskedFor.map( |
| 130 (each) => librariesWeGotByPath.putIfAbsent(each, | 140 (each) => librariesWeGotByPath.putIfAbsent(each, |
| 131 () => throw "Missing library $each")).toList(); | 141 () => throw "Missing library $each")).toList(); |
| 132 librariesToDocument.addAll((includeSdk || parseSdk) ? _sdkLibraries : []); | 142 librariesToDocument.addAll((includeSdk || parseSdk) ? _sdkLibraries : []); |
| 143 librariesToDocument.removeWhere((x) => _excluded.contains(x.simpleName)); | |
| 133 _documentLibraries(librariesToDocument, includeSdk: includeSdk, | 144 _documentLibraries(librariesToDocument, includeSdk: includeSdk, |
| 134 outputToYaml: outputToYaml, append: append, parseSdk: parseSdk, | 145 outputToYaml: outputToYaml, append: append, parseSdk: parseSdk, |
| 135 introduction: introduction); | 146 introduction: introduction); |
| 136 return true; | 147 return true; |
| 137 }); | 148 }); |
| 138 } | 149 } |
| 139 | 150 |
| 140 /// For a library's [mirror], determine the name of the package (if any) we | 151 /// For a library's [mirror], determine the name of the package (if any) we |
| 141 /// believe it came from (because of its file URI). | 152 /// believe it came from (because of its file URI). |
| 142 /// | 153 /// |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 171 if (readmes.isEmpty) return ''; | 182 if (readmes.isEmpty) return ''; |
| 172 // If there are multiples, pick the shortest name. | 183 // If there are multiples, pick the shortest name. |
| 173 readmes.sort((a, b) => a.length.compareTo(b.length)); | 184 readmes.sort((a, b) => a.length.compareTo(b.length)); |
| 174 var readme = readmes.first; | 185 var readme = readmes.first; |
| 175 var contents = markdown.markdownToHtml(readme | 186 var contents = markdown.markdownToHtml(readme |
| 176 .readAsStringSync(), linkResolver: linkResolver, | 187 .readAsStringSync(), linkResolver: linkResolver, |
| 177 inlineSyntaxes: markdownSyntaxes); | 188 inlineSyntaxes: markdownSyntaxes); |
| 178 return contents; | 189 return contents; |
| 179 } | 190 } |
| 180 | 191 |
| 181 | |
| 182 List<String> _listLibraries(List<String> args) { | 192 List<String> _listLibraries(List<String> args) { |
| 183 var libraries = new List<String>(); | 193 var libraries = new List<String>(); |
| 184 for (var arg in args) { | 194 for (var arg in args) { |
| 185 var type = FileSystemEntity.typeSync(arg); | 195 var type = FileSystemEntity.typeSync(arg); |
| 186 | 196 |
| 187 if (type == FileSystemEntityType.FILE) { | 197 if (type == FileSystemEntityType.FILE) { |
| 188 if (arg.endsWith('.dart')) { | 198 if (arg.endsWith('.dart')) { |
| 189 libraries.add(path.absolute(arg)); | 199 libraries.add(path.absolute(arg)); |
| 190 logger.info('Added to libraries: ${libraries.last}'); | 200 logger.info('Added to libraries: ${libraries.last}'); |
| 191 } | 201 } |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 211 // Only add the file if it does not contain 'part of' | 221 // Only add the file if it does not contain 'part of' |
| 212 // TODO(janicejl): Remove when Issue(12406) is resolved. | 222 // TODO(janicejl): Remove when Issue(12406) is resolved. |
| 213 var contents = new File(f).readAsStringSync(); | 223 var contents = new File(f).readAsStringSync(); |
| 214 if (!(contents.contains(new RegExp('\npart of ')) || | 224 if (!(contents.contains(new RegExp('\npart of ')) || |
| 215 contents.startsWith(new RegExp('part of ')))) { | 225 contents.startsWith(new RegExp('part of ')))) { |
| 216 libraries.add(f); | 226 libraries.add(f); |
| 217 logger.info('Added to libraries: $f'); | 227 logger.info('Added to libraries: $f'); |
| 218 } | 228 } |
| 219 } | 229 } |
| 220 }); | 230 }); |
| 221 return libraries; | 231 return libraries.map((each) => path.normalize(path.absolute(each))).toList(); |
|
Bob Nystrom
2013/11/14 22:43:04
Could also do:
libraries.map(path.absolute).map(p
Alan Knight
2013/11/15 18:49:56
I like yours better. Done.
| |
| 222 } | 232 } |
| 223 | 233 |
| 224 String _findPackageRoot(String directory) { | 234 String _findPackageRoot(String directory) { |
| 225 var files = listDir(directory, recursive: true); | 235 var files = listDir(directory, recursive: true); |
| 226 // Return '' means that there was no pubspec.yaml and therefor no packageRoot. | 236 // Return '' means that there was no pubspec.yaml and therefor no packageRoot. |
| 227 String packageRoot = files.firstWhere((f) => | 237 String packageRoot = files.firstWhere((f) => |
| 228 f.endsWith('${path.separator}pubspec.yaml'), orElse: () => ''); | 238 f.endsWith('${path.separator}pubspec.yaml'), orElse: () => ''); |
| 229 if (packageRoot != '') { | 239 if (packageRoot != '') { |
| 230 packageRoot = path.join(path.dirname(packageRoot), 'packages'); | 240 packageRoot = path.join(path.dirname(packageRoot), 'packages'); |
| 231 } | 241 } |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 247 if (info.documented) { | 257 if (info.documented) { |
| 248 sdk.add('dart:$name'); | 258 sdk.add('dart:$name'); |
| 249 logger.info('Add to SDK: ${sdk.last}'); | 259 logger.info('Add to SDK: ${sdk.last}'); |
| 250 } | 260 } |
| 251 }); | 261 }); |
| 252 return sdk; | 262 return sdk; |
| 253 } | 263 } |
| 254 | 264 |
| 255 /// Analyzes set of libraries by getting a mirror system and triggers the | 265 /// Analyzes set of libraries by getting a mirror system and triggers the |
| 256 /// documentation of the libraries. | 266 /// documentation of the libraries. |
| 257 Future<MirrorSystem> getMirrorSystem(List<String> args, {String packageRoot, | 267 Future<MirrorSystem> getMirrorSystem(List<String> libraries, |
| 258 bool parseSdk: false}) { | 268 {String packageRoot, bool parseSdk: false}) { |
| 259 var libraries = !parseSdk ? _listLibraries(args) : _listSdk(); | |
| 260 if (libraries.isEmpty) throw new StateError('No Libraries.'); | 269 if (libraries.isEmpty) throw new StateError('No Libraries.'); |
| 261 // Finds the root of SDK library based off the location of docgen. | 270 // Finds the root of SDK library based off the location of docgen. |
| 262 | 271 |
| 263 var root = findRootDirectory(); | 272 var root = findRootDirectory(); |
| 264 var sdkRoot = path.normalize(path.absolute(path.join(root, 'sdk'))); | 273 var sdkRoot = path.normalize(path.absolute(path.join(root, 'sdk'))); |
| 265 logger.info('SDK Root: ${sdkRoot}'); | 274 logger.info('SDK Root: ${sdkRoot}'); |
| 266 return _analyzeLibraries(libraries, sdkRoot, packageRoot: packageRoot); | 275 return _analyzeLibraries(libraries, sdkRoot, packageRoot: packageRoot); |
| 267 } | 276 } |
| 268 | 277 |
| 269 String findRootDirectory() { | 278 String findRootDirectory() { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 324 // Everything is a subclass of Object, therefore empty the list to avoid a | 333 // Everything is a subclass of Object, therefore empty the list to avoid a |
| 325 // giant list of subclasses to be printed out. | 334 // giant list of subclasses to be printed out. |
| 326 if (includeSdk) (entityMap['dart-core.Object'] as Class).subclasses.clear(); | 335 if (includeSdk) (entityMap['dart-core.Object'] as Class).subclasses.clear(); |
| 327 | 336 |
| 328 var filteredEntities = entityMap.values.where(_isVisible); | 337 var filteredEntities = entityMap.values.where(_isVisible); |
| 329 | 338 |
| 330 // Outputs a JSON file with all libraries and their preview comments. | 339 // Outputs a JSON file with all libraries and their preview comments. |
| 331 // This will help the viewer know what libraries are available to read in. | 340 // This will help the viewer know what libraries are available to read in. |
| 332 var libraryMap; | 341 var libraryMap; |
| 333 if (append) { | 342 if (append) { |
| 334 var docsDir = listDir('docs'); | 343 var docsDir = listDir(outputDirectory); |
| 335 if (!docsDir.contains('docs/library_list.json')) { | 344 if (!docsDir.contains('$outputDirectory/library_list.json')) { |
| 336 throw new StateError('No library_list.json'); | 345 throw new StateError('No library_list.json'); |
| 337 } | 346 } |
| 338 libraryMap = | 347 libraryMap = |
| 339 JSON.decode(new File('docs/library_list.json').readAsStringSync()); | 348 JSON.decode(new File('$outputDirectory/library_list.json').readAsStringS ync()); |
| 340 libraryMap['libraries'].addAll(filteredEntities | 349 libraryMap['libraries'].addAll(filteredEntities |
| 341 .where((e) => e is Library) | 350 .where((e) => e is Library) |
| 342 .map((e) => e.previewMap)); | 351 .map((e) => e.previewMap)); |
| 343 if (introduction.isNotEmpty) { | 352 if (introduction.isNotEmpty) { |
| 344 var intro = libraryMap['introduction']; | 353 var intro = libraryMap['introduction']; |
| 345 if (intro.isNotEmpty) intro += '<br/><br/>'; | 354 if (intro.isNotEmpty) intro += '<br/><br/>'; |
| 346 intro += markdown.markdownToHtml( | 355 intro += markdown.markdownToHtml( |
| 347 new File(introduction).readAsStringSync(), | 356 new File(introduction).readAsStringSync(), |
| 348 linkResolver: linkResolver, inlineSyntaxes: markdownSyntaxes); | 357 linkResolver: linkResolver, inlineSyntaxes: markdownSyntaxes); |
| 349 libraryMap['introduction'] = intro; | 358 libraryMap['introduction'] = intro; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 370 // Outputs all the qualified names documented with their type. | 379 // Outputs all the qualified names documented with their type. |
| 371 // This will help generate search results. | 380 // This will help generate search results. |
| 372 _writeToFile(filteredEntities.map((e) => | 381 _writeToFile(filteredEntities.map((e) => |
| 373 '${e.qualifiedName} ${e.typeName}').join('\n') + '\n', | 382 '${e.qualifiedName} ${e.typeName}').join('\n') + '\n', |
| 374 'index.txt', append: append); | 383 'index.txt', append: append); |
| 375 var index = new Map.fromIterables( | 384 var index = new Map.fromIterables( |
| 376 filteredEntities.map((e) => e.qualifiedName), | 385 filteredEntities.map((e) => e.qualifiedName), |
| 377 filteredEntities.map((e) => e.typeName)); | 386 filteredEntities.map((e) => e.typeName)); |
| 378 if (append) { | 387 if (append) { |
| 379 var previousIndex = | 388 var previousIndex = |
| 380 JSON.decode(new File('docs/index.json').readAsStringSync()); | 389 JSON.decode(new File('$outputDirectory/index.json').readAsStringSync()); |
| 381 index.addAll(previousIndex); | 390 index.addAll(previousIndex); |
| 382 } | 391 } |
| 383 _writeToFile(JSON.encode(index), 'index.json'); | 392 _writeToFile(JSON.encode(index), 'index.json'); |
| 384 } | 393 } |
| 385 | 394 |
| 386 Library generateLibrary(dart2js.Dart2JsLibraryMirror library) { | 395 Library generateLibrary(dart2js.Dart2JsLibraryMirror library) { |
| 387 _currentLibrary = library; | 396 _currentLibrary = library; |
| 388 var result = new Library(docName(library), _commentToHtml(library), | 397 var result = new Library(docName(library), _commentToHtml(library), |
| 389 _classes(library.classes), | 398 _classes(library.classes), |
| 390 _methods(library.functions), | 399 _methods(library.functions), |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 765 if (mirror is ClassMirror && !mirror.isTypedef) { | 774 if (mirror is ClassMirror && !mirror.isTypedef) { |
| 766 var innerList = []; | 775 var innerList = []; |
| 767 mirror.typeArguments.forEach((e) { | 776 mirror.typeArguments.forEach((e) { |
| 768 innerList.add(new Type(docName(e), _typeGenerics(e))); | 777 innerList.add(new Type(docName(e), _typeGenerics(e))); |
| 769 }); | 778 }); |
| 770 return innerList; | 779 return innerList; |
| 771 } | 780 } |
| 772 return []; | 781 return []; |
| 773 } | 782 } |
| 774 | 783 |
| 775 /// Writes text to a file in the 'docs' directory. | 784 /// Writes text to a file in the output directory. |
| 776 void _writeToFile(String text, String filename, {bool append: false}) { | 785 void _writeToFile(String text, String filename, {bool append: false}) { |
| 777 Directory dir = new Directory('docs'); | 786 Directory dir = new Directory(outputDirectory); |
| 778 if (!dir.existsSync()) { | 787 if (!dir.existsSync()) { |
| 779 dir.createSync(); | 788 dir.createSync(); |
| 780 } | 789 } |
| 781 // We assume there's a single extra level of directory structure for packages. | 790 // We assume there's a single extra level of directory structure for packages. |
| 782 if (path.split(filename).length > 1) { | 791 if (path.split(filename).length > 1) { |
| 783 var subdir = new Directory(path.join('docs', path.dirname(filename))); | 792 var subdir = new Directory(path.join(outputDirectory, path.dirname(filename) )); |
| 784 if (!subdir.existsSync()) { | 793 if (!subdir.existsSync()) { |
| 785 subdir.createSync(); | 794 subdir.createSync(); |
| 786 } | 795 } |
| 787 } | 796 } |
| 788 | 797 |
| 789 File file = new File('docs/$filename'); | 798 File file = new File('$outputDirectory/$filename'); |
|
Bob Nystrom
2013/11/14 22:43:04
Since you're using path.join() a few lines up, let
Alan Knight
2013/11/15 18:49:56
Done.
| |
| 790 if (!file.existsSync()) { | 799 if (!file.existsSync()) { |
| 791 file.createSync(); | 800 file.createSync(); |
| 792 } | 801 } |
| 793 file.writeAsStringSync(text, mode: append ? FileMode.APPEND : FileMode.WRITE); | 802 file.writeAsStringSync(text, mode: append ? FileMode.APPEND : FileMode.WRITE); |
| 794 } | 803 } |
| 795 | 804 |
| 796 /// Transforms the map by calling toMap on each value in it. | 805 /// Transforms the map by calling toMap on each value in it. |
| 797 Map recurseMap(Map inputMap) { | 806 Map recurseMap(Map inputMap) { |
| 798 var outputMap = {}; | 807 var outputMap = {}; |
| 799 inputMap.forEach((key, value) { | 808 inputMap.forEach((key, value) { |
| (...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1396 /// Remove statics from the map of inherited items before adding them. | 1405 /// Remove statics from the map of inherited items before adding them. |
| 1397 Map _filterStatics(Map items) { | 1406 Map _filterStatics(Map items) { |
| 1398 var result = {}; | 1407 var result = {}; |
| 1399 items.forEach((name, item) { | 1408 items.forEach((name, item) { |
| 1400 if (!item.isStatic) { | 1409 if (!item.isStatic) { |
| 1401 result[name] = item; | 1410 result[name] = item; |
| 1402 } | 1411 } |
| 1403 }); | 1412 }); |
| 1404 return result; | 1413 return result; |
| 1405 } | 1414 } |
| OLD | NEW |