From c6cbe3ec36606e42d5fed7613bea11dc03bf5270 Mon Sep 17 00:00:00 2001 From: pq Date: Wed, 20 Jul 2016 13:16:22 -0700 Subject: [PATCH 1/3] Make dartdoc strong-mode clean (#1205). Fixes https://github.com/dart-lang/dartdoc/issues/1205 --- .analysis_options | 1 + bin/dartdoc.dart | 12 +++--- lib/dartdoc.dart | 4 +- lib/src/markdown_processor.dart | 4 +- lib/src/model.dart | 67 ++++++++++++++++++--------------- lib/src/package_meta.dart | 2 +- tool/doc_packages.dart | 7 ++-- 7 files changed, 53 insertions(+), 44 deletions(-) diff --git a/.analysis_options b/.analysis_options index 5200cd3ec3..22f1e6f86d 100644 --- a/.analysis_options +++ b/.analysis_options @@ -1,4 +1,5 @@ analyzer: + strong-mode: true exclude: - 'doc/api/**' - 'lib/templates/*.html' diff --git a/bin/dartdoc.dart b/bin/dartdoc.dart index bc8f8972fd..e7ffe62a91 100644 --- a/bin/dartdoc.dart +++ b/bin/dartdoc.dart @@ -67,19 +67,21 @@ main(List arguments) async { exit(1); } - List excludeLibraries = args['exclude']; - List includeLibraries = args['include']; - List includeExternals = args['include-external']; + List excludeLibraries = args['exclude'] as List; + List includeLibraries = args['include'] as List; + List includeExternals = args['include-external'] as List; String url = args['hosted-url']; - List footerFilePaths = args['footer'].map(_resolveTildePath).toList(); + List footerFilePaths = + args['footer'].map(_resolveTildePath).toList() as List; for (String footerFilePath in footerFilePaths) { if (!new File(footerFilePath).existsSync()) { print("Error: unable to locate footer file: ${footerFilePath}."); exit(1); } } - List headerFilePaths = args['header'].map(_resolveTildePath).toList(); + List headerFilePaths = + args['header'].map(_resolveTildePath).toList() as List; for (String headerFilePath in footerFilePaths) { if (!new File(headerFilePath).existsSync()) { print("Error: unable to locate header file: ${headerFilePath}."); diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart index e4b021e661..74418dab85 100644 --- a/lib/dartdoc.dart +++ b/lib/dartdoc.dart @@ -261,7 +261,7 @@ class DartDoc { new _Error(error, info.lineInfo, packageMeta.dir.path)); }) .where((_Error error) => error.isError) - .toList()..sort(); + .toList() as List<_Error>..sort(); double seconds = _stopwatch.elapsedMilliseconds / 1000.0; print("Parsed ${libraries.length} " @@ -299,7 +299,7 @@ class DartDocResults { DartDocResults(this.packageMeta, this.package, this.outDir); } -class _Error implements Comparable { +class _Error implements Comparable<_Error> { final AnalysisError error; final LineInfo lineInfo; final String projectPath; diff --git a/lib/src/markdown_processor.dart b/lib/src/markdown_processor.dart index 3101d8c982..72451d2a1c 100644 --- a/lib/src/markdown_processor.dart +++ b/lib/src/markdown_processor.dart @@ -58,8 +58,8 @@ NodeList _getCommentRefs(ModelElement modelElement) { } var node = modelElement.element.computeNode().parent.parent; if (node is AnnotatedNode) { - if ((node as AnnotatedNode).documentationComment != null) { - return (node as AnnotatedNode).documentationComment.references; + if (node.documentationComment != null) { + return node.documentationComment.references; } } } diff --git a/lib/src/model.dart b/lib/src/model.dart index fde3ae753b..a85c4ce0dc 100644 --- a/lib/src/model.dart +++ b/lib/src/model.dart @@ -342,7 +342,7 @@ class Class extends ModelElement implements EnclosedElement { return _inheritedMethods; } - List get inheritedOperators { + List get inheritedOperators { if (_inheritedOperators != null) return _inheritedOperators; InheritanceManager manager = new InheritanceManager(element.library); MemberMap cmap = manager.getMapOfMembersInheritedFromClasses(element); @@ -690,26 +690,25 @@ abstract class EnclosedElement { } class Enum extends Class { - @override - List _constants; + List _enumFields; Enum(ClassElement element, Library library) : super(element, library); @override List get constants { - if (_constants != null) return _constants; + if (_enumFields != null) return _enumFields; // This is a hack to give 'values' an index of -1 and all other fields // their expected indicies. https://github.com/dart-lang/dartdoc/issues/1176 var index = -1; - _constants = _cls.fields + _enumFields = _cls.fields .where(isPublic) .where((f) => f.isConst) .map((field) => new EnumField.forConstant(index++, field, library)) .toList(growable: false)..sort(byName); - return _constants; + return _enumFields; } @override @@ -993,8 +992,8 @@ class Library extends ModelElement { if (_functions != null) return _functions; Set elements = new Set(); - elements.addAll(_library.definingCompilationUnit.functions); - for (CompilationUnitElement cu in _library.parts) { + elements.addAll(_libraryElement.definingCompilationUnit.functions); + for (CompilationUnitElement cu in _libraryElement.parts) { elements.addAll(cu.functions); } elements.addAll(_exportedNamespace.definedNames.values @@ -1028,7 +1027,7 @@ class Library extends ModelElement { bool get isDocumented => oneLineDoc.isNotEmpty; - bool get isInSdk => _library.isInSdk; + bool get isInSdk => _libraryElement.isInSdk; @override String get kind => 'library'; @@ -1042,7 +1041,7 @@ class Library extends ModelElement { // handle the case of an anonymous library if (element.name == null || element.name.isEmpty) { - _name = _library.definingCompilationUnit.name; + _name = _libraryElement.definingCompilationUnit.name; if (_name.endsWith('.dart')) { _name = _name.substring(0, _name.length - '.dart'.length); } @@ -1055,7 +1054,7 @@ class Library extends ModelElement { // name is to get source.encoding. // This may be wrong or misleading, but developers expect the name // of dart:____ - var source = _library.definingCompilationUnit.source; + var source = _libraryElement.definingCompilationUnit.source; _name = source.isInSystemLibrary ? source.encoding : _name; return _name; @@ -1063,7 +1062,7 @@ class Library extends ModelElement { String get packageName { if (_packageName == null) { - String sourcePath = _library.source.fullName; + String sourcePath = _libraryElement.source.fullName; File file = new File(sourcePath); if (file.existsSync()) { _packageName = _getPackageName(file.parent); @@ -1076,7 +1075,7 @@ class Library extends ModelElement { return _packageName; } - String get path => _library.definingCompilationUnit.name; + String get path => _libraryElement.definingCompilationUnit.name; /// All variables ("properties") except constants. List get properties { @@ -1088,8 +1087,9 @@ class Library extends ModelElement { if (_typeDefs != null) return _typeDefs; Set elements = new Set(); - elements.addAll(_library.definingCompilationUnit.functionTypeAliases); - for (CompilationUnitElement cu in _library.parts) { + elements + .addAll(_libraryElement.definingCompilationUnit.functionTypeAliases); + for (CompilationUnitElement cu in _libraryElement.parts) { elements.addAll(cu.functionTypeAliases); } @@ -1107,11 +1107,11 @@ class Library extends ModelElement { if (_classes != null) return _classes; Set types = new Set(); - types.addAll(_library.definingCompilationUnit.types); - for (CompilationUnitElement cu in _library.parts) { + types.addAll(_libraryElement.definingCompilationUnit.types); + for (CompilationUnitElement cu in _libraryElement.parts) { types.addAll(cu.types); } - for (LibraryElement le in _library.exportedLibraries) { + for (LibraryElement le in _libraryElement.exportedLibraries) { types.addAll(le.definingCompilationUnit.types .where((t) => _exportedNamespace.definedNames.values.contains(t.name)) .toList()); @@ -1128,7 +1128,7 @@ class Library extends ModelElement { return _classes; } - LibraryElement get _library => (element as LibraryElement); + LibraryElement get _libraryElement => (element as LibraryElement); Class getClassByName(String name) { return _allClasses.firstWhere((it) => it.name == name, orElse: () => null); @@ -1150,8 +1150,8 @@ class Library extends ModelElement { if (_variables != null) return _variables; Set elements = new Set(); - elements.addAll(_library.definingCompilationUnit.topLevelVariables); - for (CompilationUnitElement cu in _library.parts) { + elements.addAll(_libraryElement.definingCompilationUnit.topLevelVariables); + for (CompilationUnitElement cu in _libraryElement.parts) { elements.addAll(cu.topLevelVariables); } _exportedNamespace.definedNames.values.forEach((element) { @@ -1251,13 +1251,13 @@ class Method extends ModelElement // TODO: rename this to Property abstract class ModelElement implements Comparable, Nameable, Documentable { - final Element element; - final Library library; + final Element _element; + final Library _library; ElementType _modelType; String _rawDocs; Documentation __documentation; - List _parameters; + List _parameters; String _linkedName; String _fullyQualifiedName; @@ -1265,7 +1265,7 @@ abstract class ModelElement implements Comparable, Nameable, Documentable { // WARNING: putting anything into the body of this seems // to lead to stack overflows. Need to make a registry of ModelElements // somehow. - ModelElement(this.element, this.library); + ModelElement(this._element, this._library); factory ModelElement.from(Element e, Library library) { if (e.kind == ElementKind.DYNAMIC) { @@ -1363,6 +1363,8 @@ abstract class ModelElement implements Comparable, Nameable, Documentable { return _rawDocs; } + Element get element => _element; + @override String get documentationAsHtml => _documentation.asHtml; @@ -1434,6 +1436,8 @@ abstract class ModelElement implements Comparable, Nameable, Documentable { /// A human-friendly name for the kind of element this is. String get kind; + Library get library => _library; + String get linkedName { if (_linkedName == null) { _linkedName = _calculateLinkedName(); @@ -1884,7 +1888,7 @@ class Package implements Nameable, Documentable { } } -class PackageCategory implements Comparable { +class PackageCategory implements Comparable { final String name; final List _libraries = []; @@ -1960,7 +1964,8 @@ Map>>> get _crossdartJson { var crossdartFile = new File(p.join(config.inputDir.path, "crossdart.json")); if (crossdartFile.existsSync()) { - __crossdartJson = JSON.decode(crossdartFile.readAsStringSync()); + __crossdartJson = JSON.decode(crossdartFile.readAsStringSync()) + as Map>>>; } else { __crossdartJson = {}; } @@ -2038,8 +2043,8 @@ abstract class SourceCodeMixin { int get _lineNumber { var node = element.computeNode(); - if (node is Declaration && (node as Declaration).element != null) { - var element = (node as Declaration).element; + if (node is Declaration && node.element != null) { + var element = node.element; var lineNumber = lineNumberCache.lineNumber( element.source.fullName, element.nameOffset); return lineNumber + 1; @@ -2050,8 +2055,8 @@ abstract class SourceCodeMixin { String get _crossdartPath { var node = element.computeNode(); - if (node is Declaration && (node as Declaration).element != null) { - var source = ((node as Declaration).element.source as FileBasedSource); + if (node is Declaration && node.element != null) { + var source = (node.element.source as FileBasedSource); var file = source.file.toString(); var uri = source.uri.toString(); var packageMeta = library.package.packageMeta; diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart index 2b34fb2f04..4227d9a024 100644 --- a/lib/src/package_meta.dart +++ b/lib/src/package_meta.dart @@ -124,7 +124,7 @@ class _FilePackageMeta extends PackageMeta { /// empty list if no reasons found. @override List getInvalidReasons() { - var reasons = []; + List reasons = []; if (_pubspec == null || _pubspec.isEmpty) { reasons.add('No pubspec.yaml found'); } else if (!_pubspec.containsKey('name')) { diff --git a/tool/doc_packages.dart b/tool/doc_packages.dart index a57b15943d..208863bf90 100644 --- a/tool/doc_packages.dart +++ b/tool/doc_packages.dart @@ -124,7 +124,7 @@ Future> _packageUrls(int page) { return http .get('https://pub.dartlang.org/packages.json?page=${page}') .then((response) { - return JSON.decode(response.body)['packages']; + return JSON.decode(response.body)['packages'] as List; }); } @@ -133,8 +133,9 @@ Future> _getPackageInfos(List packageUrls) { return http.get(p).then((response) { var json = JSON.decode(response.body); String name = json['name']; - List versions = - json['versions'].map((v) => new Version.parse(v)).toList(); + List versions = json['versions'] + .map((v) => new Version.parse(v)) + .toList() as List; return new PackageInfo(name, Version.primary(versions)); }); }).toList(); From e4961e3820d80e92f33c0d37cb7614f4015f270d Mon Sep 17 00:00:00 2001 From: pq Date: Wed, 20 Jul 2016 13:32:13 -0700 Subject: [PATCH 2/3] Fix merge. --- lib/src/model.dart | 67 +++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/lib/src/model.dart b/lib/src/model.dart index dd13b73541..2c7f0dbb91 100644 --- a/lib/src/model.dart +++ b/lib/src/model.dart @@ -38,7 +38,8 @@ Map>>> get _crossdartJson { var crossdartFile = new File(p.join(config.inputDir.path, "crossdart.json")); if (crossdartFile.existsSync()) { - __crossdartJson = JSON.decode(crossdartFile.readAsStringSync()); + __crossdartJson = JSON.decode(crossdartFile.readAsStringSync()) + as Map>>>; } else { __crossdartJson = {}; } @@ -361,7 +362,7 @@ class Class extends ModelElement implements EnclosedElement { return _inheritedMethods; } - List get inheritedOperators { + List get inheritedOperators { if (_inheritedOperators != null) return _inheritedOperators; InheritanceManager manager = new InheritanceManager(element.library); MemberMap cmap = manager.getMapOfMembersInheritedFromClasses(element); @@ -708,26 +709,25 @@ abstract class EnclosedElement { } class Enum extends Class { - @override - List _constants; + List _enumFields; Enum(ClassElement element, Library library) : super(element, library); @override List get constants { - if (_constants != null) return _constants; + if (_enumFields != null) return _enumFields; // This is a hack to give 'values' an index of -1 and all other fields // their expected indicies. https://github.com/dart-lang/dartdoc/issues/1176 var index = -1; - _constants = _cls.fields + _enumFields = _cls.fields .where(isPublic) .where((f) => f.isConst) .map((field) => new EnumField.forConstant(index++, field, library)) .toList(growable: false)..sort(byName); - return _constants; + return _enumFields; } @override @@ -1011,8 +1011,8 @@ class Library extends ModelElement { if (_functions != null) return _functions; Set elements = new Set(); - elements.addAll(_library.definingCompilationUnit.functions); - for (CompilationUnitElement cu in _library.parts) { + elements.addAll(_libraryElement.definingCompilationUnit.functions); + for (CompilationUnitElement cu in _libraryElement.parts) { elements.addAll(cu.functions); } elements.addAll(_exportedNamespace.definedNames.values @@ -1046,7 +1046,7 @@ class Library extends ModelElement { bool get isDocumented => oneLineDoc.isNotEmpty; - bool get isInSdk => _library.isInSdk; + bool get isInSdk => _libraryElement.isInSdk; @override String get kind => 'library'; @@ -1060,7 +1060,7 @@ class Library extends ModelElement { // handle the case of an anonymous library if (element.name == null || element.name.isEmpty) { - _name = _library.definingCompilationUnit.name; + _name = _libraryElement.definingCompilationUnit.name; if (_name.endsWith('.dart')) { _name = _name.substring(0, _name.length - '.dart'.length); } @@ -1073,7 +1073,7 @@ class Library extends ModelElement { // name is to get source.encoding. // This may be wrong or misleading, but developers expect the name // of dart:____ - var source = _library.definingCompilationUnit.source; + var source = _libraryElement.definingCompilationUnit.source; _name = source.isInSystemLibrary ? source.encoding : _name; return _name; @@ -1081,7 +1081,7 @@ class Library extends ModelElement { String get packageName { if (_packageName == null) { - String sourcePath = _library.source.fullName; + String sourcePath = _libraryElement.source.fullName; File file = new File(sourcePath); if (file.existsSync()) { _packageName = _getPackageName(file.parent); @@ -1094,7 +1094,7 @@ class Library extends ModelElement { return _packageName; } - String get path => _library.definingCompilationUnit.name; + String get path => _libraryElement.definingCompilationUnit.name; /// All variables ("properties") except constants. List get properties { @@ -1106,8 +1106,9 @@ class Library extends ModelElement { if (_typeDefs != null) return _typeDefs; Set elements = new Set(); - elements.addAll(_library.definingCompilationUnit.functionTypeAliases); - for (CompilationUnitElement cu in _library.parts) { + elements + .addAll(_libraryElement.definingCompilationUnit.functionTypeAliases); + for (CompilationUnitElement cu in _libraryElement.parts) { elements.addAll(cu.functionTypeAliases); } @@ -1125,11 +1126,11 @@ class Library extends ModelElement { if (_classes != null) return _classes; Set types = new Set(); - types.addAll(_library.definingCompilationUnit.types); - for (CompilationUnitElement cu in _library.parts) { + types.addAll(_libraryElement.definingCompilationUnit.types); + for (CompilationUnitElement cu in _libraryElement.parts) { types.addAll(cu.types); } - for (LibraryElement le in _library.exportedLibraries) { + for (LibraryElement le in _libraryElement.exportedLibraries) { types.addAll(le.definingCompilationUnit.types .where((t) => _exportedNamespace.definedNames.values.contains(t.name)) .toList()); @@ -1146,7 +1147,7 @@ class Library extends ModelElement { return _classes; } - LibraryElement get _library => (element as LibraryElement); + LibraryElement get _libraryElement => (element as LibraryElement); Class getClassByName(String name) { return _allClasses.firstWhere((it) => it.name == name, orElse: () => null); @@ -1168,8 +1169,8 @@ class Library extends ModelElement { if (_variables != null) return _variables; Set elements = new Set(); - elements.addAll(_library.definingCompilationUnit.topLevelVariables); - for (CompilationUnitElement cu in _library.parts) { + elements.addAll(_libraryElement.definingCompilationUnit.topLevelVariables); + for (CompilationUnitElement cu in _libraryElement.parts) { elements.addAll(cu.topLevelVariables); } _exportedNamespace.definedNames.values.forEach((element) { @@ -1273,13 +1274,13 @@ class Method extends ModelElement } abstract class ModelElement implements Comparable, Nameable, Documentable { - final Element element; - final Library library; + final Element _element; + final Library _library; ElementType _modelType; String _rawDocs; Documentation __documentation; - List _parameters; + List _parameters; String _linkedName; String _fullyQualifiedName; @@ -1287,7 +1288,7 @@ abstract class ModelElement implements Comparable, Nameable, Documentable { // WARNING: putting anything into the body of this seems // to lead to stack overflows. Need to make a registry of ModelElements // somehow. - ModelElement(this.element, this.library); + ModelElement(this._element, this._library); factory ModelElement.from(Element e, Library library) { if (e.kind == ElementKind.DYNAMIC) { @@ -1388,6 +1389,8 @@ abstract class ModelElement implements Comparable, Nameable, Documentable { @override String get documentationAsHtml => _documentation.asHtml; + Element get element => _element; + /// Returns the fully qualified name. /// /// For example: libraryName.className.methodName @@ -1456,6 +1459,8 @@ abstract class ModelElement implements Comparable, Nameable, Documentable { /// A human-friendly name for the kind of element this is. String get kind; + Library get library => _library; + String get linkedName { if (_linkedName == null) { _linkedName = _calculateLinkedName(); @@ -1906,7 +1911,7 @@ class Package implements Nameable, Documentable { } } -class PackageCategory implements Comparable { +class PackageCategory implements Comparable { final String name; final List _libraries = []; @@ -2029,8 +2034,8 @@ abstract class SourceCodeMixin { String get _crossdartPath { var node = element.computeNode(); - if (node is Declaration && (node as Declaration).element != null) { - var source = ((node as Declaration).element.source as FileBasedSource); + if (node is Declaration && node.element != null) { + var source = (node.element.source as FileBasedSource); var file = source.file.toString(); var uri = source.uri.toString(); var packageMeta = library.package.packageMeta; @@ -2077,8 +2082,8 @@ abstract class SourceCodeMixin { int get _lineNumber { var node = element.computeNode(); - if (node is Declaration && (node as Declaration).element != null) { - var element = (node as Declaration).element; + if (node is Declaration && node.element != null) { + var element = node.element; var lineNumber = lineNumberCache.lineNumber( element.source.fullName, element.nameOffset); return lineNumber + 1; From 0d6d4e79fd20141195d751f78f3d1e827fb7c493 Mon Sep 17 00:00:00 2001 From: pq Date: Wed, 20 Jul 2016 14:15:42 -0700 Subject: [PATCH 3/3] Review fixes. --- tool/doc_packages.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tool/doc_packages.dart b/tool/doc_packages.dart index 208863bf90..b312ab12c8 100644 --- a/tool/doc_packages.dart +++ b/tool/doc_packages.dart @@ -124,7 +124,7 @@ Future> _packageUrls(int page) { return http .get('https://pub.dartlang.org/packages.json?page=${page}') .then((response) { - return JSON.decode(response.body)['packages'] as List; + return new List.from(JSON.decode(response.body)['packages']); }); } @@ -133,9 +133,8 @@ Future> _getPackageInfos(List packageUrls) { return http.get(p).then((response) { var json = JSON.decode(response.body); String name = json['name']; - List versions = json['versions'] - .map((v) => new Version.parse(v)) - .toList() as List; + List versions = new List.from( + json['versions'].map((v) => new Version.parse(v))); return new PackageInfo(name, Version.primary(versions)); }); }).toList();