-
Notifications
You must be signed in to change notification settings - Fork 3.9k
/
Copy pathno-duplicate-name-typedef.js
71 lines (62 loc) · 2.13 KB
/
no-duplicate-name-typedef.js
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
/**
* Copyright 2019 The AMP HTML Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS-IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
// Global cache of typedefName: typedefLocation.
const typedefs = new Map();
module.exports = function (context) {
return {
Program() {
// When relinting a file, remove all typedefs that it declared.
const filename = context.getFilename();
const keys = [];
for (const [key, file] of typedefs) {
if (file === filename) {
keys.push(key);
}
}
for (const key of keys) {
typedefs.delete(key);
}
},
VariableDeclaration(node) {
if (!node.leadingComments) {
return;
}
const typedefComment = node.leadingComments.find((comment) => {
return comment.type === 'Block' && /@typedef/.test(comment.value);
});
if (!typedefComment) {
return;
}
// We can assume theres only 1 variable declaration when a typedef
// annotation is found. This is because Closure Compiler does not allow
// declaration of multiple variables with a shared type information.
const typedefName = node.declarations[0].id.name;
const typedefLocation = typedefs.get(typedefName);
if (!typedefLocation) {
typedefs.set(typedefName, context.getFilename());
return;
}
context.report({
node,
message:
`Duplicate typedef name found: ${typedefName}. Another ` +
`typedef with the same name is found in ${typedefLocation}. ` +
'Suggestion: Add an infix version indicator like MyType_0_1_Def.',
});
},
};
};