Skip to content

Commit 1edac75

Browse files
authored
Feat/support example (#9)
* tips options demo * add github workflow2 * 0.0.19 * feat: update json * update tiat-resources.json * support example and update example json * support to scrape example from doc * fix: example line * 0.0.21
1 parent 8c57af1 commit 1edac75

File tree

12 files changed

+40507
-129
lines changed

12 files changed

+40507
-129
lines changed

config/snippets/tiat-examples.json

Lines changed: 2771 additions & 0 deletions
Large diffs are not rendered by default.

config/tips/tiat-resources.json

Lines changed: 140 additions & 36 deletions
Large diffs are not rendered by default.

config/tips/tiat-resources_bak.json

Lines changed: 37366 additions & 0 deletions
Large diffs are not rendered by default.

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "vscode-tencentcloud-terraform",
33
"displayName": "Tencent Cloud Terraform",
44
"description": "VS Code extension for developing with Terraform on Tencent Cloud",
5-
"version": "0.0.20",
5+
"version": "0.0.21",
66
"license": "MIT",
77
"publisher": "Tencent-Cloud",
88
"icon": "images/tc-tf-logo.png",
Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,77 @@
11
import { CompletionItemProvider, TextDocument, Position, CancellationToken, CompletionItem } from "vscode";
2-
import resources from '../../config/tips/tiat-resources.json';
2+
import examples from '../../config/snippets/tiat-examples.json';
33
import * as _ from "lodash";
4+
import * as vscode from "vscode";
45

5-
var topLevelTypes = ["output", "provider", "resource", "variable", "data"];
6-
var topLevelRegexes = topLevelTypes.map(o => {
7-
return {
8-
type: o,
9-
regex: new RegExp(o + ' "[A-Za-z0-9\-_]+" "[A-Za-z0-9\-_]*" \{')
10-
};
11-
});
6+
export const EXAMPLE_TRIGGER_CHARACTER = '{';
7+
export const EXAMPLE_CMD = "tcTerraform.autocomplete.example";
128

139
export class TerraformExampleProvider implements CompletionItemProvider {
1410
document: TextDocument;
1511
position: Position;
1612
token: CancellationToken;
13+
resourceType: string | null = null;
14+
15+
provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): vscode.ProviderResult<vscode.CompletionItem[] | vscode.CompletionList> {
16+
this.document = document;
17+
this.position = position;
18+
this.token = token;
19+
20+
const exampleItems: vscode.CompletionItem[] = [];
21+
const lineText = document.lineAt(position.line).text;
22+
const lineTillCurrentPosition = lineText.substring(0, position.character);
23+
24+
const endwithBrace = lineTillCurrentPosition.endsWith(EXAMPLE_TRIGGER_CHARACTER);
25+
const includeBrace = lineTillCurrentPosition.indexOf(EXAMPLE_TRIGGER_CHARACTER);
26+
27+
if (endwithBrace) {
28+
const resourceType = this.getDefinedResourceTypes(lineTillCurrentPosition);
29+
const res = examples[resourceType];
30+
const text = res.example;
31+
let c = new CompletionItem(`Auto complete example: {${resourceType}}`, vscode.CompletionItemKind.Snippet);
32+
c.detail = `Press \`ENTER\` to insert example code.\nPress \`ESC\` to continue.`;
33+
c.command = {
34+
title: 'Insert Example',
35+
command: EXAMPLE_CMD,
36+
arguments: [text],
37+
};
38+
exampleItems.push(c)
39+
}
40+
41+
return exampleItems;
42+
}
1743

18-
public provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken): CompletionItem[] {
19-
return [];
44+
getDefinedResourceTypes(lineText: string): string {
45+
let r = /resource "([a-zA-Z0-9\-_]+)"/;
46+
let found = "";
47+
let result = RegExp(r).exec(lineText);
48+
if (result && result.length > 1) {
49+
found = result[1];
50+
return found;
51+
}
52+
53+
return found;
2054
}
55+
}
56+
57+
export function handleExampleCmd(): (...args: any[]) => any {
58+
return async (insertText: string) => {
59+
const editor = vscode.window.activeTextEditor;
60+
if (!editor) {
61+
return;
62+
}
63+
64+
const document = editor.document;
65+
const position = editor.selection.active;
66+
const line = document.lineAt(position.line);
67+
const lineRange = new vscode.Range(line.range.start, line.range.end);
68+
69+
const workspaceEdit = new vscode.WorkspaceEdit();
70+
workspaceEdit.replace(document.uri, lineRange, insertText);
71+
72+
await vscode.workspace.applyEdit(workspaceEdit);
73+
74+
const newPosition = position.with(position.line, (insertText).length);
75+
editor.selection = new vscode.Selection(newPosition, newPosition);
76+
};
2177
}

