333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
"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 RULE_NAME = 'ter-padded-blocks';
var OPTION_ALWAYS = 'always';
var Rule = (function (_super) {
    tslib_1.__extends(Rule, _super);
    function Rule() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    Rule.prototype.formatOptions = function (ruleArguments) {
        var config = ruleArguments[0] || OPTION_ALWAYS;
        if (typeof (config) === 'string') {
            var always = config === OPTION_ALWAYS;
            return {
                blocks: always,
                classes: always,
                switches: always
            };
        }
        return {
            blocks: config['blocks'] && config['blocks'] === OPTION_ALWAYS,
            classes: config['classes'] && config['classes'] === OPTION_ALWAYS,
            switches: config['switches'] && config['switches'] === OPTION_ALWAYS
        };
    };
    Rule.prototype.apply = function (sourceFile) {
        var opt = this.formatOptions(this.ruleArguments);
        var walker = new RuleWalker(sourceFile, this.ruleName, opt);
        return this.applyWithWalker(walker);
    };
    Rule.metadata = {
        ruleName: RULE_NAME,
        hasFix: false,
        description: 'enforces consistent empty line padding within blocks',
        rationale: Lint.Utils.dedent(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["\n      Some style guides require block statements to start and end with blank\n      lines. The goal is to improve readability by visually separating the\n      block content and the surrounding code.\n      "], ["\n      Some style guides require block statements to start and end with blank\n      lines. The goal is to improve readability by visually separating the\n      block content and the surrounding code.\n      "]))),
        optionsDescription: 'This rule has one option, which can be a string option or an object option',
        options: {
            type: 'array',
            items: [
                {
                    enum: ['always', 'never']
                },
                {
                    type: 'object',
                    properties: {
                        blocks: {
                            enum: ['always', 'never']
                        },
                        classes: {
                            enum: ['always', 'never']
                        },
                        switches: {
                            enum: ['always', 'never']
                        }
                    },
                    additionalProperties: false
                }
            ],
            maxLength: 1
        },
        optionExamples: [
            Lint.Utils.dedent(templateObject_2 || (templateObject_2 = tslib_1.__makeTemplateObject(["\n        \"", "\": [true]\n        "], ["\n        \"", "\": [true]\n        "])), RULE_NAME),
            Lint.Utils.dedent(templateObject_3 || (templateObject_3 = tslib_1.__makeTemplateObject(["\n        \"", "\": [true, \"always\"]\n        "], ["\n        \"", "\": [true, \"always\"]\n        "])), RULE_NAME),
            Lint.Utils.dedent(templateObject_4 || (templateObject_4 = tslib_1.__makeTemplateObject(["\n        \"", "\": [true, \"never\"]\n        "], ["\n        \"", "\": [true, \"never\"]\n        "])), RULE_NAME),
            Lint.Utils.dedent(templateObject_5 || (templateObject_5 = tslib_1.__makeTemplateObject(["\n        \"", "\": [true, { \"blocks\": \"always\" }]\n        "], ["\n        \"", "\": [true, { \"blocks\": \"always\" }]\n        "])), RULE_NAME),
            Lint.Utils.dedent(templateObject_6 || (templateObject_6 = tslib_1.__makeTemplateObject(["\n        \"", "\": [true, { \"blocks\": \"never\" }]\n        "], ["\n        \"", "\": [true, { \"blocks\": \"never\" }]\n        "])), RULE_NAME)
        ],
        typescriptOnly: false,
        type: 'style'
    };
    Rule.FAILURE_STRING = {
        always: 'Block must be padded by blank lines.',
        never: 'Block must not be padded by blank lines.'
    };
    return Rule;
}(Lint.Rules.AbstractRule));
exports.Rule = Rule;
var RuleWalker = (function (_super) {
    tslib_1.__extends(RuleWalker, _super);
    function RuleWalker() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    RuleWalker.prototype.walk = function (sourceFile) {
        var _this = this;
        sourceFile.forEachChild(function (node) { return _this.processNode(node); });
    };
    RuleWalker.prototype.processNode = function (node) {
        var _this = this;
        switch (node.kind) {
            case ts.SyntaxKind.Block:
            case ts.SyntaxKind.ClassDeclaration:
            case ts.SyntaxKind.CaseBlock:
                this.checkPadding(node);
        }
        node.forEachChild(function (child) { return _this.processNode(child); });
    };
    RuleWalker.prototype.getParts = function (node) {
        var openBrace, body, closeBrace;
        node.getChildren().forEach(function (child) {
            if (child.kind === ts.SyntaxKind.OpenBraceToken) {
                openBrace = child;
            }
            else if (child.kind === ts.SyntaxKind.SyntaxList) {
                body = child;
            }
            else if (child.kind === ts.SyntaxKind.CloseBraceToken) {
                closeBrace = child;
            }
        });
        return {
            openBrace: openBrace,
            body: body,
            closeBrace: closeBrace
        };
    };
    RuleWalker.prototype.getPositions = function (node) {
        var _a = this.getParts(node), openBrace = _a.openBrace, body = _a.body, closeBrace = _a.closeBrace;
        var firstChild = body.getChildAt(0);
        var lastChild = body.getChildAt(body.getChildCount() - 1);
        var positions = {
            openPosition: openBrace.getStart(this.sourceFile),
            openLine: this.getLine(openBrace.getStart(this.sourceFile)),
            closePosition: closeBrace.getEnd(),
            closeLine: this.getLine(closeBrace.getEnd())
        };
        if (firstChild) {
            positions.firstChildPosition = firstChild.getStart(this.sourceFile);
            positions.firstChildLine = this.getLine(positions.firstChildPosition);
        }
        if (lastChild) {
            positions.lastChildPosition = lastChild.getEnd();
            positions.lastChildLine = this.getLine(positions.lastChildPosition);
        }
        return positions;
    };
    RuleWalker.prototype.checkPadding = function (node) {
        var _this = this;
        var paddingAllowed = this.options.blocks;
        if (node.kind === ts.SyntaxKind.ClassDeclaration) {
            paddingAllowed = this.options.classes;
        }
        else if (node.parent && node.parent.kind === ts.SyntaxKind.SwitchStatement) {
            paddingAllowed = this.options.switches;
        }
        if (paddingAllowed === undefined) {
            return;
        }
        var positions = this.getPositions(node);
        var openBraceReplacement = {
            from: positions.openPosition + 1,
            to: positions.firstChildPosition || positions.closePosition
        };
        var closeBraceReplacement = {
            from: positions.lastChildPosition || positions.openPosition,
            to: positions.closePosition - 1
        };
        var comments = [];
        tsutils_1.forEachComment(node, function (_fullText, comment) {
            if (comment.pos > positions.openPosition && comment.pos < positions.closePosition) {
                var commentLineEnd = _this.getLine(comment.end);
                if (commentLineEnd > positions.openLine) {
                    comments.push(comment);
                }
                else if (commentLineEnd === positions.openLine) {
                    openBraceReplacement.from = comment.end;
                }
            }
        });
        if (comments.length > 0) {
            var firstCommentLine = this.getLine(comments[0].pos);
            var lastCommentLine = this.getLine(comments[comments.length - 1].end);
            if (!positions.firstChildLine || firstCommentLine < positions.firstChildLine) {
                positions.firstChildLine = firstCommentLine;
                positions.firstChildPosition = comments[0].pos;
                openBraceReplacement.to = positions.firstChildPosition;
            }
            if (!positions.lastChildLine || lastCommentLine >= positions.lastChildLine) {
                positions.lastChildLine = lastCommentLine;
                positions.lastChildPosition = comments[comments.length - 1].end;
                closeBraceReplacement.from = positions.lastChildPosition;
            }
        }
        if (this.getLine(openBraceReplacement.from) !== this.getLine(openBraceReplacement.to)) {
            openBraceReplacement.to = this.getPosition(this.getLine(openBraceReplacement.to));
        }
        if (this.getLine(closeBraceReplacement.from) !== this.getLine(closeBraceReplacement.to)) {
            closeBraceReplacement.to = this.getPosition(this.getLine(closeBraceReplacement.to));
        }
        if (positions.firstChildLine === undefined && positions.lastChildLine === undefined) {
            return;
        }
        var openPadded = false;
        if (positions.firstChildLine !== undefined) {
            openPadded = positions.firstChildLine - positions.openLine > 1;
        }
        else {
            openPadded = positions.closeLine - positions.openLine > 1;
        }
        var closePadded = false;
        if (positions.lastChildLine !== undefined) {
            closePadded = positions.closeLine - positions.lastChildLine > 1;
        }
        else {
            closePadded = positions.closeLine - positions.openLine > 1;
        }
        if (paddingAllowed ? !openPadded : openPadded) {
            var openFix = Lint.Replacement.replaceFromTo(openBraceReplacement.from, openBraceReplacement.to, paddingAllowed ? '\n\n' : '\n');
            this.addFailure(positions.openPosition, positions.openPosition + 1, paddingAllowed ? Rule.FAILURE_STRING.always : Rule.FAILURE_STRING.never, openFix);
        }
        if (paddingAllowed ? !closePadded : closePadded) {
            var closeFix = Lint.Replacement.replaceFromTo(closeBraceReplacement.from, closeBraceReplacement.to, paddingAllowed ? '\n\n' : '\n');
            this.addFailure(positions.closePosition - 1, positions.closePosition, paddingAllowed ? Rule.FAILURE_STRING.always : Rule.FAILURE_STRING.never, closeFix);
        }
    };
    RuleWalker.prototype.getLine = function (pos) {
        return this.sourceFile.getLineAndCharacterOfPosition(pos).line;
    };
    RuleWalker.prototype.getPosition = function (line) {
        return this.sourceFile.getPositionOfLineAndCharacter(line, 0);
    };
    return RuleWalker;
}(Lint.AbstractWalker));
var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6;
 
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bGVzL3RlclBhZGRlZEJsb2Nrc1J1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQWlDO0FBQ2pDLDZCQUErQjtBQUUvQixtQ0FBeUM7QUFFekMsSUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUM7QUFDdEMsSUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDO0FBTy9CO0lBQTBCLGdDQUF1QjtJQUFqRDs7SUFxRkEsQ0FBQztJQXpCUyw0QkFBYSxHQUFyQixVQUFzQixhQUFvQjtRQUN4QyxJQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDO1FBRWpELElBQUksT0FBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUMvQixJQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssYUFBYSxDQUFDO1lBRXhDLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsUUFBUSxFQUFFLE1BQU07YUFDakIsQ0FBQztTQUNIO1FBRUQsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLGFBQWE7WUFDOUQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssYUFBYTtZQUNqRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxhQUFhO1NBQ3JFLENBQUM7SUFDSixDQUFDO0lBRU0sb0JBQUssR0FBWixVQUFhLFVBQXlCO1FBQ3BDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25ELElBQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFD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QUFDLFdBQVcsRUFBRTtZQUMvQyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FDN0MscUJBQXFCLENBQUMsSUFBSSxFQUMxQixxQkFBcUIsQ0FBQyxFQUFFLEVBQ3hCLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQy9CLENBQUM7WUFDRixJQUFJLENBQUMsVUFBVSxDQUNiLFNBQVMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUMzQixTQUFTLENBQUMsYUFBYSxFQUN2QixjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFDdkUsUUFBUSxDQUNULENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyw0QkFBTyxHQUFmLFVBQWdCLEdBQVc7UUFDekIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqRSxDQUFDO0lBRU8sZ0NBQVcsR0FBbkIsVUFBb0IsSUFBWTtRQUM5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDSCxpQkFBQztBQUFELENBOUtBLEFBOEtDLENBOUt3QixJQUFJLENBQUMsY0FBYyxHQThLM0MiLCJmaWxlIjoicnVsZXMvdGVyUGFkZGVkQmxvY2tzUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvam1sb3Blei90c2xpbnQtZXNsaW50LXJ1bGVzL3NyYyJ9