Skip to content

Commit cc6bc76

Browse files
author
Andy
authored
Simplify getConvertibleFieldAtPosition (microsoft#23315)
1 parent 3c92344 commit cc6bc76

File tree

5 files changed

+27
-52
lines changed

5 files changed

+27
-52
lines changed

src/compiler/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,7 @@ namespace ts {
879879

880880
export interface PropertyDeclaration extends ClassElement, JSDocContainer {
881881
kind: SyntaxKind.PropertyDeclaration;
882+
parent: ClassLikeDeclaration;
882883
name: PropertyName;
883884
questionToken?: QuestionToken; // Present for use with reporting a grammar error
884885
exclamationToken?: ExclamationToken;

src/compiler/utilities.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -3037,6 +3037,10 @@ namespace ts {
30373037
return (node as HasType).type || (isInJavaScriptFile(node) ? getJSDocType(node) : undefined);
30383038
}
30393039

3040+
export function getTypeAnnotationNode(node: Node): TypeNode | undefined {
3041+
return (node as HasType).type;
3042+
}
3043+
30403044
/**
30413045
* Gets the effective return type annotation of a signature. If the node was parsed in a
30423046
* JavaScript file, gets the return type annotation from JSDoc.
@@ -4271,8 +4275,9 @@ namespace ts {
42714275
}
42724276
}
42734277

4274-
export function isParameterPropertyDeclaration(node: Node): node is ParameterDeclaration {
4275-
return hasModifier(node, ModifierFlags.ParameterPropertyModifier) && node.parent.kind === SyntaxKind.Constructor && isClassLike(node.parent.parent);
4278+
export type ParameterPropertyDeclaration = ParameterDeclaration & { parent: ConstructorDeclaration, name: Identifier };
4279+
export function isParameterPropertyDeclaration(node: Node): node is ParameterPropertyDeclaration {
4280+
return hasModifier(node, ModifierFlags.ParameterPropertyModifier) && node.parent.kind === SyntaxKind.Constructor;
42764281
}
42774282

42784283
export function isEmptyBindingPattern(node: BindingName): node is BindingPattern {

src/services/refactors/generateGetAccessorAndSetAccessor.ts

+7-48
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
44
const actionDescription = Diagnostics.Generate_get_and_set_accessors.message;
55
registerRefactor(actionName, { getEditsForAction, getAvailableActions });
66

7-
type AcceptedDeclaration = ParameterDeclaration | PropertyDeclaration | PropertyAssignment;
7+
type AcceptedDeclaration = ParameterPropertyDeclaration | PropertyDeclaration | PropertyAssignment;
88
type AcceptedNameType = Identifier | StringLiteral;
99
type ContainerDeclaration = ClassLikeDeclaration | ObjectLiteralExpression;
1010

11-
interface DeclarationInfo {
11+
interface Info {
1212
container: ContainerDeclaration;
1313
isStatic: boolean;
1414
type: TypeNode | undefined;
15-
}
16-
17-
interface Info extends DeclarationInfo {
1815
declaration: AcceptedDeclaration;
1916
fieldName: AcceptedNameType;
2017
accessorName: AcceptedNameType;
@@ -92,62 +89,24 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
9289
return modifiers && createNodeArray(modifiers);
9390
}
9491

95-
function getPropertyDeclarationInfo(propertyDeclaration: PropertyDeclaration): DeclarationInfo | undefined {
96-
if (!isClassLike(propertyDeclaration.parent) || !propertyDeclaration.parent.members) return undefined;
97-
98-
return {
99-
isStatic: hasStaticModifier(propertyDeclaration),
100-
type: propertyDeclaration.type,
101-
container: propertyDeclaration.parent
102-
};
103-
}
104-
105-
function getParameterPropertyDeclarationInfo(parameterDeclaration: ParameterDeclaration): DeclarationInfo | undefined {
106-
if (!isClassLike(parameterDeclaration.parent.parent) || !parameterDeclaration.parent.parent.members) return undefined;
107-
108-
return {
109-
isStatic: false,
110-
type: parameterDeclaration.type,
111-
container: parameterDeclaration.parent.parent
112-
};
113-
}
114-
115-
function getPropertyAssignmentDeclarationInfo(propertyAssignment: PropertyAssignment): DeclarationInfo | undefined {
116-
return {
117-
isStatic: false,
118-
type: undefined,
119-
container: propertyAssignment.parent
120-
};
121-
}
122-
123-
function getDeclarationInfo(declaration: AcceptedDeclaration) {
124-
if (isPropertyDeclaration(declaration)) {
125-
return getPropertyDeclarationInfo(declaration);
126-
}
127-
else if (isPropertyAssignment(declaration)) {
128-
return getPropertyAssignmentDeclarationInfo(declaration);
129-
}
130-
else {
131-
return getParameterPropertyDeclarationInfo(declaration);
132-
}
133-
}
134-
13592
function getConvertibleFieldAtPosition(file: SourceFile, startPosition: number): Info | undefined {
13693
const node = getTokenAtPosition(file, startPosition, /*includeJsDocComment*/ false);
13794
const declaration = findAncestor(node.parent, isAcceptedDeclaration);
13895
// make sure propertyDeclaration have AccessibilityModifier or Static Modifier
13996
const meaning = ModifierFlags.AccessibilityModifier | ModifierFlags.Static;
14097
if (!declaration || !isConvertableName(declaration.name) || (getModifierFlags(declaration) | meaning) !== meaning) return undefined;
14198

142-
const info = getDeclarationInfo(declaration);
14399
const fieldName = createPropertyName(getUniqueName(`_${declaration.name.text}`, file.text), declaration.name);
100+
const accessorName = createPropertyName(declaration.name.text, declaration.name);
144101
suppressLeadingAndTrailingTrivia(fieldName);
145102
suppressLeadingAndTrailingTrivia(declaration);
146103
return {
147-
...info,
104+
isStatic: hasStaticModifier(declaration),
105+
type: getTypeAnnotationNode(declaration),
106+
container: declaration.kind === SyntaxKind.Parameter ? declaration.parent.parent : declaration.parent,
148107
declaration,
149108
fieldName,
150-
accessorName: createPropertyName(declaration.name.text, declaration.name)
109+
accessorName,
151110
};
152111
}
153112

tests/baselines/reference/api/tsserverlibrary.d.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ declare namespace ts {
585585
}
586586
interface PropertyDeclaration extends ClassElement, JSDocContainer {
587587
kind: SyntaxKind.PropertyDeclaration;
588+
parent: ClassLikeDeclaration;
588589
name: PropertyName;
589590
questionToken?: QuestionToken;
590591
exclamationToken?: ExclamationToken;
@@ -3010,7 +3011,11 @@ declare namespace ts {
30103011
*/
30113012
function collapseTextChangeRangesAcrossMultipleVersions(changes: ReadonlyArray<TextChangeRange>): TextChangeRange;
30123013
function getTypeParameterOwner(d: Declaration): Declaration;
3013-
function isParameterPropertyDeclaration(node: Node): node is ParameterDeclaration;
3014+
type ParameterPropertyDeclaration = ParameterDeclaration & {
3015+
parent: ConstructorDeclaration;
3016+
name: Identifier;
3017+
};
3018+
function isParameterPropertyDeclaration(node: Node): node is ParameterPropertyDeclaration;
30143019
function isEmptyBindingPattern(node: BindingName): node is BindingPattern;
30153020
function isEmptyBindingElement(node: BindingElement): boolean;
30163021
function getCombinedModifierFlags(node: Node): ModifierFlags;

tests/baselines/reference/api/typescript.d.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ declare namespace ts {
585585
}
586586
interface PropertyDeclaration extends ClassElement, JSDocContainer {
587587
kind: SyntaxKind.PropertyDeclaration;
588+
parent: ClassLikeDeclaration;
588589
name: PropertyName;
589590
questionToken?: QuestionToken;
590591
exclamationToken?: ExclamationToken;
@@ -3010,7 +3011,11 @@ declare namespace ts {
30103011
*/
30113012
function collapseTextChangeRangesAcrossMultipleVersions(changes: ReadonlyArray<TextChangeRange>): TextChangeRange;
30123013
function getTypeParameterOwner(d: Declaration): Declaration;
3013-
function isParameterPropertyDeclaration(node: Node): node is ParameterDeclaration;
3014+
type ParameterPropertyDeclaration = ParameterDeclaration & {
3015+
parent: ConstructorDeclaration;
3016+
name: Identifier;
3017+
};
3018+
function isParameterPropertyDeclaration(node: Node): node is ParameterPropertyDeclaration;
30143019
function isEmptyBindingPattern(node: BindingName): node is BindingPattern;
30153020
function isEmptyBindingElement(node: BindingElement): boolean;
30163021
function getCombinedModifierFlags(node: Node): ModifierFlags;

0 commit comments

Comments
 (0)