src/autocomplete/TerraformTipsProvider.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ interface TerraformCompletionContext extends vscode.CompletionContext {
1818
const TEXT_MIN_SORT = "a";
1919
const TEXT_FILTER = " ";
2020

21+
export const TIPS_TRIGGER_CHARACTER = [".", "\""];
22+
export const TIPS_OPTIONS_TRIGGER_CHARACTER = '=';
23+
2124
export class TerraformTipsProvider implements CompletionItemProvider {
2225
document: TextDocument;
2326
position: Position;
@@ -95,8 +98,8 @@ export class TerraformTipsProvider implements CompletionItemProvider {
9598
return this.getHintsForStrings(possibleResources);
9699
}
97100

98-
const endwithEqual = lineTillCurrentPosition.endsWith('=');
99-
const includeEqual = lineTillCurrentPosition.indexOf('=');
101+
const endwithEqual = lineTillCurrentPosition.endsWith(TIPS_OPTIONS_TRIGGER_CHARACTER);
102+
const includeEqual = lineTillCurrentPosition.indexOf(TIPS_OPTIONS_TRIGGER_CHARACTER);
100103
// handle options
101104
if (this.resourceType) {
102105
// typing a '=' character
@@ -188,7 +191,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
188191
let found = [];
189192
for (let i = 0; i < document.lineCount; i++) {
190193
let line = document.lineAt(i).text;
191-
let result = line.match(r);
194+
let result = RegExp(r).exec(line);
192195
if (result && result.length > 1) {
193196
found.push(result[1]);
194197
}
@@ -291,7 +294,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
291294
}
292295

293296
const changes = event.contentChanges[0];
294-
if (changes.text === '=') {
297+
if (changes.text === TIPS_OPTIONS_TRIGGER_CHARACTER) {
295298
const position = activeEditor.selection.active;
296299
const resourceType = this.findResourceType(event.document, position);
297300

src/extension.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import { init } from "vscode-nls-i18n";
66
import { TerraformCommand, TerraformerCommand } from "./commons/customCmdRegister";
77
import { terraformShellManager } from "./client/terminal/terraformShellManager";
88
import { DialogOption } from "./utils/uiUtils";
9-
import { TerraformTipsProvider } from './autocomplete/TerraformTipsProvider';
9+
import { TerraformTipsProvider, TIPS_TRIGGER_CHARACTER } from './autocomplete/TerraformTipsProvider';
1010
import { TerraformResDocProvider } from './autocomplete/TerraformResDocProvider';
1111
import { registerExternelCommands, bindExtensionContext } from './commons';
1212
import { registerView } from './views';
1313
import { TerraformRunner } from './client/runner/terraformRunner';
1414
import { TerraformerRunner } from './client/runner/terraformerRunner';
1515
import { GitUtils } from './utils/gitUtils';
1616
import _ from 'lodash';
17+
import * as autocomplete from './autocomplete/TerraformExampleProvider';
1718

1819
const TF_MODE: vscode.DocumentFilter = { language: 'terraform', scheme: 'file' };
1920
const COMPATIBLE_MODE: vscode.DocumentFilter = { scheme: 'file' };
@@ -95,15 +96,22 @@ export async function activate(context: vscode.ExtensionContext) {
9596
context.subscriptions.push(disposableTferPlan);
9697

9798
// auto-complete
98-
console.log('activate the auto complete(snippets and lint) feature');
99+
console.log('activate the tips(resource and options) feature');
99100
const tipsProvider = new TerraformTipsProvider();
101+
const exampleProvider = new autocomplete.TerraformExampleProvider();
100102
context.subscriptions.push(
101103
vscode.workspace.onDidChangeTextDocument((event) => {
102104
tipsProvider.handleCharacterEvent(event);
103105
})
104106
);
105-
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, tipsProvider, ".", "\""));
107+
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, tipsProvider, ...TIPS_TRIGGER_CHARACTER));
106108
context.subscriptions.push(vscode.languages.registerDefinitionProvider(TF_MODE, new TerraformResDocProvider()));
109+
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, exampleProvider, autocomplete.EXAMPLE_TRIGGER_CHARACTER));
110+
111+
// example
112+
console.log('activate the auto complete(example) feature');
113+
let disposableExample = vscode.commands.registerCommand(autocomplete.EXAMPLE_CMD, autocomplete.handleExampleCmd());
114+
context.subscriptions.push(disposableExample);
107115

108116
// import-resource
109117
console.log('activate the import feature');
@@ -112,6 +120,8 @@ export async function activate(context: vscode.ExtensionContext) {
112120
registerView();
113121
}
114122

123+
124+
115125
// This method is called when your extension is deactivated
116126
export function deactivate() {
117127
/* TODO document why this function 'deactivate' is empty */

tool/scrape/Dockerfile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ WORKDIR /app
55
RUN npm i -g nodemon typescript
66
RUN npm i
77
RUN tsc
8-
RUN apk --update add git
8+
RUN apk --update --no-cache add git
99
RUN git clone https://github.com/tencentcloudstack/terraform-provider-tencentcloud.git
10-
CMD node index.js
10+
# CMD node index.js
11+
ENTRYPOINT [ "node", "index.js" ]

tool/scrape/build.sh

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,21 @@ workdir=$(
44
pwd
55
)
66

7-
if [ $# == 0 ]; then
7+
if [ $# == 0 ]; then # default
88
echo "docker build with no params..."
9-
docker build -f ${workdir}/Dockerfile ${workdir}/
10-
else
9+
docker build -f ${workdir}/Dockerfile ${workdir}/ -t tiat/terraform-scrape:latest
10+
else # with image:tag
1111
if [ ! -n "${2}" ]; then
1212
echo "docker build with [specified image]...[${1}][${2}][${workdir}]"
1313
docker build -f ${workdir}/Dockerfile ${workdir}/ -t ${1}
1414

1515
echo "docker run [${1}] to generate tiat-resources.json."
16-
docker run -it ${1} >../../config/tips/tiat-resources.json
17-
else
16+
docker run -it ${1} resource >../../config/tips/tiat-resources.json
17+
18+
echo "docker run [${1}] to generate tiat-resources.json."
19+
docker run -it ${1} example >../../config/tips/tiat-resources.json
20+
else # with args
1821
echo "docker build with [build-arg]...[${1}][${2}][${workdir}]"
19-
docker build --build-arg base=${2} -f ${workdir}/Dockerfile ${workdir}/ -t ${1}
22+
docker build --build-arg args=${2} -f ${workdir}/Dockerfile ${workdir}/ -t ${1}
2023
fi
2124
fi

0 commit comments

Comments
 (0)