Skip to content

Switch to pedantic 1.9.0 and enforce lints via presubmit #2196

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 29, 2020
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
4 changes: 3 additions & 1 deletion analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
include: package:pedantic/analysis_options.1.8.0.yaml
# Change analysis_options.yaml and analysis_options_presubmit.yaml
# together.
include: package:pedantic/analysis_options.1.9.0.yaml

analyzer:
errors:
Expand Down
33 changes: 33 additions & 0 deletions analysis_options_presubmit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Change analysis_options.yaml and analysis_options_presubmit.yaml
# together.
include: package:pedantic/analysis_options.1.9.0.yaml

analyzer:
errors:
unused_import: warning
unused_shown_name: warning
### Extra ignores for presubmit
deprecated_member_use: ignore
deprecated_member_use_from_same_package: ignore
exclude:
- 'doc/**'
- 'lib/src/third_party/pkg/**'
- 'lib/templates/*.html'
- 'pub.dartlang.org/**'
- 'testing/**'
- 'testing/test_package_flutter_plugin/**'
- 'testing/test_package_export_error/**'
linter:
rules:
- always_declare_return_types
- annotate_overrides
- avoid_init_to_null
- avoid_types_as_parameter_names
- directives_ordering
- no_adjacent_strings_in_list
- package_api_docs
- prefer_final_fields
- prefer_generic_function_type_aliases
- slash_for_doc_comments
- unawaited_futures
# - unnecessary_brace_in_string_interps
5 changes: 2 additions & 3 deletions bin/dartdoc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ Future<List<DartdocOption>> createDartdocProgramOptions() async {
/// Analyzes Dart files and generates a representation of included libraries,
/// classes, and members. Uses the current directory to look for libraries.
Future<void> main(List<String> arguments) async {
DartdocOptionSet optionSet =
await DartdocOptionSet.fromOptionGenerators('dartdoc', [
var optionSet = await DartdocOptionSet.fromOptionGenerators('dartdoc', [
createDartdocOptions,
createDartdocProgramOptions,
createLoggingOptions,
Expand Down Expand Up @@ -86,7 +85,7 @@ Future<void> main(List<String> arguments) async {
}
startLogging(config);

Dartdoc dartdoc = config.generateDocs
var dartdoc = config.generateDocs
? await Dartdoc.fromContext(config)
: await Dartdoc.withEmptyGenerator(config);
dartdoc.onCheckProgress.listen(logProgress);
Expand Down
90 changes: 44 additions & 46 deletions lib/dartdoc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import 'package:dartdoc/src/tuple.dart';
import 'package:dartdoc/src/utils.dart';
import 'package:dartdoc/src/version.dart';
import 'package:dartdoc/src/warnings.dart';
import 'package:html/dom.dart' show Element, Document;
import 'package:html/parser.dart' show parse;
import 'package:path/path.dart' as path;

Expand All @@ -49,22 +48,22 @@ class DartdocFileWriter implements FileWriter {
final String outputDir;
final Map<String, Warnable> _fileElementMap = {};
@override
final Set<String> writtenFiles = Set();
final Set<String> writtenFiles = {};

DartdocFileWriter(this.outputDir);

@override
void write(String filePath, Object content,
{bool allowOverwrite, Warnable element}) {
// Replace '/' separators with proper separators for the platform.
String outFile = path.joinAll(filePath.split('/'));
var outFile = path.joinAll(filePath.split('/'));

allowOverwrite ??= false;
if (!allowOverwrite) {
if (_fileElementMap.containsKey(outFile)) {
assert(element != null,
'Attempted overwrite of ${outFile} without corresponding element');
Warnable originalElement = _fileElementMap[outFile];
var originalElement = _fileElementMap[outFile];
Iterable<Warnable> referredFrom =
originalElement != null ? [originalElement] : null;
element?.warn(PackageWarning.duplicateFile,
Expand Down Expand Up @@ -97,7 +96,7 @@ class DartdocFileWriter implements FileWriter {
/// directory.
class Dartdoc extends PackageBuilder {
final Generator generator;
final Set<String> writtenFiles = Set();
final Set<String> writtenFiles = {};
Directory outputDir;

// Fires when the self checks make progress.
Expand Down Expand Up @@ -149,21 +148,21 @@ class Dartdoc extends PackageBuilder {
/// thrown if dartdoc fails in an expected way, for example if there is an
/// analysis error in the code.
Future<DartdocResults> generateDocsBase() async {
Stopwatch _stopwatch = Stopwatch()..start();
var _stopwatch = Stopwatch()..start();
double seconds;
packageGraph = await buildPackageGraph();
seconds = _stopwatch.elapsedMilliseconds / 1000.0;
int libs = packageGraph.libraries.length;
var libs = packageGraph.libraries.length;
logInfo("Initialized dartdoc with ${libs} librar${libs == 1 ? 'y' : 'ies'} "
"in ${seconds.toStringAsFixed(1)} seconds");
'in ${seconds.toStringAsFixed(1)} seconds');
_stopwatch.reset();

final generator = this.generator;
if (generator != null) {
// Create the out directory.
if (!outputDir.existsSync()) outputDir.createSync(recursive: true);

DartdocFileWriter writer = DartdocFileWriter(outputDir.path);
var writer = DartdocFileWriter(outputDir.path);
await generator.generate(packageGraph, writer);

writtenFiles.addAll(writer.writtenFiles);
Expand All @@ -172,10 +171,10 @@ class Dartdoc extends PackageBuilder {
}
}

int warnings = packageGraph.packageWarningCounter.warningCount;
int errors = packageGraph.packageWarningCounter.errorCount;
var warnings = packageGraph.packageWarningCounter.warningCount;
var errors = packageGraph.packageWarningCounter.errorCount;
if (warnings == 0 && errors == 0) {
logInfo("no issues found");
logInfo('no issues found');
} else {
logWarning("found ${warnings} ${pluralize('warning', warnings)} "
"and ${errors} ${pluralize('error', errors)}");
Expand All @@ -184,23 +183,23 @@ class Dartdoc extends PackageBuilder {
seconds = _stopwatch.elapsedMilliseconds / 1000.0;
libs = packageGraph.localPublicLibraries.length;
logInfo("Documented ${libs} public librar${libs == 1 ? 'y' : 'ies'} "
"in ${seconds.toStringAsFixed(1)} seconds");
'in ${seconds.toStringAsFixed(1)} seconds');
return DartdocResults(config.topLevelPackageMeta, packageGraph, outputDir);
}

Future<DartdocResults> generateDocs() async {
logInfo("Documenting ${config.topLevelPackageMeta}...");
logInfo('Documenting ${config.topLevelPackageMeta}...');

DartdocResults dartdocResults = await generateDocsBase();
var dartdocResults = await generateDocsBase();
if (dartdocResults.packageGraph.localPublicLibraries.isEmpty) {
throw DartdocFailure("dartdoc could not find any libraries to document");
throw DartdocFailure('dartdoc could not find any libraries to document');
}

final int errorCount =
final errorCount =
dartdocResults.packageGraph.packageWarningCounter.errorCount;
if (errorCount > 0) {
throw DartdocFailure(
"dartdoc encountered $errorCount errors while processing.");
'dartdoc encountered $errorCount errors while processing.');
}
logInfo(
'Success! Docs generated into ${dartdocResults.outDir.absolute.path}');
Expand All @@ -214,7 +213,7 @@ class Dartdoc extends PackageBuilder {
// Ordinarily this would go in [Package.warn], but we don't actually know what
// ModelElement to warn on yet.
Warnable warnOnElement;
Set<Warnable> referredFromElements = Set();
var referredFromElements = <Warnable>{};
Set<Warnable> warnOnElements;

// Make all paths relative to origin.
Expand Down Expand Up @@ -247,20 +246,19 @@ class Dartdoc extends PackageBuilder {
if (referredFromElements.isEmpty && referredFrom == 'index.html') {
referredFromElements.add(packageGraph.defaultPackage);
}
String message = warnOn;
var message = warnOn;
if (referredFrom == 'index.json') message = '$warnOn (from index.json)';
packageGraph.warnOnElement(warnOnElement, kind,
message: message, referredFrom: referredFromElements);
}

void _doOrphanCheck(
PackageGraph packageGraph, String origin, Set<String> visited) {
String normalOrigin = path.normalize(origin);
String staticAssets = path.joinAll([normalOrigin, 'static-assets', '']);
String indexJson = path.joinAll([normalOrigin, 'index.json']);
bool foundIndexJson = false;
for (FileSystemEntity f
in Directory(normalOrigin).listSync(recursive: true)) {
var normalOrigin = path.normalize(origin);
var staticAssets = path.joinAll([normalOrigin, 'static-assets', '']);
var indexJson = path.joinAll([normalOrigin, 'index.json']);
var foundIndexJson = false;
for (var f in Directory(normalOrigin).listSync(recursive: true)) {
var fullPath = path.normalize(f.path);
if (f is Directory) {
continue;
Expand All @@ -274,7 +272,7 @@ class Dartdoc extends PackageBuilder {
continue;
}
if (visited.contains(fullPath)) continue;
String relativeFullPath = path.relative(fullPath, from: normalOrigin);
var relativeFullPath = path.relative(fullPath, from: normalOrigin);
if (!writtenFiles.contains(relativeFullPath)) {
// This isn't a file we wrote (this time); don't claim we did.
_warn(packageGraph, PackageWarning.unknownFile, fullPath, normalOrigin);
Expand All @@ -298,18 +296,18 @@ class Dartdoc extends PackageBuilder {
// This is extracted to save memory during the check; be careful not to hang
// on to anything referencing the full file and doc tree.
Tuple2<Iterable<String>, String> _getStringLinksAndHref(String fullPath) {
File file = File("$fullPath");
var file = File('$fullPath');
if (!file.existsSync()) {
return null;
}
Document doc = parse(file.readAsBytesSync());
Element base = doc.querySelector('base');
var doc = parse(file.readAsBytesSync());
var base = doc.querySelector('base');
String baseHref;
if (base != null) {
baseHref = base.attributes['href'];
}
List<Element> links = doc.querySelectorAll('a');
List<String> stringLinks = links
var links = doc.querySelectorAll('a');
var stringLinks = links
.map((link) => link.attributes['href'])
.where((href) => href != null)
.toList();
Expand All @@ -319,23 +317,23 @@ class Dartdoc extends PackageBuilder {

void _doSearchIndexCheck(
PackageGraph packageGraph, String origin, Set<String> visited) {
String fullPath = path.joinAll([origin, 'index.json']);
String indexPath = path.joinAll([origin, 'index.html']);
File file = File("$fullPath");
var fullPath = path.joinAll([origin, 'index.json']);
var indexPath = path.joinAll([origin, 'index.html']);
var file = File('$fullPath');
if (!file.existsSync()) {
return null;
}
JsonDecoder decoder = JsonDecoder();
var decoder = JsonDecoder();
List jsonData = decoder.convert(file.readAsStringSync());

Set<String> found = Set();
var found = <String>{};
found.add(fullPath);
// The package index isn't supposed to be in the search, so suppress the
// warning.
found.add(indexPath);
for (Map<String, dynamic> entry in jsonData) {
if (entry.containsKey('href')) {
String entryPath = path.joinAll([origin, entry['href']]);
var entryPath = path.joinAll([origin, entry['href']]);
if (!visited.contains(entryPath)) {
_warn(packageGraph, PackageWarning.brokenLink, entryPath,
path.normalize(origin),
Expand All @@ -345,8 +343,8 @@ class Dartdoc extends PackageBuilder {
}
}
// Missing from search index
Set<String> missing_from_search = visited.difference(found);
for (String s in missing_from_search) {
var missing_from_search = visited.difference(found);
for (var s in missing_from_search) {
_warn(packageGraph, PackageWarning.missingFromSearchIndex, s,
path.normalize(origin),
referredFrom: fullPath);
Expand Down Expand Up @@ -380,10 +378,10 @@ class Dartdoc extends PackageBuilder {
// here instead -- occasionally, very large jobs have overflowed
// the stack without this.
// (newPathToCheck, newFullPath)
Set<Tuple2<String, String>> toVisit = Set();
var toVisit = <Tuple2<String, String>>{};

final RegExp ignoreHyperlinks = RegExp(r'^(https:|http:|mailto:|ftp:)');
for (String href in stringLinks) {
final ignoreHyperlinks = RegExp(r'^(https:|http:|mailto:|ftp:)');
for (var href in stringLinks) {
if (!href.startsWith(ignoreHyperlinks)) {
Uri uri;
try {
Expand All @@ -400,7 +398,7 @@ class Dartdoc extends PackageBuilder {
full = '${path.dirname(pathToCheck)}/$href';
}
var newPathToCheck = path.normalize(full);
String newFullPath = path.joinAll([origin, newPathToCheck]);
var newFullPath = path.joinAll([origin, newPathToCheck]);
newFullPath = path.normalize(newFullPath);
if (!visited.contains(newFullPath)) {
toVisit.add(Tuple2(newPathToCheck, newFullPath));
Expand All @@ -424,8 +422,8 @@ class Dartdoc extends PackageBuilder {
assert(_hrefs == null);
_hrefs = packageGraph.allHrefs;

final Set<String> visited = Set();
final String start = 'index.html';
final visited = <String>{};
final start = 'index.html';
logInfo('Validating docs...');
_doCheck(packageGraph, origin, visited, start);
_doOrphanCheck(packageGraph, origin, visited);
Expand Down
Loading