Skip to content

Commit 33fbb8a

Browse files
authored
Support inferSelection when extract field (#1721)
Signed-off-by: Shi Chen <[email protected]>
1 parent c05c379 commit 33fbb8a

File tree

3 files changed

+85
-41
lines changed

3 files changed

+85
-41
lines changed

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
174174
generateConstructorsPromptSupport: true,
175175
generateDelegateMethodsPromptSupport: true,
176176
advancedExtractRefactoringSupport: true,
177-
inferSelectionSupport: ["extractMethod", "extractVariable"],
177+
inferSelectionSupport: ["extractMethod", "extractVariable", "extractField"],
178178
moveRefactoringSupport: true,
179179
clientHoverProvider: true,
180180
clientDocumentSymbolProvider: true,

src/protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ export interface SelectionInfo {
333333
name: string;
334334
length: number;
335335
offset: number;
336+
params?: string[];
336337
}
337338

338339
export interface InferSelectionParams {

src/refactorAction.ts

Lines changed: 83 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,38 @@ function registerApplyRefactorCommand(languageClient: LanguageClient, context: E
5252
insertSpaces: <boolean> currentEditor.options.insertSpaces,
5353
};
5454
const commandArguments: any[] = [];
55-
if (command === 'extractField' || command === 'convertVariableToField') {
56-
if (commandInfo.initializedScopes && Array.isArray(commandInfo.initializedScopes)) {
57-
const scopes: any[] = commandInfo.initializedScopes;
58-
let initializeIn: string;
59-
if (scopes.length === 1) {
60-
initializeIn = scopes[0];
61-
} else if (scopes.length > 1) {
62-
initializeIn = await window.showQuickPick(scopes, {
63-
placeHolder: "Initialize the field in",
64-
});
65-
55+
if (command === 'extractField') {
56+
if (!params || !params.range) {
57+
return;
58+
}
59+
if (params.range.start.character === params.range.end.character && params.range.start.line === params.range.end.line) {
60+
const expression: SelectionInfo = await getExpression(command, params, languageClient);
61+
if (!expression) {
62+
return;
63+
}
64+
if (expression.params && Array.isArray(expression.params)) {
65+
const initializeIn = await resolveScopes(expression.params);
6666
if (!initializeIn) {
6767
return;
6868
}
69+
commandArguments.push(initializeIn);
70+
}
71+
commandArguments.push(expression);
72+
} else {
73+
if (commandInfo.initializedScopes && Array.isArray(commandInfo.initializedScopes)) {
74+
const initializeIn = await resolveScopes(commandInfo.initializedScopes);
75+
if (!initializeIn) {
76+
return;
77+
}
78+
commandArguments.push(initializeIn);
79+
}
80+
}
81+
} else if (command === 'convertVariableToField') {
82+
if (commandInfo.initializedScopes && Array.isArray(commandInfo.initializedScopes)) {
83+
const initializeIn = await resolveScopes(commandInfo.initializedScopes);
84+
if (!initializeIn) {
85+
return;
6986
}
70-
7187
commandArguments.push(initializeIn);
7288
}
7389
} else if (command === 'extractMethod'
@@ -78,36 +94,11 @@ function registerApplyRefactorCommand(languageClient: LanguageClient, context: E
7894
return;
7995
}
8096
if (params.range.start.character === params.range.end.character && params.range.start.line === params.range.end.line) {
81-
const expressions: SelectionInfo[] = await languageClient.sendRequest(InferSelectionRequest.type, {
82-
command: command,
83-
context: params,
84-
});
85-
const options: IExpressionItem[] = [];
86-
for (const expression of expressions) {
87-
const extractItem: IExpressionItem = {
88-
label: expression.name,
89-
length: expression.length,
90-
offset: expression.offset,
91-
};
92-
options.push(extractItem);
93-
}
94-
let resultItem: IExpressionItem;
95-
if (options.length === 1) {
96-
resultItem = options[0];
97-
} else if (options.length > 1) {
98-
resultItem = await window.showQuickPick<IExpressionItem>(options, {
99-
placeHolder: "Choose the expression to extract",
100-
});
101-
}
102-
if (!resultItem) {
97+
const expression = await getExpression(command, params, languageClient);
98+
if (!expression) {
10399
return;
104100
}
105-
const resultExpression: SelectionInfo = {
106-
name: resultItem.label,
107-
length: resultItem.length,
108-
offset: resultItem.offset,
109-
};
110-
commandArguments.push(resultExpression);
101+
commandArguments.push(expression);
111102
}
112103
}
113104

@@ -135,10 +126,62 @@ function registerApplyRefactorCommand(languageClient: LanguageClient, context: E
135126
}));
136127
}
137128

129+
async function resolveScopes(scopes: any[]): Promise<any | undefined> {
130+
let initializeIn: string;
131+
if (scopes.length === 1) {
132+
initializeIn = scopes[0];
133+
} else if (scopes.length > 1) {
134+
initializeIn = await window.showQuickPick(scopes, {
135+
placeHolder: "Initialize the field in",
136+
});
137+
138+
if (!initializeIn) {
139+
return undefined;
140+
}
141+
}
142+
return initializeIn;
143+
}
144+
145+
async function getExpression(command: string, params: any, languageClient: LanguageClient): Promise<SelectionInfo | undefined> {
146+
const expressions: SelectionInfo[] = await languageClient.sendRequest(InferSelectionRequest.type, {
147+
command: command,
148+
context: params,
149+
});
150+
const options: IExpressionItem[] = [];
151+
for (const expression of expressions) {
152+
const extractItem: IExpressionItem = {
153+
label: expression.name,
154+
length: expression.length,
155+
offset: expression.offset,
156+
params: expression.params,
157+
};
158+
options.push(extractItem);
159+
}
160+
let resultItem: IExpressionItem;
161+
if (options.length === 1) {
162+
resultItem = options[0];
163+
} else if (options.length > 1) {
164+
resultItem = await window.showQuickPick<IExpressionItem>(options, {
165+
placeHolder: "Choose the expression to extract",
166+
});
167+
}
168+
if (!resultItem) {
169+
return undefined;
170+
}
171+
const resultExpression: SelectionInfo = {
172+
name: resultItem.label,
173+
length: resultItem.length,
174+
offset: resultItem.offset,
175+
params: resultItem.params,
176+
};
177+
return resultExpression;
178+
}
179+
138180
interface IExpressionItem extends QuickPickItem {
139181
label: string;
140182
length: number;
141183
offset: number;
184+
params?: string[];
142185
}
143186

144187
async function applyRefactorEdit(languageClient: LanguageClient, refactorEdit: RefactorWorkspaceEdit) {

0 commit comments

Comments
 (0)