Skip to content

Feat/support example #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Dec 1, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,771 changes: 2,771 additions & 0 deletions config/snippets/tiat-examples.json

Large diffs are not rendered by default.

176 changes: 140 additions & 36 deletions config/tips/tiat-resources.json

Large diffs are not rendered by default.

37,366 changes: 37,366 additions & 0 deletions config/tips/tiat-resources_bak.json

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "vscode-tencentcloud-terraform",
"displayName": "Tencent Cloud Terraform",
"description": "VS Code extension for developing with Terraform on Tencent Cloud",
"version": "0.0.20",
"version": "0.0.21",
"license": "MIT",
"publisher": "Tencent-Cloud",
"icon": "images/tc-tf-logo.png",
Expand Down
76 changes: 66 additions & 10 deletions src/autocomplete/TerraformExampleProvider.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,77 @@
import { CompletionItemProvider, TextDocument, Position, CancellationToken, CompletionItem } from "vscode";
import resources from '../../config/tips/tiat-resources.json';
import examples from '../../config/snippets/tiat-examples.json';
import * as _ from "lodash";
import * as vscode from "vscode";

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

export class TerraformExampleProvider implements CompletionItemProvider {
document: TextDocument;
position: Position;
token: CancellationToken;
resourceType: string | null = null;

provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): vscode.ProviderResult<vscode.CompletionItem[] | vscode.CompletionList> {
this.document = document;
this.position = position;
this.token = token;

const exampleItems: vscode.CompletionItem[] = [];
const lineText = document.lineAt(position.line).text;
const lineTillCurrentPosition = lineText.substring(0, position.character);

const endwithBrace = lineTillCurrentPosition.endsWith(EXAMPLE_TRIGGER_CHARACTER);
const includeBrace = lineTillCurrentPosition.indexOf(EXAMPLE_TRIGGER_CHARACTER);

if (endwithBrace) {
const resourceType = this.getDefinedResourceTypes(lineTillCurrentPosition);
const res = examples[resourceType];
const text = res.example;
let c = new CompletionItem(`Auto complete example: {${resourceType}}`, vscode.CompletionItemKind.Snippet);
c.detail = `Press \`ENTER\` to insert example code.\nPress \`ESC\` to continue.`;
c.command = {
title: 'Insert Example',
command: EXAMPLE_CMD,
arguments: [text],
};
exampleItems.push(c)
}

return exampleItems;
}

public provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken): CompletionItem[] {
return [];
getDefinedResourceTypes(lineText: string): string {
let r = /resource "([a-zA-Z0-9\-_]+)"/;
let found = "";
let result = RegExp(r).exec(lineText);
if (result && result.length > 1) {
found = result[1];
return found;
}

return found;
}
}

