Skip to content

Commit 4e18659

Browse files
committed
feat: optimize tips order to compatible with terraform extension
1 parent 9cefe8c commit 4e18659

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

src/autocomplete/TerraformTipsProvider.ts

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ interface TerraformCompletionContext extends vscode.CompletionContext {
1515
resourceType?: string;
1616
}
1717

18+
const TEXT_MIN_SORT = "a";
19+
const TEXT_FILTER = " ";
20+
1821
export class TerraformTipsProvider implements CompletionItemProvider {
1922
document: TextDocument;
2023
position: Position;
@@ -30,7 +33,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
3033
const lineText = document.lineAt(position.line).text;
3134
const lineTillCurrentPosition = lineText.substring(0, position.character);
3235

33-
// Are we trying to type a resource type?
36+
// Are we trying to type a top type?
3437
if (this.isTopLevelType(lineTillCurrentPosition)) {
3538
return this.getTopLevelType(lineTillCurrentPosition);
3639
}
@@ -49,7 +52,9 @@ export class TerraformTipsProvider implements CompletionItemProvider {
4952
let definedResourceTypes = this.getDefinedResourceTypes(document);
5053
let finalResourceTypes = _.filter(definedResourceTypes, o => (o.indexOf(resourceTypePrefix) === 0));
5154
return _.map(finalResourceTypes, o => {
52-
return new CompletionItem(o, CompletionItemKind.Field);
55+
const c = new CompletionItem(o, CompletionItemKind.Field);
56+
c.sortText = TEXT_MIN_SORT;
57+
return c;
5358
});
5459
}
5560
else if (parts.length === 2) {
@@ -58,7 +63,11 @@ export class TerraformTipsProvider implements CompletionItemProvider {
5863

5964
// Get a list of all the names for this resource type
6065
let names = this.getNamesForResourceType(document, resourceType);
61-
return _.map(names, o => new CompletionItem(o, CompletionItemKind.Field));
66+
return _.map(names, o => {
67+
const c = new CompletionItem(o, CompletionItemKind.Field);
68+
c.sortText = TEXT_MIN_SORT;
69+
return c;
70+
});
6271
}
6372
else if (parts.length === 3) {
6473
// We're trying to type the exported field for the let
@@ -69,6 +78,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
6978
let c = new CompletionItem(`${o.name} (${resourceType})`, CompletionItemKind.Property);
7079
c.detail = o.description;
7180
c.insertText = o.name;
81+
c.sortText = TEXT_MIN_SORT;
7282
return c;
7383
});
7484
return result;
@@ -80,6 +90,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
8090

8191
// Are we trying to type a parameter to a resource?
8292
let possibleResources = this.checkTopLevelResource(lineTillCurrentPosition);
93+
// typing a resource type
8394
if (possibleResources.length > 0) {
8495
return this.getHintsForStrings(possibleResources);
8596
}
@@ -88,7 +99,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
8899
const includeEqual = lineTillCurrentPosition.indexOf('=');
89100
// handle options
90101
if (this.resourceType) {
91-
// when we typing a '=' character
102+
// typing a '=' character
92103
if (endwithEqual) {
93104
const lineBeforeEqualSign = lineTillCurrentPosition.substring(0, includeEqual).trim();
94105
// load options
@@ -99,6 +110,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
99110
this.resourceType = "";
100111
return (options).length ? options : [];
101112
}
113+
this.resourceType = "";
102114
return [];
103115
}
104116

@@ -109,6 +121,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
109121
let line = document.lineAt(i).text;
110122
let parentType = this.getParentType(line);
111123
if (parentType && parentType.type === "resource") {
124+
// typing a arg in resource
112125
const resourceType = this.getResourceTypeFromLine(line);
113126
const ret = this.getItemsForArgs(resources[resourceType].args, resourceType);
114127
return ret;
@@ -141,7 +154,10 @@ export class TerraformTipsProvider implements CompletionItemProvider {
141154
getOptionsFormArg(opts: string[]): CompletionItem[] {
142155
return _.map(opts, opt => {
143156
let c = new CompletionItem(opt, CompletionItemKind.Value);
144-
c.insertText = "\"" + opt + "\"";
157+
const text = "\ \"" + opt + "\"";
158+
c.insertText = text;
159+
c.sortText = TEXT_MIN_SORT;
160+
c.filterText = TEXT_FILTER;
145161
return c;
146162
});
147163
}
@@ -192,9 +208,11 @@ export class TerraformTipsProvider implements CompletionItemProvider {
192208

193209
getTopLevelType(line: string): CompletionItem[] {
194210
for (const element of topLevelTypes) {
195-
let resourceType = element;
196-
if (resourceType.startsWith(line)) {
197-
return [new CompletionItem(resourceType, CompletionItemKind.Enum)];
211+
let topType = element;
212+
if (topType.startsWith(line)) {
213+
const c = new CompletionItem(topType, CompletionItemKind.Enum);
214+
c.sortText = TEXT_MIN_SORT;
215+
return [c];
198216
}
199217
}
200218
return [];
@@ -233,7 +251,9 @@ export class TerraformTipsProvider implements CompletionItemProvider {
233251

234252
getHintsForStrings(strings: string[]): CompletionItem[] {
235253
return _.map(strings, s => {
236-
return new CompletionItem(s, CompletionItemKind.Enum);
254+
const c = new CompletionItem(s, CompletionItemKind.Enum);
255+
c.sortText = TEXT_MIN_SORT;
256+
return c;
237257
});
238258
}
239259

@@ -258,6 +278,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
258278
let c = new CompletionItem(`${o.name} (${type})`, CompletionItemKind.Property);
259279
c.detail = o.description;
260280
c.insertText = o.name;
281+
c.sortText = TEXT_MIN_SORT;
261282
return c;
262283
});
263284
}

src/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { GitUtils } from './utils/gitUtils';
1616
import _ from 'lodash';
1717

1818
const TF_MODE: vscode.DocumentFilter = { language: 'terraform', scheme: 'file' };
19+
const COMPATIBLE_MODE: vscode.DocumentFilter = { scheme: 'file' };
1920

2021
// This method is called when your extension is activated
2122
// Your extension is activated the very first time the command is executed
@@ -101,7 +102,7 @@ export async function activate(context: vscode.ExtensionContext) {
101102
tipsProvider.handleCharacterEvent(event);
102103
})
103104
);
104-
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, tipsProvider));
105+
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, tipsProvider, ".", "\""));
105106
context.subscriptions.push(vscode.languages.registerDefinitionProvider(TF_MODE, new TerraformResDocProvider()));
106107

107108
// import-resource

0 commit comments

Comments
 (0)