Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(typescript-estree): tighten prop name and destructure types #1346

Merged
merged 1 commit into from Dec 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -55,13 +55,13 @@ export default util.createRule({
case AST_NODE_TYPES.FunctionDeclaration:
return member.id && member.id.name;
case AST_NODE_TYPES.TSMethodSignature:
return util.getNameFromPropertyName(member.key);
return util.getNameFromMember(member, sourceCode);
case AST_NODE_TYPES.TSCallSignatureDeclaration:
return 'call';
case AST_NODE_TYPES.TSConstructSignatureDeclaration:
return 'new';
case AST_NODE_TYPES.MethodDefinition:
return util.getNameFromClassMember(member, sourceCode);
return util.getNameFromMember(member, sourceCode);
}

return null;
Expand Down
Expand Up @@ -125,10 +125,7 @@ export default util.createRule<Options, MessageIds>({
break;
}

const methodName = util.getNameFromClassMember(
methodDefinition,
sourceCode,
);
const methodName = util.getNameFromMember(methodDefinition, sourceCode);

if (check === 'off' || ignoredMethodNames.has(methodName)) {
return;
Expand Down Expand Up @@ -163,7 +160,7 @@ export default util.createRule<Options, MessageIds>({
): void {
const nodeType = 'class property';

const propertyName = util.getNameFromPropertyName(classProperty.key);
const propertyName = util.getNameFromMember(classProperty, sourceCode);
if (
propCheck === 'no-public' &&
classProperty.accessibility === 'public'
Expand Down
2 changes: 1 addition & 1 deletion packages/eslint-plugin/src/rules/member-naming.ts
Expand Up @@ -99,7 +99,7 @@ export default util.createRule<Options, MessageIds>({

validate(
node.key,
util.getNameFromClassMember(node, sourceCode),
util.getNameFromMember(node, sourceCode),
node.accessibility,
);
}
Expand Down
4 changes: 2 additions & 2 deletions packages/eslint-plugin/src/rules/member-ordering.ts
Expand Up @@ -231,12 +231,12 @@ export default util.createRule<Options, MessageIds>({
case AST_NODE_TYPES.TSMethodSignature:
case AST_NODE_TYPES.TSAbstractClassProperty:
case AST_NODE_TYPES.ClassProperty:
return util.getNameFromPropertyName(node.key);
return util.getNameFromMember(node, sourceCode);
case AST_NODE_TYPES.TSAbstractMethodDefinition:
case AST_NODE_TYPES.MethodDefinition:
return node.kind === 'constructor'
? 'constructor'
: util.getNameFromClassMember(node, sourceCode);
: util.getNameFromMember(node, sourceCode);
case AST_NODE_TYPES.TSConstructSignatureDeclaration:
return 'new';
case AST_NODE_TYPES.TSIndexSignature:
Expand Down
63 changes: 30 additions & 33 deletions packages/eslint-plugin/src/util/misc.ts
Expand Up @@ -48,29 +48,6 @@ type InferMessageIdsTypeFromRule<T> = T extends TSESLint.RuleModule<
? TMessageIds
: unknown;

/**
* Gets a string representation of the name of the index signature.
*/
export function getNameFromIndexSignature(
node: TSESTree.TSIndexSignature,
): string {
const propName: TSESTree.PropertyName | undefined = node.parameters.find(
(parameter: TSESTree.Parameter): parameter is TSESTree.Identifier =>
parameter.type === AST_NODE_TYPES.Identifier,
);
return propName ? getNameFromPropertyName(propName) : '(index signature)';
}

/**
* Gets a string name representation of the given PropertyName node
*/
function getNameFromPropertyName(propertyName: TSESTree.PropertyName): string {
if (propertyName.type === AST_NODE_TYPES.Identifier) {
return propertyName.name;
}
return `${propertyName.value}`;
}

/** Return true if both parameters are equal. */
type Equal<T> = (a: T, b: T) => boolean;

Expand Down Expand Up @@ -102,31 +79,51 @@ function findFirstResult<T, U>(
return undefined;
}

/**
* Gets a string representation of the name of the index signature.
*/
export function getNameFromIndexSignature(
node: TSESTree.TSIndexSignature,
): string {
const propName: TSESTree.PropertyName | undefined = node.parameters.find(
(parameter: TSESTree.Parameter): parameter is TSESTree.Identifier =>
parameter.type === AST_NODE_TYPES.Identifier,
);
return propName ? propName.name : '(index signature)';
}

/**
* Gets a string name representation of the name of the given MethodDefinition
* or ClassProperty node, with handling for computed property names.
*/
function getNameFromClassMember(
methodDefinition:
function getNameFromMember(
member:
| TSESTree.MethodDefinition
| TSESTree.TSMethodSignature
| TSESTree.TSAbstractMethodDefinition
| TSESTree.ClassProperty
| TSESTree.TSAbstractMethodDefinition,
| TSESTree.TSAbstractClassProperty
| TSESTree.Property
| TSESTree.TSPropertySignature,
sourceCode: TSESLint.SourceCode,
): string {
if (keyCanBeReadAsPropertyName(methodDefinition.key)) {
return getNameFromPropertyName(methodDefinition.key);
if (isLiteralOrIdentifier(member.key)) {
if (member.key.type === AST_NODE_TYPES.Identifier) {
return member.key.name;
}
return `${member.key.value}`;
}

return sourceCode.text.slice(...methodDefinition.key.range);
return sourceCode.text.slice(...member.key.range);
}

/**
* This covers both actual property names, as well as computed properties that are either
* an identifier or a literal at the top level.
*/
function keyCanBeReadAsPropertyName(
function isLiteralOrIdentifier(
node: TSESTree.Expression,
): node is TSESTree.PropertyName {
): node is TSESTree.Literal | TSESTree.Identifier {
return (
node.type === AST_NODE_TYPES.Literal ||
node.type === AST_NODE_TYPES.Identifier
Expand All @@ -147,11 +144,11 @@ export {
Equal,
ExcludeKeys,
findFirstResult,
getNameFromClassMember,
getNameFromPropertyName,
getNameFromMember,
InferMessageIdsTypeFromRule,
InferOptionsTypeFromRule,
isDefinitionFile,
isLiteralOrIdentifier,
RequireKeys,
upperCaseFirst,
};
18 changes: 12 additions & 6 deletions packages/typescript-estree/src/ts-estree/ts-estree.ts
Expand Up @@ -345,7 +345,6 @@ export type Modifier =
export type ObjectLiteralElementLike =
| MethodDefinition
| Property
| RestElement
| SpreadElement
| TSAbstractMethodDefinition;
export type Parameter =
Expand All @@ -355,6 +354,13 @@ export type Parameter =
| ObjectPattern
| Identifier
| TSParameterProperty;
export type DestructuringPattern =
| Identifier
| ObjectPattern
| ArrayPattern
| RestElement
| AssignmentPattern
| MemberExpression;
export type PrimaryExpression =
| ArrayExpression
| ArrayPattern
Expand All @@ -374,7 +380,7 @@ export type PrimaryExpression =
| TemplateLiteral
| ThisExpression
| TSNullKeyword;
export type PropertyName = Identifier | Literal;
export type PropertyName = Expression;
export type Statement =
| BlockStatement
| BreakStatement
Expand Down Expand Up @@ -509,7 +515,7 @@ interface LiteralBase extends BaseNode {
}

interface MethodDefinitionBase extends BaseNode {
key: Expression;
key: PropertyName;
value: FunctionExpression | TSEmptyBodyFunctionExpression;
computed: boolean;
static: boolean;
Expand Down Expand Up @@ -542,7 +548,7 @@ export interface ArrayExpression extends BaseNode {

export interface ArrayPattern extends BaseNode {
type: AST_NODE_TYPES.ArrayPattern;
elements: Expression[];
elements: DestructuringPattern[];
typeAnnotation?: TSTypeAnnotation;
optional?: boolean;
decorators?: Decorator[];
Expand Down Expand Up @@ -897,7 +903,7 @@ export interface ObjectExpression extends BaseNode {

export interface ObjectPattern extends BaseNode {
type: AST_NODE_TYPES.ObjectPattern;
properties: ObjectLiteralElementLike[];
properties: (Property | RestElement)[];
typeAnnotation?: TSTypeAnnotation;
optional?: boolean;
decorators?: Decorator[];
Expand All @@ -923,7 +929,7 @@ export interface Property extends BaseNode {

export interface RestElement extends BaseNode {
type: AST_NODE_TYPES.RestElement;
argument: BindingName | Expression | PropertyName;
argument: DestructuringPattern;
typeAnnotation?: TSTypeAnnotation;
optional?: boolean;
value?: AssignmentPattern;
Expand Down