export function handleExampleCmd(): (...args: any[]) => any {
return async (insertText: string) => {
const editor = vscode.window.activeTextEditor;
if (!editor) {
return;
}

const document = editor.document;
const position = editor.selection.active;
const line = document.lineAt(position.line);
const lineRange = new vscode.Range(line.range.start, line.range.end);

const workspaceEdit = new vscode.WorkspaceEdit();
workspaceEdit.replace(document.uri, lineRange, insertText);

await vscode.workspace.applyEdit(workspaceEdit);

const newPosition = position.with(position.line, (insertText).length);
editor.selection = new vscode.Selection(newPosition, newPosition);
};
}
11 changes: 7 additions & 4 deletions src/autocomplete/TerraformTipsProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ interface TerraformCompletionContext extends vscode.CompletionContext {
const TEXT_MIN_SORT = "a";
const TEXT_FILTER = " ";

export const TIPS_TRIGGER_CHARACTER = [".", "\""];
export const TIPS_OPTIONS_TRIGGER_CHARACTER = '=';

export class TerraformTipsProvider implements CompletionItemProvider {
document: TextDocument;
position: Position;
Expand Down Expand Up @@ -95,8 +98,8 @@ export class TerraformTipsProvider implements CompletionItemProvider {
return this.getHintsForStrings(possibleResources);
}

const endwithEqual = lineTillCurrentPosition.endsWith('=');
const includeEqual = lineTillCurrentPosition.indexOf('=');
const endwithEqual = lineTillCurrentPosition.endsWith(TIPS_OPTIONS_TRIGGER_CHARACTER);
const includeEqual = lineTillCurrentPosition.indexOf(TIPS_OPTIONS_TRIGGER_CHARACTER);
// handle options
if (this.resourceType) {
// typing a '=' character
Expand Down Expand Up @@ -188,7 +191,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
let found = [];
for (let i = 0; i < document.lineCount; i++) {
let line = document.lineAt(i).text;
let result = line.match(r);
let result = RegExp(r).exec(line);
if (result && result.length > 1) {
found.push(result[1]);
}
Expand Down Expand Up @@ -291,7 +294,7 @@ export class TerraformTipsProvider implements CompletionItemProvider {
}

const changes = event.contentChanges[0];
if (changes.text === '=') {
if (changes.text === TIPS_OPTIONS_TRIGGER_CHARACTER) {
const position = activeEditor.selection.active;
const resourceType = this.findResourceType(event.document, position);

Expand Down
16 changes: 13 additions & 3 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,15 @@ import { init } from "vscode-nls-i18n";
import { TerraformCommand, TerraformerCommand } from "./commons/customCmdRegister";
import { terraformShellManager } from "./client/terminal/terraformShellManager";
import { DialogOption } from "./utils/uiUtils";
import { TerraformTipsProvider } from './autocomplete/TerraformTipsProvider';
import { TerraformTipsProvider, TIPS_TRIGGER_CHARACTER } from './autocomplete/TerraformTipsProvider';
import { TerraformResDocProvider } from './autocomplete/TerraformResDocProvider';
import { registerExternelCommands, bindExtensionContext } from './commons';
import { registerView } from './views';
import { TerraformRunner } from './client/runner/terraformRunner';
import { TerraformerRunner } from './client/runner/terraformerRunner';
import { GitUtils } from './utils/gitUtils';
import _ from 'lodash';
import * as autocomplete from './autocomplete/TerraformExampleProvider';

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

// auto-complete
console.log('activate the auto complete(snippets and lint) feature');
console.log('activate the tips(resource and options) feature');
const tipsProvider = new TerraformTipsProvider();
const exampleProvider = new autocomplete.TerraformExampleProvider();
context.subscriptions.push(
vscode.workspace.onDidChangeTextDocument((event) => {
tipsProvider.handleCharacterEvent(event);
})
);
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, tipsProvider, ".", "\""));
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, tipsProvider, ...TIPS_TRIGGER_CHARACTER));
context.subscriptions.push(vscode.languages.registerDefinitionProvider(TF_MODE, new TerraformResDocProvider()));
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, exampleProvider, autocomplete.EXAMPLE_TRIGGER_CHARACTER));

// example
console.log('activate the auto complete(example) feature');
let disposableExample = vscode.commands.registerCommand(autocomplete.EXAMPLE_CMD, autocomplete.handleExampleCmd());
context.subscriptions.push(disposableExample);

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



// This method is called when your extension is deactivated
export function deactivate() {
/* TODO document why this function 'deactivate' is empty */
Expand Down
5 changes: 3 additions & 2 deletions tool/scrape/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ WORKDIR /app
RUN npm i -g nodemon typescript
RUN npm i
RUN tsc
RUN apk --update add git
RUN apk --update --no-cache add git
RUN git clone https://github.com/tencentcloudstack/terraform-provider-tencentcloud.git
CMD node index.js
# CMD node index.js
ENTRYPOINT [ "node", "index.js" ]
15 changes: 9 additions & 6 deletions tool/scrape/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,21 @@ workdir=$(
pwd
)

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

echo "docker run [${1}] to generate tiat-resources.json."
docker run -it ${1} >../../config/tips/tiat-resources.json
else
docker run -it ${1} resource >../../config/tips/tiat-resources.json

echo "docker run [${1}] to generate tiat-resources.json."
docker run -it ${1} example >../../config/tips/tiat-resources.json
else # with args
echo "docker build with [build-arg]...[${1}][${2}][${workdir}]"
docker build --build-arg base=${2} -f ${workdir}/Dockerfile ${workdir}/ -t ${1}
docker build --build-arg args=${2} -f ${workdir}/Dockerfile ${workdir}/ -t ${1}
fi
fi
Loading