UNPKG

tslint-consistent-codestyle

Version:

Additional rules to enforce constistent code style with tslint

308 lines 30.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var ts = require("typescript"); var Lint = require("tslint"); var tsutils_1 = require("tsutils"); var CHECK_RETURN_TYPE_OPTION = 'check-return-type'; var FAIL_MESSAGE = "type annotation is redundant"; var Rule = (function (_super) { tslib_1.__extends(Rule, _super); function Rule() { return _super !== null && _super.apply(this, arguments) || this; } Rule.prototype.applyWithProgram = function (sourceFile, program) { return this.applyWithFunction(sourceFile, walk, { checkReturnType: this.ruleArguments.indexOf(CHECK_RETURN_TYPE_OPTION) !== -1, }, program.getTypeChecker()); }; return Rule; }(Lint.Rules.TypedRule)); exports.Rule = Rule; var formatFlags = ts.TypeFormatFlags.UseStructuralFallback | ts.TypeFormatFlags.UseFullyQualifiedType | ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope | ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.WriteClassExpressionAsTypeLiteral | ts.TypeFormatFlags.WriteArrowStyleSignature; function walk(ctx, checker) { return ts.forEachChild(ctx.sourceFile, function cb(node) { switch (node.kind) { case ts.SyntaxKind.ArrowFunction: case ts.SyntaxKind.FunctionExpression: checkFunction(node); break; case ts.SyntaxKind.MethodDeclaration: if (node.parent.kind === ts.SyntaxKind.ObjectLiteralExpression) checkObjectLiteralMethod(node); break; case ts.SyntaxKind.VariableDeclarationList: checkVariables(node); } return ts.forEachChild(node, cb); }); function checkFunction(node) { if (!functionHasTypeDeclarations(node)) return; var iife = tsutils_1.getIIFE(node); if (iife !== undefined) return checkIife(node, iife); var type = getContextualTypeOfFunction(node); if (type === undefined) return; checkContextSensitiveFunctionOrMethod(node, type); } function checkObjectLiteralMethod(node) { if (!functionHasTypeDeclarations(node)) return; var type = getContextualTypeOfObjectLiteralMethod(node); if (type === undefined) return; checkContextSensitiveFunctionOrMethod(node, type); } function checkContextSensitiveFunctionOrMethod(node, contextualType) { var parameters = parametersExceptThis(node.parameters); var sig = getMatchingSignature(contextualType, parameters); if (sig === undefined) return; var signature = sig[0], checkReturn = sig[1]; if (ctx.options.checkReturnType && checkReturn && node.type !== undefined && !signatureHasGenericOrTypePredicateReturn(signature) && typesAreEqual(checker.getTypeFromTypeNode(node.type), signature.getReturnType())) fail(node.type); var restParameterContext = false; var contextualParameterType; for (var i = 0; i < parameters.length; ++i) { if (!restParameterContext) { var context = signature.parameters[i]; if (context === undefined || context.valueDeclaration === undefined) break; if (tsutils_1.isTypeParameter(checker.getTypeAtLocation(context.valueDeclaration))) continue; contextualParameterType = checker.getTypeOfSymbolAtLocation(context, node); if (context.valueDeclaration.dotDotDotToken !== undefined) { var indexType = contextualParameterType.getNumberIndexType(); if (indexType === undefined) break; contextualParameterType = indexType; restParameterContext = true; } } var parameter = parameters[i]; if (parameter.type === undefined) continue; var declaredType = void 0; if (parameter.dotDotDotToken !== undefined) { if (!restParameterContext) break; declaredType = checker.getTypeFromTypeNode(parameter.type); var indexType = declaredType.getNumberIndexType(); if (indexType === undefined) break; declaredType = indexType; } else { declaredType = checker.getTypeFromTypeNode(parameter.type); } if (compareParameterTypes(contextualParameterType, declaredType, parameter.questionToken !== undefined || parameter.initializer !== undefined)) fail(parameter.type); } } function checkIife(func, iife) { if (ctx.options.checkReturnType && func.type !== undefined && func.name === undefined && (!tsutils_1.isExpressionValueUsed(iife) || !containsTypeWithFlag(checker.getTypeFromTypeNode(func.type), ts.TypeFlags.Literal) && checker.getContextualType(iife) !== undefined)) fail(func.type); var parameters = parametersExceptThis(func.parameters); var args = iife.arguments; var len = Math.min(parameters.length, args.length); outer: for (var i = 0; i < len; ++i) { var parameter = parameters[i]; if (parameter.type === undefined) continue; var declaredType = checker.getTypeFromTypeNode(parameter.type); var contextualType = checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(args[i])); if (parameter.dotDotDotToken !== undefined) { var indexType = declaredType.getNumberIndexType(); if (indexType === undefined || !typesAreEqual(indexType, contextualType)) break; for (var j = i + 1; j < args.length; ++j) if (!typesAreEqual(contextualType, checker.getBaseTypeOfLiteralType(checker.getTypeAtLocation(args[j])))) break outer; fail(parameter.type); } else if (compareParameterTypes(contextualType, declaredType, parameter.questionToken !== undefined || parameter.initializer !== undefined)) { fail(parameter.type); } } } function checkVariables(list) { var isConst = tsutils_1.getVariableDeclarationKind(list) === 2; for (var _i = 0, _a = list.declarations; _i < _a.length; _i++) { var variable = _a[_i]; if (variable.type === undefined || variable.initializer === undefined) continue; var inferred = checker.getTypeAtLocation(variable.initializer); if (!isConst) inferred = checker.getBaseTypeOfLiteralType(inferred); var declared = checker.getTypeFromTypeNode(variable.type); if (typesAreEqual(declared, inferred) || isConst && typesAreEqual(declared, checker.getBaseTypeOfLiteralType(inferred))) fail(variable.type); } } function fail(type) { ctx.addFailure(type.pos - 1, type.end, FAIL_MESSAGE, Lint.Replacement.deleteFromTo(type.pos - 1, type.end)); } function typesAreEqual(a, b) { return a === b || checker.typeToString(a, undefined, formatFlags) === checker.typeToString(b, undefined, formatFlags); } function getContextualTypeOfFunction(func) { var type = checker.getContextualType(func); return type && checker.getApparentType(type); } function getContextualTypeOfObjectLiteralMethod(method) { var type = checker.getContextualType(method.parent); if (type === undefined) return; type = checker.getApparentType(type); if (!tsutils_1.isTypeFlagSet(type, ts.TypeFlags.StructuredType)) return; var t = checker.getTypeAtLocation(method); var symbol = t.symbol && type.getProperties().find(function (s) { return s.escapedName === t.symbol.escapedName; }); return symbol !== undefined ? checker.getTypeOfSymbolAtLocation(symbol, method.name) : isNumericPropertyName(method.name) && type.getNumberIndexType() || type.getStringIndexType(); } function signatureHasGenericOrTypePredicateReturn(signature) { if (signature.declaration === undefined) return false; if (signature.declaration.type !== undefined && tsutils_1.isTypePredicateNode(signature.declaration.type)) return true; var original = checker.getSignatureFromDeclaration(signature.declaration); return original !== undefined && tsutils_1.isTypeParameter(original.getReturnType()); } function removeOptionalityFromType(type) { if (!containsTypeWithFlag(type, ts.TypeFlags.Undefined)) return type; var allowsNull = containsTypeWithFlag(type, ts.TypeFlags.Null); type = checker.getNonNullableType(type); return allowsNull ? checker.getNullableType(type, ts.TypeFlags.Null) : type; } function compareParameterTypes(context, declared, optional) { if (optional) declared = removeOptionalityFromType(declared); return typesAreEqual(declared, context) || optional && typesAreEqual(checker.getNullableType(declared, ts.TypeFlags.Undefined), context); } function isNumericPropertyName(name) { var str = tsutils_1.getPropertyName(name); if (str !== undefined) return tsutils_1.isValidNumericLiteral(str) && String(+str) === str; return isAssignableToNumber(checker.getTypeAtLocation(name.expression)); } function isAssignableToNumber(type) { var typeParametersSeen; return (function check(t) { if (tsutils_1.isTypeParameter(t) && t.symbol !== undefined && t.symbol.declarations !== undefined) { if (typeParametersSeen === undefined) { typeParametersSeen = new Set([t]); } else if (!typeParametersSeen.has(t)) { typeParametersSeen.add(t); } else { return false; } var declaration = t.symbol.declarations[0]; if (declaration.constraint === undefined) return true; return check(checker.getTypeFromTypeNode(declaration.constraint)); } if (tsutils_1.isUnionType(t)) return t.types.every(check); if (tsutils_1.isIntersectionType(t)) return t.types.some(check); return tsutils_1.isTypeFlagSet(t, ts.TypeFlags.NumberLike | ts.TypeFlags.Any); })(type); } function getMatchingSignature(type, parameters) { var minArguments = getMinArguments(parameters); var signatures = getSignaturesOfType(type).filter(function (s) { return s.declaration !== undefined && getNumParameters(s.declaration.parameters) >= minArguments; }); switch (signatures.length) { case 0: return; case 1: return [signatures[0], true]; default: { var str = checker.signatureToString(signatures[0], undefined, formatFlags); var withoutReturn = removeSignatureReturn(str); var returnUsable = true; for (var i = 1; i < signatures.length; ++i) { var sig = checker.signatureToString(signatures[i], undefined, formatFlags); if (str !== sig) { if (withoutReturn !== removeSignatureReturn(sig)) return; returnUsable = false; } } return [signatures[0], returnUsable]; } } } } function removeSignatureReturn(str) { var sourceFile = ts.createSourceFile('tmp.ts', "type T=" + str, ts.ScriptTarget.ESNext); var signature = sourceFile.statements[0].type; return sourceFile.text.substring(7, signature.parameters.end + 1); } function getSignaturesOfType(type) { if (tsutils_1.isUnionType(type)) { var signatures = []; for (var _i = 0, _a = type.types; _i < _a.length; _i++) { var t = _a[_i]; signatures.push.apply(signatures, getSignaturesOfType(t)); } return signatures; } if (tsutils_1.isIntersectionType(type)) { var signatures = void 0; for (var _b = 0, _c = type.types; _b < _c.length; _b++) { var t = _c[_b]; var sig = getSignaturesOfType(t); if (sig.length !== 0) { if (signatures !== undefined) return []; signatures = sig; } } return signatures === undefined ? [] : signatures; } return type.getCallSignatures(); } function getNumParameters(parameters) { if (parameters.length === 0) return 0; if (parameters[parameters.length - 1].dotDotDotToken !== undefined) return Infinity; return parametersExceptThis(parameters).length; } function getMinArguments(parameters) { var minArguments = parameters.length; for (; minArguments > 0; --minArguments) { var parameter = parameters[minArguments - 1]; if (parameter.questionToken === undefined && parameter.initializer === undefined && parameter.dotDotDotToken === undefined) break; } return minArguments; } function containsTypeWithFlag(type, flag) { return tsutils_1.isUnionType(type) ? type.types.some(function (t) { return tsutils_1.isTypeFlagSet(t, flag); }) : tsutils_1.isTypeFlagSet(type, flag); } function parametersExceptThis(parameters) { return parameters.length !== 0 && tsutils_1.isThisParameter(parameters[0]) ? parameters.slice(1) : parameters; } function functionHasTypeDeclarations(func) { return func.type !== undefined || parametersExceptThis(func.parameters).some(function (p) { return p.type !== undefined; }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9Vbm5lY2Vzc2FyeVR5cGVBbm5vdGF0aW9uUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5vVW5uZWNlc3NhcnlUeXBlQW5ub3RhdGlvblJ1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQWlDO0FBQ2pDLDZCQUErQjtBQUMvQixtQ0FhaUI7QUFJakIsSUFBTSx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQztBQUNyRCxJQUFNLFlBQVksR0FBRyw4QkFBOEIsQ0FBQztBQU1wRDtJQUEwQixnQ0FBb0I7SUFBOUM7O0lBVUEsQ0FBQztJQVRVLCtCQUFnQixHQUF2QixVQUF3QixVQUF5QixFQUFFLE9BQW1CO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUN6QixVQUFVLEVBQ1YsSUFBSSxFQUFFO1lBQ0YsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9FLEVBQ0QsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUMzQixDQUFDO0lBQ04sQ0FBQztJQUNMLFdBQUM7QUFBRCxDQUFDLEFBVkQsQ0FBMEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBVTdDO0FBVlksb0JBQUk7QUFZakIsSUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUI7TUFDdEQsRUFBRSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUI7TUFDeEMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxrQ0FBa0M7TUFDckQsRUFBRSxDQUFDLGVBQWUsQ0FBQyxZQUFZO01BQy9CLEVBQUUsQ0FBQyxlQUFlLENBQUMsaUNBQWlDO01BQ3BELEVBQUUsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUM7QUFFbEQsU0FBUyxJQUFJLENBQUMsR0FBK0IsRUFBRSxPQUF1QjtJQUNsRSxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FB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