Give some love to the linter

This commit is contained in:
dcodeIO
2018-03-13 14:03:57 +01:00
parent 23a7db4dc3
commit 081ac768ae
34 changed files with 526 additions and 401 deletions

View File

@ -0,0 +1,58 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const ts = require("typescript");
const Lint = require("tslint");
class Rule extends Lint.Rules.AbstractRule {
apply(sourceFile) {
return this.applyWithWalker(new DiagnosticsWalker(sourceFile, this.getOptions()));
}
}
Rule.MISSING_TYPE_OR_INITIALIZER = "Missing type or initializer.";
Rule.MISSING_RETURN_TYPE = "Missing return type.";
exports.Rule = Rule;
class DiagnosticsWalker extends Lint.RuleWalker {
visitVariableDeclaration(node) {
var list = node.parent;
if (list) {
let stmt = list.parent;
if (stmt && stmt.kind != ts.SyntaxKind.ForOfStatement) {
this.checkTypeOrInitializer(node);
}
}
super.visitVariableDeclaration(node);
}
visitPropertyDeclaration(node) {
this.checkTypeOrInitializer(node);
super.visitPropertyDeclaration(node);
}
visitParameterDeclaration(node) {
this.checkTypeOrInitializer(node);
super.visitParameterDeclaration(node);
}
checkTypeOrInitializer(node) {
if (!node.type && !node.initializer) {
this.addFailureAtNode(node, Rule.MISSING_TYPE_OR_INITIALIZER);
}
}
visitFunctionDeclaration(node) {
this.checkFunctionReturnType(node);
super.visitFunctionDeclaration(node);
}
visitArrowFunction(node) {
this.checkFunctionReturnType(node);
super.visitArrowFunction(node);
}
visitMethodDeclaration(node) {
this.checkFunctionReturnType(node);
super.visitMethodDeclaration(node);
}
visitGetAccessor(node) {
this.checkFunctionReturnType(node);
super.visitGetAccessor(node);
}
checkFunctionReturnType(node) {
if (!node.type) {
this.addFailureAtNode(node, Rule.MISSING_RETURN_TYPE);
}
}
}

View File

@ -0,0 +1,42 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const Lint = require("tslint");
const tsutils_1 = require("tsutils");
class Rule extends Lint.Rules.AbstractRule {
apply(sourceFile) {
return this.applyWithWalker(new VariablesWalker(sourceFile, this.getOptions()));
}
}
Rule.TOP_LEVEL_VAR = "Top-level variable should be 'var' (distinct local or global).";
Rule.BLOCK_LEVEL_LET = "Block-level variable should be 'let' (shared local).";
exports.Rule = Rule;
class VariablesWalker extends Lint.RuleWalker {
visitVariableDeclarationList(node) {
if (tsutils_1.isVariableStatement(node.parent)) {
if (tsutils_1.isBlock(node.parent.parent)) {
if (tsutils_1.isFunctionScopeBoundary(node.parent.parent.parent) ||
tsutils_1.isNamespaceDeclaration(node.parent.parent.parent)) {
if (tsutils_1.getVariableDeclarationKind(node) == 1 /* Let */) {
this.addFailureAtNode(node, Rule.TOP_LEVEL_VAR);
}
}
else if (tsutils_1.getVariableDeclarationKind(node) == 0 /* Var */) {
this.addFailureAtNode(node, Rule.BLOCK_LEVEL_LET);
}
}
else if (tsutils_1.isSourceFile(node.parent.parent) ||
tsutils_1.isModuleBlock(node.parent.parent)) {
if (tsutils_1.getVariableDeclarationKind(node) == 1 /* Let */) {
this.addFailureAtNode(node, Rule.TOP_LEVEL_VAR);
}
}
else if (tsutils_1.getVariableDeclarationKind(node) == 0 /* Var */) {
this.addFailureAtNode(node, Rule.BLOCK_LEVEL_LET);
}
}
else if (tsutils_1.getVariableDeclarationKind(node) == 0 /* Var */) {
this.addFailureAtNode(node, Rule.BLOCK_LEVEL_LET);
}
super.visitVariableDeclarationList(node);
}
}

View File

@ -0,0 +1,36 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const ts = require("typescript");
const Lint = require("tslint");
const tsutils_1 = require("tsutils");
class Rule extends Lint.Rules.AbstractRule {
apply(sourceFile) {
return this.applyWithWalker(new CaseWalker(sourceFile, this.getOptions()));
}
}
Rule.NOT_BRACED = "Multi-line case clauses should be braced.";
exports.Rule = Rule;
class CaseWalker extends Lint.RuleWalker {
visitDefaultClause(node) {
this.checkDefaultOrCaseClause(node);
super.visitDefaultClause(node);
}
visitCaseClause(node) {
this.checkDefaultOrCaseClause(node);
super.visitCaseClause(node);
}
checkDefaultOrCaseClause(node) {
var count = node.statements.length;
if (count > 1) {
this.addFailureAtNode(node, Rule.NOT_BRACED);
}
else if (count == 1) {
let stmt = node.statements[0];
if (stmt.kind != ts.SyntaxKind.Block) {
if (!tsutils_1.isSameLine(node.getSourceFile(), node.getStart(), stmt.getStart())) {
this.addFailureAtNode(node, Rule.NOT_BRACED);
}
}
}
}
}

View File

@ -0,0 +1,23 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const ts = require("typescript");
const Lint = require("tslint");
const tsutils_1 = require("tsutils");
class Rule extends Lint.Rules.AbstractRule {
apply(sourceFile) {
return this.applyWithWalker(new DiagnosticsWalker(sourceFile, this.getOptions()));
}
}
Rule.NOT_ON_SEPARATE_LINE = "Diagnostic message not on a separate line.";
exports.Rule = Rule;
class DiagnosticsWalker extends Lint.RuleWalker {
visitPropertyAccessExpression(node) {
if (node.expression.kind === ts.SyntaxKind.Identifier) {
if (node.expression.text == "DiagnosticCode" &&
tsutils_1.isSameLine(node.getSourceFile(), node.parent.getStart(), node.getStart())) {
this.addFailureAtNode(node, Rule.NOT_ON_SEPARATE_LINE);
}
}
super.visitPropertyAccessExpression(node);
}
}