123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- // Usage: node detectnestedternary.js /path/to/some/directory
- // For more details, please read http://esprima.org/doc/#nestedternary
-
- /*jslint node:true sloppy:true plusplus:true */
-
- var fs = require('fs'),
- esprima = require('../esprima'),
- dirname = process.argv[2];
-
-
- // Executes visitor on the object and its children (recursively).
- function traverse(object, visitor) {
- var key, child;
-
- visitor.call(null, object);
- for (key in object) {
- if (object.hasOwnProperty(key)) {
- child = object[key];
- if (typeof child === 'object' && child !== null) {
- traverse(child, visitor);
- }
- }
- }
- }
-
- // http://stackoverflow.com/q/5827612/
- function walk(dir, done) {
- var results = [];
- fs.readdir(dir, function (err, list) {
- if (err) {
- return done(err);
- }
- var i = 0;
- (function next() {
- var file = list[i++];
- if (!file) {
- return done(null, results);
- }
- file = dir + '/' + file;
- fs.stat(file, function (err, stat) {
- if (stat && stat.isDirectory()) {
- walk(file, function (err, res) {
- results = results.concat(res);
- next();
- });
- } else {
- results.push(file);
- next();
- }
- });
- }());
- });
- }
-
- walk(dirname, function (err, results) {
- if (err) {
- console.log('Error', err);
- return;
- }
-
- results.forEach(function (filename) {
- var shortname, first, content, syntax;
-
- shortname = filename;
- first = true;
-
- if (shortname.substr(0, dirname.length) === dirname) {
- shortname = shortname.substr(dirname.length + 1, shortname.length);
- }
-
- function report(node, problem) {
- if (first === true) {
- console.log(shortname + ': ');
- first = false;
- }
- console.log(' Line', node.loc.start.line, ':', problem);
- }
-
- function checkConditional(node) {
- var condition;
-
- if (node.consequent.type === 'ConditionalExpression' ||
- node.alternate.type === 'ConditionalExpression') {
-
- condition = content.substring(node.test.range[0], node.test.range[1]);
- if (condition.length > 20) {
- condition = condition.substring(0, 20) + '...';
- }
- condition = '"' + condition + '"';
- report(node, 'Nested ternary for ' + condition);
- }
- }
-
- try {
- content = fs.readFileSync(filename, 'utf-8');
- syntax = esprima.parse(content, { tolerant: true, loc: true, range: true });
- traverse(syntax, function (node) {
- if (node.type === 'ConditionalExpression') {
- checkConditional(node);
- }
- });
- } catch (e) {
- }
-
- });
- });
|