Skip to content

Commit bfb782a

Browse files
committed
refactor some code
1 parent 7133140 commit bfb782a

File tree

1 file changed

+46
-40
lines changed

1 file changed

+46
-40
lines changed

src/services/refactors/convertObjectDestruction.ts

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -124,51 +124,15 @@ namespace ts.refactor {
124124
let firstReferencedStatement: Statement | undefined;
125125
const referencedAccessExpression: [AccessExpression, string][] = [];
126126
const allReferencedAcccessExpression: AccessExpression[] = [];
127-
const container = isParameter(symbol.valueDeclaration) ?
128-
symbol.valueDeclaration :
129-
findAncestor(symbol.valueDeclaration, or(isStatement, isSourceFile));
127+
const container = isParameter(symbol.valueDeclaration) ? symbol.valueDeclaration : findAncestor(symbol.valueDeclaration, or(isStatement, isSourceFile));
130128
Debug.assertIsDefined(container);
131-
132129
forEach(references, reference => {
133130
if (reference.kind !== FindAllReferences.EntryKind.Node) {
134-
return undefined;
135-
}
136-
137-
let lastChild = reference.node;
138-
const topReferencedAccessExpression = findAncestor(reference.node.parent, n => {
139-
if (isParenthesizedExpression(n)) {
140-
lastChild = n;
141-
return false;
142-
}
143-
else if (isAccessExpression(n)) {
144-
if (n.expression === lastChild) {
145-
return true;
146-
}
147-
lastChild = n;
148-
return false;
149-
}
150-
return "quit";
151-
});
152-
if (!topReferencedAccessExpression) {
153131
return;
154132
}
155133

156-
const accessExpression = cast(topReferencedAccessExpression, isAccessExpression);
157-
allReferencedAcccessExpression.push(accessExpression);
158-
159-
if (isAssignmentTarget(accessExpression)) {
160-
return;
161-
}
162-
163-
const referencedParentMaybeCall = skipParenthesesUp(accessExpression.parent);
164-
if (isCallOrNewExpression(referencedParentMaybeCall) && !(referencedParentMaybeCall.arguments && rangeContainsRange(referencedParentMaybeCall.arguments, topReferencedAccessExpression))) {
165-
return;
166-
}
167-
168-
if (reference.node.pos < symbol.valueDeclaration.pos) {
169-
return;
170-
}
171-
if (isFunctionLikeDeclaration(container.parent) && container.parent.body && !rangeContainsRange(container.parent.body, reference.node)) {
134+
const accessExpression = getAccessExpressionIfValidReference(reference.node, symbol, container, allReferencedAcccessExpression);
135+
if (!accessExpression) {
172136
return;
173137
}
174138

@@ -223,6 +187,7 @@ namespace ts.refactor {
223187
}
224188
}
225189
});
190+
if (hasUnconvertableReference) return undefined;
226191

227192
if (resolveUniqueName) {
228193
forEach(referencedAccessExpression, ([, name]) => {
@@ -233,7 +198,6 @@ namespace ts.refactor {
233198
});
234199
}
235200

236-
if (hasUnconvertableReference) return undefined;
237201
return {
238202
replacementExpression: node.parent.expression,
239203
firstReferenced,
@@ -242,4 +206,46 @@ namespace ts.refactor {
242206
namesNeedUniqueName
243207
};
244208
}
209+
210+
function getAccessExpressionIfValidReference(node: Node, symbol: Symbol, container: Node, allReferencedAcccessExpression: Node[]): AccessExpression | undefined {
211+
let lastChild = node;
212+
const topReferencedAccessExpression = findAncestor(node.parent, n => {
213+
if (isParenthesizedExpression(n)) {
214+
lastChild = n;
215+
return false;
216+
}
217+
else if (isAccessExpression(n)) {
218+
if (n.expression === lastChild) {
219+
return true;
220+
}
221+
lastChild = n;
222+
return false;
223+
}
224+
return "quit";
225+
});
226+
if (!topReferencedAccessExpression) {
227+
return undefined;
228+
}
229+
230+
const accessExpression = cast(topReferencedAccessExpression, isAccessExpression);
231+
allReferencedAcccessExpression.push(accessExpression);
232+
233+
if (isAssignmentTarget(accessExpression)) {
234+
return undefined;
235+
}
236+
237+
const referencedParentMaybeCall = skipParenthesesUp(accessExpression.parent);
238+
if (isCallOrNewExpression(referencedParentMaybeCall) && !(referencedParentMaybeCall.arguments && rangeContainsRange(referencedParentMaybeCall.arguments, topReferencedAccessExpression))) {
239+
return undefined;
240+
}
241+
242+
if (node.pos < symbol.valueDeclaration.pos) {
243+
return undefined;
244+
}
245+
if (isFunctionLikeDeclaration(container.parent) && container.parent.body && !rangeContainsRange(container.parent.body, node)) {
246+
return undefined;
247+
}
248+
249+
return accessExpression;
250+
}
245251
}

0 commit comments

Comments
 (0)