Skip to content

Commit c7bfb53

Browse files
Issue 175 (#178)
* in progress * closes #175
1 parent 98d55b0 commit c7bfb53

File tree

6 files changed

+71
-16
lines changed

6 files changed

+71
-16
lines changed

cjson/package.json

+8-7
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
".cjson"
3636
],
3737
"configuration": "./syntaxes/language-configuration.json",
38-
3938
"icon": {
4039
"dark": "dist/icons/icon.png",
4140
"light": "dist/icons/icon.png"
@@ -66,7 +65,6 @@
6665
]
6766
}
6867
},
69-
7068
"scripts": {
7169
"vscode:prepublish": "npm run package",
7270
"compile": "webpack",
@@ -79,17 +77,20 @@
7977
"test": "vscode-test"
8078
},
8179
"devDependencies": {
82-
"@types/vscode": "^1.70.0",
8380
"@types/mocha": "^10.0.6",
8481
"@types/node": "18.x",
82+
"@types/vscode": "^1.70.0",
8583
"@typescript-eslint/eslint-plugin": "^7.7.1",
8684
"@typescript-eslint/parser": "^7.7.1",
85+
"@vscode/test-cli": "^0.0.8",
86+
"@vscode/test-electron": "^2.3.9",
8787
"eslint": "^8.57.0",
88-
"typescript": "^5.4.5",
8988
"ts-loader": "^9.5.1",
89+
"typescript": "^5.4.5",
9090
"webpack": "^5.91.0",
91-
"webpack-cli": "^5.1.4",
92-
"@vscode/test-cli": "^0.0.8",
93-
"@vscode/test-electron": "^2.3.9"
91+
"webpack-cli": "^5.1.4"
92+
},
93+
"dependencies": {
94+
"coded-json": "^2.1.1"
9495
}
9596
}

cjson/src/definitions/base.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Position, Range, TextDocument } from "vscode";
2+
3+
export abstract class Base {
4+
protected getCharactersByRange(document: TextDocument, startPosition: Position, endPosition: Position) {
5+
return document.getText(new Range(startPosition, endPosition));
6+
}
7+
protected abstract checkAndConfirm(item: string): boolean;
8+
}

cjson/src/definitions/completion-items.ts

+37-3
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,23 @@ import { CancellationToken, CompletionContext, CompletionItem, CompletionItemKin
22
import { BackTrackSearchResult, DirectoryContent } from "../utils/interfaces";
33
import { setAutCompleteList } from "../utils/utils";
44
import { Registers } from "./register";
5+
import { Base } from "./base";
6+
import { Cjson } from "coded-json";
7+
import path from "path";
58

6-
export class CompletionItems implements CompletionItemProvider {
9+
export class CompletionItems extends Base implements CompletionItemProvider {
710
private fileList: DirectoryContent[] | undefined;
811
public completionItemList: CompletionItem[] = [];
912
public previousCompleteList: CompletionItem[] = [];
1013
// Condition for checkAndConfirm to work as expected
1114
private isDirectoryChanged: boolean = false;
1215

13-
private checkAndConfirm(item: string) {
16+
protected checkAndConfirm(item: string): boolean {
1417
if(this.isDirectoryChanged)
1518
return false;
1619
else {
1720
for(let i = 0; i < this.completionItemList.length; i ++)
18-
if(JSON.parse(JSON.stringify(this.completionItemList[i].label.valueOf()))["label"] === item)
21+
if(JSON.parse(JSON.stringify(this.completionItemList[i].label.valueOf())) === item)
1922
return true;
2023
return false;
2124
}
@@ -149,4 +152,35 @@ export class CompletionItems implements CompletionItemProvider {
149152
return false;
150153
}
151154
}
155+
}
156+
157+
export class RelativeVariableCompletionProvider extends Base implements CompletionItemProvider {
158+
public completionItemList: CompletionItem[] = [];
159+
160+
protected checkAndConfirm(item: string): boolean {
161+
for(let i = 0; i < this.completionItemList.length; i ++)
162+
if(JSON.parse(JSON.stringify(this.completionItemList[i].label.valueOf())) === item)
163+
return true;
164+
return false;
165+
}
166+
167+
provideCompletionItems(document: TextDocument, position: Position, token: CancellationToken, context: CompletionContext): ProviderResult<CompletionItem[] | CompletionList<CompletionItem>> {
168+
if(workspace.workspaceFolders) {
169+
if(document.fileName !== undefined) {
170+
var cjson = new Cjson(document.fileName);
171+
cjson.json?.getAllKeys().map((eachElem) => {
172+
if(! this.checkAndConfirm(eachElem))
173+
this.completionItemList.push(new CompletionItem(eachElem));
174+
});
175+
}
176+
else
177+
window.showErrorMessage("No CJSON file is opened");
178+
}
179+
else
180+
window.showErrorMessage("CJSON requires folder to be opened");
181+
return this.completionItemList;
182+
}
183+
resolveCompletionItem?(item: CompletionItem, token: CancellationToken): ProviderResult<CompletionItem> {
184+
return item;
185+
}
152186
}

cjson/src/definitions/register.ts

+15-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import * as vscode from 'vscode';
2-
import { CompletionItems } from './completion-items';
2+
import { CompletionItems, RelativeVariableCompletionProvider } from './completion-items';
33
import { GoToImportDefinition } from './goto-definition';
44
import fs from "fs";
55
import { Cjson } from "coded-json";
66

77
export class Registers {
88
static registerImportFilesCommand() {
99
let disposable = vscode.languages.registerCompletionItemProvider({language: "cjson", scheme: "file"},
10-
new CompletionItems(), ".", "/", "\\");
10+
new CompletionItems(), ".", "/", "\\", "$");
1111

1212
return disposable;
1313
}
@@ -20,10 +20,14 @@ export class Registers {
2020
}
2121

2222
static registerDeserializedPreviewView(nodePath: string) {
23-
let panel = vscode.window.createWebviewPanel("cjson.deseralizeAndPreview", "Deserialised " + nodePath.split("/")[nodePath.split("/").length - 1], {
24-
viewColumn: vscode.ViewColumn.One,
25-
preserveFocus: true
26-
});
23+
let panel = vscode.window.createWebviewPanel("cjson.deseralizeAndPreview", "Deserialised " + nodePath.split("/")[nodePath.split("/").length - 1],
24+
vscode.ViewColumn.One,
25+
{
26+
enableScripts: true,
27+
enableForms: true,
28+
enableCommandUris: true
29+
}
30+
);
2731
fs.readFile(nodePath, (err, data) => {
2832
if(err)
2933
vscode.window.showErrorMessage(err.message);
@@ -53,4 +57,9 @@ export class Registers {
5357
this.registerDeserializedPreviewView(node.path.substring(1));
5458
}, this);
5559
}
60+
61+
static registerRelativeVariableMappingCommand() {
62+
return vscode.languages.registerCompletionItemProvider({ language: "cjson", scheme: "file"},
63+
new RelativeVariableCompletionProvider(), "$");
64+
}
5665
}

cjson/src/extension.ts

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export function activate(context: vscode.ExtensionContext) {
88

99
let goToDefinition = Registers.registerGoToImportDefinitionCommand();
1010

11+
let relativeVariableMapping = Registers.registerRelativeVariableMappingCommand();
12+
1113
// let deseralizeAndPreview = Registers.registerDeseralizeAndPreviewCommand();
1214

1315
// disposable = cjsonRegisterDocumentLinkCommand();

npm/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
out/

0 commit comments

Comments
 (0)