Skip to content

Commit

Permalink
fix(require-jsdoc): skip past type annotations when seeking backwar…
Browse files Browse the repository at this point in the history
…d through decorators; fixes #659
  • Loading branch information
brettz9 committed Jan 3, 2021
1 parent aa71a76 commit 62abd11
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 18 deletions.
14 changes: 14 additions & 0 deletions README.md
Expand Up @@ -10998,6 +10998,20 @@ const foo = {
}
}
// Options: [{"contexts":[":not(Property) > ArrowFunctionExpression"],"require":{"ArrowFunctionExpression":false,"ClassDeclaration":true,"ClassExpression":true}}]

/** Defines the current user's settings. */
@Injectable({
providedIn: 'root',
})
@State<Partial<UserSettingsStateModel>>
({
name: 'userSettings',
defaults: {
isDev: !environment.production,
},
})
export class UserSettingsState { }
// Options: [{"require":{"ClassDeclaration":true}}]
````


Expand Down
43 changes: 25 additions & 18 deletions src/eslint/getJSDocComment.js
Expand Up @@ -14,32 +14,39 @@ const isCommentToken = (token) => {
return token.type === 'Line' || token.type === 'Block' || token.type === 'Shebang';
};

const decoratorMetaTokens = new Map([[')', '('], ['>', '<']]);

const getDecorator = (token, sourceCode) => {
if (!token) {
return false;
}
if (token.type === 'Punctuator' && token.value === ')') {
let nested = 0;
let tokenBefore = token;
do {
tokenBefore = sourceCode.getTokenBefore(tokenBefore, {includeComments: true});
// istanbul ignore if
if (tokenBefore && tokenBefore.type === 'Punctuator') {
if (tokenBefore.value === ')') {
nested++;
}
if (tokenBefore.value === '(') {
if (nested) {
nested--;
} else {
break;
if (token.type === 'Punctuator') {
const tokenClose = token.value;
const tokenOpen = decoratorMetaTokens.get(tokenClose);
if (tokenOpen) {
let nested = 0;
let tokenBefore = token;
do {
tokenBefore = sourceCode.getTokenBefore(tokenBefore, {includeComments: true});
// istanbul ignore if
if (tokenBefore && tokenBefore.type === 'Punctuator') {
if (tokenBefore.value === tokenClose) {
nested++;
}
if (tokenBefore.value === tokenOpen) {
if (nested) {
nested--;
} else {
break;
}
}
}
}
} while (tokenBefore);
} while (tokenBefore);

return tokenBefore;
return tokenBefore;
}
}

if (token.type === 'Identifier') {
const tokenBefore = sourceCode.getTokenBefore(token, {includeComments: true});
if (tokenBefore && tokenBefore.type === 'Punctuator' && tokenBefore.value === '@') {
Expand Down
22 changes: 22 additions & 0 deletions test/rules/assertions/requireJsdoc.js
Expand Up @@ -4231,5 +4231,27 @@ export default {
},
}],
},
{
code: `
/** Defines the current user's settings. */
@Injectable({
providedIn: 'root',
})
@State<Partial<UserSettingsStateModel>>
({
name: 'userSettings',
defaults: {
isDev: !environment.production,
},
})
export class UserSettingsState { }
`,
options: [{
require: {
ClassDeclaration: true,
},
}],
parser: require.resolve('@typescript-eslint/parser'),
},
],
};

0 comments on commit 62abd11

Please sign in to comment.