|
6 | 6 |
|
7 | 7 | const is = require("simple-is");
|
8 | 8 | const t = require('babel-types');
|
| 9 | +const codeFrame = require("babel-code-frame"); |
9 | 10 |
|
10 | 11 | module.exports = {
|
11 | 12 | inspectComment: inspectComment,
|
@@ -99,9 +100,9 @@ function inspectFunction(path, ctx) {
|
99 | 100 | // added/rebuilt/removed => g(["a", function(a) {
|
100 | 101 | // "ngInject"
|
101 | 102 | // }]);
|
102 |
| - const maybeArrayExpression = path.parent; |
| 103 | + const maybeArrayExpression = path.parentPath; |
103 | 104 | if (isAnnotatedArray(maybeArrayExpression)) {
|
104 |
| - addSuspect(path.parentPath, ctx, !annotate); |
| 105 | + addSuspect(maybeArrayExpression, ctx, !annotate); |
105 | 106 | } else {
|
106 | 107 | addSuspect(path, ctx, !annotate);
|
107 | 108 | }
|
@@ -365,24 +366,36 @@ function nestedObjectValues(path, res) {
|
365 | 366 | return res;
|
366 | 367 | }
|
367 | 368 |
|
368 |
| -function isAnnotatedArray(node) { |
369 |
| - if (!t.isArrayExpression(node)) { |
| 369 | +function isAnnotatedArray(path) { |
| 370 | + if (!t.isArrayExpression(path)) { |
370 | 371 | return false;
|
371 | 372 | }
|
372 |
| - const elements = node.elements; |
| 373 | + const elements = path.get('elements'); |
373 | 374 |
|
374 | 375 | // last should be a function expression
|
375 | 376 | let fn = elements.slice(-1)[0];
|
376 | 377 | if (elements.length === 0 || !isFunctionExpressionOrArrow(fn)) {
|
377 | 378 | return false;
|
378 | 379 | }
|
379 | 380 |
|
| 381 | + var fnParams = fn.node.params.map(param => param.name); |
| 382 | + if(fnParams.length > elements.length - 1){ |
| 383 | + throw path.buildCodeFrameError("[angularjs-annotate] ERROR: Function parameters do not match existing annotations."); |
| 384 | + } |
| 385 | + |
| 386 | + var warnedOnce = false; |
380 | 387 | // all but last should be string literals
|
381 | 388 | for (let i = 0; i < elements.length - 1; i++) {
|
382 | 389 | const n = elements[i];
|
383 |
| - if (!t.isLiteral(n) || !is.string(n.value)) { |
| 390 | + if (!t.isLiteral(n) || !is.string(n.node.value)) { |
384 | 391 | return false;
|
385 | 392 | }
|
| 393 | + |
| 394 | + if (!warnedOnce && fnParams[i] && n.node.value !== fnParams[i]) { |
| 395 | + warnedOnce = true; |
| 396 | + var frame = codeFrame(n.hub.file.code, n.node.loc.start.line, n.node.loc.start.column + 2); |
| 397 | + console.warn("[angularjs-annotate] WARN: Function parameters do not match existing annotations.\n" + frame); |
| 398 | + } |
386 | 399 | }
|
387 | 400 |
|
388 | 401 | return true;
|
|
0 commit comments