blob: 4a5b6c8437c89ddd1d03218182a778350b82400e [file] [log] [blame]
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// 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.
import 'dart:io';
import 'package:args/args.dart';
/// Generates rule and rule test stub files (int src/rules and test/rules
/// respectively), as well as the rule index (rules.dart).
void main([List<String> args]) {
var parser = new ArgParser(allowTrailingOptions: true);
parser.addOption('out', abbr: 'o', help: 'Specifies project root.');
parser.addOption('library',
abbr: 'l', help: 'Specifies lower_underscore rule library name.');
var options;
try {
options = parser.parse(args);
} on FormatException catch (err) {
printUsage(parser, err.message);
return;
}
var outDir = options['out'];
if (outDir != null) {
Directory d = new Directory(outDir);
if (!d.existsSync()) {
print("Directory '${d.path}' does not exist");
return;
}
}
var libName = options['library'];
if (libName == null) {
printUsage(parser);
return;
}
// Generate rule stub.
generateRule(libName, outDir: outDir);
}
String capitalize(String s) => s.substring(0, 1).toUpperCase() + s.substring(1);
void generateRule(String libName, {String outDir}) {
// Generate rule stub.
generateStub(libName, outDir: outDir);
// Generate test stub.
generateTest(libName, outDir: outDir);
// Update rule registry.
updateRuleRegistry(libName);
}
void generateStub(String libName, {String outDir}) {
var generated = _generateStub(libName, toClassName(libName));
if (outDir != null) {
var outPath = '$outDir/lib/src/rules/$libName.dart';
print('Writing to $outPath');
new File(outPath).writeAsStringSync(generated);
} else {
print(generated);
}
}
void generateTest(String libName, {String outDir}) {
var generated = _generateTest(libName, toClassName(libName));
if (outDir != null) {
var outPath = '$outDir/test/rules/$libName.dart';
print('Writing to $outPath');
new File(outPath).writeAsStringSync(generated);
} else {
print(generated);
}
}
void printUsage(ArgParser parser, [String error]) {
var message = error ?? 'Generates rule stubs.';
stdout.write('''$message
Usage: rule
${parser.usage}
''');
}
String toClassName(String libName) =>
libName.split('_').map((bit) => capitalize(bit)).join();
void updateRuleRegistry(String libName) {
//TODO: find right place to insert into imports and ruleMap
print("Don't forget to update lib/rules.dart with a line like:");
print(" ..register(new ${toClassName(libName)}())");
print("Then run your test like so:");
print(" dart test/util/solo_test.dart $libName");
}
String _generateStub(String libName, String className) => """
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// 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.
library linter.src.rules.$libName;
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:linter/src/linter.dart';
const desc = r' ';
const details = r'''
**DO** ...
**BAD:**
```
```
**GOOD:**
```
```
''';
class $className extends LintRule {
$className() : super(
name: '$libName',
description: desc,
details: details,
group: Group.style);
@override
AstVisitor getVisitor() => new Visitor(this);
}
class Visitor extends SimpleAstVisitor {
final LintRule rule;
Visitor(this.rule);
}
""";
String _generateTest(String libName, String className) => '''
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// 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.
// test w/ `dart test/util/solo_test.dart $libName`
''';