@@ -29,58 +29,68 @@ module.exports = {
29
29
},
30
30
31
31
create (context) {
32
- const options = context.options[0]
33
- const optSpaces = options !== 'never'
34
- const template = context.parserServices.getTemplateBodyTokenStore && context.parserServices.getTemplateBodyTokenStore()
35
-
36
- // ----------------------------------------------------------------------
37
- // Helpers
38
- // ----------------------------------------------------------------------
39
-
40
- function checkTokens (leftToken, rightToken) {
41
- if (leftToken.loc.end.line === rightToken.loc.start.line) {
42
- const spaces = rightToken.loc.start.column - leftToken.loc.end.column
43
- const noSpacesFound = spaces === 0
44
-
45
- if (optSpaces === noSpacesFound) {
46
- context.report({
47
- node: rightToken,
48
- loc: {
49
- start: leftToken.loc.end,
50
- end: rightToken.loc.start
51
- },
52
- message: 'Found {{spaces}} whitespaces, {{type}} expected.',
53
- data: {
54
- spaces: spaces === 0 ? 'none' : spaces,
55
- type: optSpaces ? '1' : 'none'
56
- },
57
- fix: (fixer) => fixer.replaceTextRange([leftToken.range[1], rightToken.range[0]], optSpaces ? ' ' : '')
58
- })
59
- }
60
- }
61
- }
32
+ const options = context.options[0] || 'always'
33
+ const template =
34
+ context.parserServices.getTemplateBodyTokenStore &&
35
+ context.parserServices.getTemplateBodyTokenStore()
62
36
63
37
// ----------------------------------------------------------------------
64
38
// Public
65
39
// ----------------------------------------------------------------------
66
40
67
41
return utils.defineTemplateBodyVisitor(context, {
68
42
'VExpressionContainer[expression!=null]' (node) {
69
- const tokens = template.getTokens(node, {
70
- includeComments: true,
71
- filter: token => token.type !== 'HTMLWhitespace' // When there is only whitespace between ignore it
72
- })
43
+ const openBrace = template.getFirstToken(node)
44
+ const closeBrace = template.getLastToken(node)
45
+
46
+ if (
47
+ !openBrace ||
48
+ !closeBrace ||
49
+ openBrace.type !== 'VExpressionStart' ||
50
+ closeBrace.type !== 'VExpressionEnd'
51
+ ) {
52
+ return
53
+ }
73
54
74
- const startToken = tokens.shift()
75
- if (!startToken || startToken.type !== 'VExpressionStart') return
76
- const endToken = tokens.pop()
77
- if (!endToken || endToken.type !== 'VExpressionEnd') return
55
+ const firstToken = template.getTokenAfter(openBrace, { includeComments: true })
56
+ const lastToken = template.getTokenBefore(closeBrace, { includeComments: true })
78
57
79
- if (tokens.length > 0) {
80
- checkTokens(startToken, tokens[0])
81
- checkTokens(tokens[tokens.length - 1], endToken)
58
+ if (options === 'always') {
59
+ if (openBrace.range[1] === firstToken.range[0]) {
60
+ context.report({
61
+ node: openBrace,
62
+ message: "Expected 1 space after '{{', but not found.",
63
+ fix: (fixer) => fixer.insertTextAfter(openBrace, ' ')
64
+ })
65
+ }
66
+ if (closeBrace.range[0] === lastToken.range[1]) {
67
+ context.report({
68
+ node: closeBrace,
69
+ message: "Expected 1 space before '}}', but not found.",
70
+ fix: (fixer) => fixer.insertTextBefore(closeBrace, ' ')
71
+ })
72
+ }
82
73
} else {
83
- checkTokens(startToken, endToken)
74
+ if (openBrace.range[1] !== firstToken.range[0]) {
75
+ context.report({
76
+ loc: {
77
+ start: openBrace.loc.start,
78
+ end: firstToken.loc.start
79
+ },
80
+ message: "Expected no space after '{{', but found.",
81
+ fix: (fixer) => fixer.removeRange([openBrace.range[1], firstToken.range[0]])
82
+ })
83
+ }
84
+ if (closeBrace.range[0] !== lastToken.range[1]) {
85
+ context.report({
86
+ loc: {
87
+ start: lastToken.loc.end,
88
+ end: closeBrace.loc.end
89
+ },
90
+ message: "Expected no space before '}}', but found.",
91
+ fix: (fixer) => fixer.removeRange([lastToken.range[1], closeBrace.range[0]])
92
+ })
93
+ }
84
94
}
85
95
}
86
96
})
0 commit comments