Skip to content

Commit 792a12e

Browse files
authored
Improve language configuration (#1311)
1 parent 3ffe5b7 commit 792a12e

12 files changed

+66
-79
lines changed

Diff for: package-lock.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/commands/compile.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ async function importFile(
143143
undefined,
144144
true
145145
);
146-
documentContentProvider.update(serverUri.with({ scheme: "objectscript" }));
146+
documentContentProvider.update(serverUri.with({ scheme: OBJECTSCRIPT_FILE_SCHEMA }));
147147
})
148148
.catch((error) => {
149149
if (error?.statusCode == 409) {

Diff for: src/commands/documaticPreviewPanel.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as vscode from "vscode";
22
import { classNameRegex } from "../utils";
3+
import { clsLangId } from "../extension";
34

45
/**
56
* The schema of the message that gets sent to the webview.
@@ -45,7 +46,7 @@ export class DocumaticPreviewPanel {
4546
return;
4647
}
4748
const openDoc = openEditor.document;
48-
if (openDoc.languageId !== "objectscript-class") {
49+
if (openDoc.languageId !== clsLangId) {
4950
// Documatic preview is for classes only
5051
return;
5152
}
@@ -278,7 +279,7 @@ export class DocumaticPreviewPanel {
278279

279280
vscode.window.onDidChangeActiveTextEditor(
280281
async (editor: vscode.TextEditor) => {
281-
if (editor !== undefined && editor.document.languageId === "objectscript-class") {
282+
if (editor !== undefined && editor.document.languageId === clsLangId) {
282283
// The new active editor is a class, so switch our preview to it
283284

284285
// Get the name of the current class

Diff for: src/commands/studioMigration.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import util = require("util");
44
import { gte } from "semver";
55

66
import { fileExists, outputChannel } from "../utils";
7+
import { clsLangId, cspLangId, incLangId, intLangId, macLangId } from "../extension";
78

89
/** Run a command using `node-cmd` and return a Promise */
910
const runCmd = util.promisify(cmd.run);
@@ -114,10 +115,10 @@ export async function loadStudioSnippets(): Promise<void> {
114115
// Use Language to determine the scope
115116
scope:
116117
parts[1] == "5"
117-
? "objectscript-csp"
118+
? cspLangId
118119
: parts[1] == "3"
119-
? "objectscript-class"
120-
: "objectscript,objectscript-int,objectscript-macros,objectscript-class,objectscript-csp",
120+
? clsLangId
121+
: `${macLangId},${intLangId},${incLangId},${clsLangId},${cspLangId}`,
121122
};
122123
}
123124
});

Diff for: src/commands/unitTest.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as vscode from "vscode";
22
import * as Atelier from "../api/atelier";
3-
import { extensionId, filesystemSchemas, lsExtensionId } from "../extension";
3+
import { clsLangId, extensionId, filesystemSchemas, lsExtensionId } from "../extension";
44
import { getFileText, methodOffsetToLine, outputChannel, stripClassMemberNameQuotes, uriIsParentOf } from "../utils";
55
import { fileSpecFromURI } from "../utils/FileProviderUtil";
66
import { AtelierAPI } from "../api";
@@ -998,7 +998,7 @@ export function setUpTestController(): vscode.Disposable[] {
998998
// Create the initial root items
999999
replaceRootTestItems(testController);
10001000

1001-
const openClass = vscode.workspace.textDocuments.find((d) => d.languageId == "objectscript-class");
1001+
const openClass = vscode.workspace.textDocuments.find((d) => d.languageId == clsLangId);
10021002
if (openClass) {
10031003
// Create TestItems for any test classes that are open at activation.
10041004
// Must be done after this extension activates because the resolve
@@ -1085,7 +1085,7 @@ export function setUpTestController(): vscode.Disposable[] {
10851085
vscode.workspace.onDidOpenTextDocument((document) => addItemForClassUri(testController, document.uri)),
10861086
vscode.workspace.onDidChangeTextDocument(async (e) => {
10871087
// If this is a test class, re-compute its TestItems
1088-
if (e.document.languageId == "objectscript-class") {
1088+
if (e.document.languageId == clsLangId) {
10891089
// Don't pass create flag because if it existed it would
10901090
// have been created already by the onDidOpen handler
10911091
const item = await getTestItemForClass(testController, e.document.uri);

Diff for: src/extension.ts

+23-19
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ export const schemas = [
1818
];
1919
export const filesystemSchemas = [FILESYSTEM_SCHEMA, FILESYSTEM_READONLY_SCHEMA];
2020

21+
export const clsLangId = "objectscript-class";
22+
export const macLangId = "objectscript";
23+
export const intLangId = "objectscript-int";
24+
export const incLangId = "objectscript-macros";
25+
export const cspLangId = "objectscript-csp";
26+
2127
import * as url from "url";
2228
import path = require("path");
2329
import {
@@ -717,35 +723,35 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
717723
}
718724
}),
719725
vscode.languages.registerHoverProvider(
720-
documentSelector("objectscript-class", "objectscript", "objectscript-int", "objectscript-macros"),
726+
documentSelector(clsLangId, macLangId, intLangId, incLangId),
721727
new ObjectScriptHoverProvider()
722728
),
723729
vscode.languages.registerDocumentFormattingEditProvider(
724-
documentSelector("objectscript-class", "objectscript", "objectscript-int", "objectscript-macros"),
730+
documentSelector(clsLangId, macLangId, intLangId, incLangId),
725731
new DocumentFormattingEditProvider()
726732
),
727733
vscode.languages.registerDocumentRangeFormattingEditProvider(
728-
documentSelector("objectscript-class", "objectscript", "objectscript-int", "objectscript-macros"),
734+
documentSelector(clsLangId, macLangId, intLangId, incLangId),
729735
new DocumentRangeFormattingEditProvider()
730736
),
731737
vscode.languages.registerDefinitionProvider(
732-
documentSelector("objectscript-class", "objectscript", "objectscript-int", "objectscript-macros"),
738+
documentSelector(clsLangId, macLangId, intLangId, incLangId),
733739
new ObjectScriptDefinitionProvider()
734740
),
735741
vscode.languages.registerCompletionItemProvider(
736-
documentSelector("objectscript-class", "objectscript", "objectscript-int", "objectscript-macros"),
742+
documentSelector(clsLangId, macLangId, intLangId, incLangId),
737743
new ObjectScriptCompletionItemProvider(),
738744
"$",
739745
"^",
740746
".",
741747
"#"
742748
),
743749
vscode.languages.registerDocumentSymbolProvider(
744-
documentSelector("objectscript-class"),
750+
documentSelector(clsLangId),
745751
new ObjectScriptClassSymbolProvider()
746752
),
747753
vscode.languages.registerDocumentSymbolProvider(
748-
documentSelector("objectscript", "objectscript-int"),
754+
documentSelector(macLangId, intLangId),
749755
new ObjectScriptRoutineSymbolProvider()
750756
)
751757
);
@@ -756,11 +762,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
756762
if (semver.lt(lsVersion, "1.0.5")) {
757763
context.subscriptions.push(
758764
vscode.languages.registerFoldingRangeProvider(
759-
documentSelector("objectscript-class"),
765+
documentSelector(clsLangId),
760766
new ObjectScriptClassFoldingRangeProvider()
761767
),
762768
vscode.languages.registerFoldingRangeProvider(
763-
documentSelector("objectscript", "objectscript-int"),
769+
documentSelector(macLangId, intLangId),
764770
new ObjectScriptFoldingRangeProvider()
765771
)
766772
);
@@ -1008,19 +1014,17 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
10081014
isCaseSensitive: true,
10091015
isReadonly: true,
10101016
}),
1011-
vscode.languages.setLanguageConfiguration("objectscript-class", getLanguageConfiguration("class")),
1012-
vscode.languages.setLanguageConfiguration("objectscript", getLanguageConfiguration("routine")),
1013-
vscode.languages.setLanguageConfiguration("objectscript-macros", getLanguageConfiguration("routine")),
1014-
vscode.languages.registerCodeActionsProvider(
1015-
documentSelector("objectscript-class", "objectscript"),
1016-
new CodeActionProvider()
1017-
),
1017+
vscode.languages.setLanguageConfiguration(clsLangId, getLanguageConfiguration(clsLangId)),
1018+
vscode.languages.setLanguageConfiguration(macLangId, getLanguageConfiguration(macLangId)),
1019+
vscode.languages.setLanguageConfiguration(incLangId, getLanguageConfiguration(incLangId)),
1020+
vscode.languages.setLanguageConfiguration(intLangId, getLanguageConfiguration(intLangId)),
1021+
vscode.languages.registerCodeActionsProvider(documentSelector(clsLangId, macLangId), new CodeActionProvider()),
10181022
vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider()),
10191023
vscode.debug.registerDebugConfigurationProvider("objectscript", new ObjectScriptConfigurationProvider()),
10201024
vscode.debug.registerDebugAdapterDescriptorFactory("objectscript", debugAdapterFactory),
10211025
debugAdapterFactory,
10221026
vscode.languages.registerCodeLensProvider(
1023-
documentSelector("objectscript-class", "objectscript", "objectscript-int"),
1027+
documentSelector(clsLangId, macLangId, intLangId),
10241028
new ObjectScriptCodeLensProvider()
10251029
),
10261030
vscode.commands.registerCommand("vscode-objectscript.compileOnly", () => compileOnly(false)),
@@ -1074,7 +1078,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
10741078
);
10751079
}),
10761080
vscode.window.onDidChangeActiveTextEditor((editor: vscode.TextEditor) => {
1077-
if (config("openClassContracted") && editor && editor.document.languageId === "objectscript-class") {
1081+
if (config("openClassContracted") && editor && editor.document.languageId === clsLangId) {
10781082
const uri: string = editor.document.uri.toString();
10791083
if (!openedClasses.includes(uri)) {
10801084
vscode.commands.executeCommand("editor.foldLevel1");
@@ -1237,7 +1241,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
12371241
vscode.window.onDidChangeTextEditorSelection((event: vscode.TextEditorSelectionChangeEvent) => {
12381242
posPanel.text = "";
12391243
const document = event.textEditor.document;
1240-
if (!["objectscript", "objectscript-int"].includes(document.languageId)) {
1244+
if (![macLangId, intLangId].includes(document.languageId)) {
12411245
return;
12421246
}
12431247
if (event.selections.length > 1 || !event.selections[0].isEmpty) {

Diff for: src/languageConfiguration.ts

+15-35
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,32 @@
1-
import { IndentAction, LanguageConfiguration } from "vscode";
1+
import * as vscode from "vscode";
22

3-
export const WORD_PATTERN =
4-
/((?<=(class|extends|as|of) )(%?\b[a-z0-9]+(\.[a-z0-9]+)*\b))|(\^[a-z0-9]+(\.[a-z0-9]+)*)|((\${1,3}|[irm]?%|\^|#)?[a-z0-9]+)/i;
5-
6-
export function getLanguageConfiguration(lang: string): LanguageConfiguration {
3+
export function getLanguageConfiguration(lang: string): vscode.LanguageConfiguration {
74
return {
8-
wordPattern: WORD_PATTERN,
5+
wordPattern:
6+
/((?<=(class|extends|as|of) )(%?\b[a-z0-9]+(\.[a-z0-9]+)*\b))|(\^[a-z0-9]+(\.[a-z0-9]+)*)|((\${1,3}|[irm]?%|\^|#)?[a-z0-9]+)/i,
97
brackets: [
108
["{", "}"],
119
["(", ")"],
1210
],
1311
comments: {
14-
lineComment: lang === "class" ? "//" : "#;",
12+
lineComment: ["objectscript-class", "objectscript-int"].includes(lang) ? "//" : "#;",
1513
blockComment: ["/*", "*/"],
1614
},
15+
autoClosingPairs: [
16+
{
17+
open: "/*",
18+
close: "*/",
19+
notIn: [vscode.SyntaxTokenType.Comment, vscode.SyntaxTokenType.String, vscode.SyntaxTokenType.RegEx],
20+
},
21+
],
1722
onEnterRules:
18-
lang === "class"
23+
lang == "objectscript-class"
1924
? [
2025
{
2126
beforeText: /^\/\/\//,
22-
action: { indentAction: IndentAction.None, appendText: "/// " },
27+
action: { indentAction: vscode.IndentAction.None, appendText: "/// " },
2328
},
2429
]
25-
: [
26-
{
27-
beforeText: /^\s*\/\/\//,
28-
action: { indentAction: IndentAction.None, appendText: "/// " },
29-
},
30-
{
31-
beforeText: /^\s+\/\/[^/]?/,
32-
action: { indentAction: IndentAction.None, appendText: "// " },
33-
},
34-
{
35-
beforeText: /^\s+;;/,
36-
action: { indentAction: IndentAction.None, appendText: ";; " },
37-
},
38-
{
39-
beforeText: /^\s+;[^;]?/,
40-
action: { indentAction: IndentAction.None, appendText: "; " },
41-
},
42-
{
43-
beforeText: /^\s*#;/,
44-
action: { indentAction: IndentAction.None, appendText: "#; " },
45-
},
46-
{
47-
beforeText: /^\s*##;/,
48-
action: { indentAction: IndentAction.None, appendText: "##; " },
49-
},
50-
],
30+
: undefined,
5131
};
5232
}

Diff for: src/providers/FileDecorationProvider.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as vscode from "vscode";
22
import { currentFile } from "../utils";
3+
import { clsLangId, cspLangId, intLangId, macLangId } from "../extension";
34

45
export class FileDecorationProvider implements vscode.FileDecorationProvider {
56
private _genBadge = String.fromCharCode(9965); // Gear
@@ -20,13 +21,13 @@ export class FileDecorationProvider implements vscode.FileDecorationProvider {
2021
if (
2122
doc != undefined &&
2223
!doc.isUntitled &&
23-
["objectscript", "objectscript-class", "objectscript-int", "objectscript-macros"].includes(doc.languageId) &&
24+
[clsLangId, macLangId, intLangId, cspLangId].includes(doc.languageId) &&
2425
vscode.workspace
2526
.getConfiguration("objectscript", vscode.workspace.getWorkspaceFolder(uri))
2627
.get<boolean>("showGeneratedFileDecorations")
2728
) {
2829
// Use the file's contents to check if it's generated
29-
if (doc.languageId == "objectscript-class") {
30+
if (doc.languageId == clsLangId) {
3031
for (let line = 0; line < doc.lineCount; line++) {
3132
const lineText = doc.lineAt(line).text;
3233
if (lineText.startsWith("Class ")) {
@@ -51,7 +52,7 @@ export class FileDecorationProvider implements vscode.FileDecorationProvider {
5152
tooltip += ` by ${macMatch[1]}.cls`;
5253
} else if (intMatch) {
5354
tooltip += ` by ${intMatch[1]}.cls`;
54-
} else if (doc.languageId == "objectscript-int") {
55+
} else if (doc.languageId == intLangId) {
5556
tooltip += ` by ${file.slice(0, -3)}mac`;
5657
}
5758
}

Diff for: src/providers/FileSystemProvider/FileSystemProvider.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
redirectDotvscodeRoot,
1414
workspaceFolderOfUri,
1515
} from "../../utils/index";
16-
import { config, workspaceState } from "../../extension";
16+
import { config, intLangId, macLangId, workspaceState } from "../../extension";
1717
import { addIsfsFileToProject, modifyProject } from "../../commands/project";
1818
import { DocumentContentProvider } from "../DocumentContentProvider";
1919
import { Document } from "../../api/atelier";
@@ -80,7 +80,7 @@ export function generateFileContent(
8080
const routineName = fileName.split(".").slice(0, -1).join(".");
8181
const routineType = fileExt != "mac" ? `[Type=${fileExt.toUpperCase()}]` : "";
8282
if (sourceLines.length === 0 && fileExt !== "inc") {
83-
const languageId = fileExt === "mac" ? "objectscript" : "objectscript-int";
83+
const languageId = fileExt === "mac" ? macLangId : intLangId;
8484

8585
// Labels cannot contain dots
8686
const firstLabel = routineName.replaceAll(".", "");

Diff for: src/providers/ObjectScriptCodeLensProvider.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as vscode from "vscode";
2-
import { config } from "../extension";
2+
import { clsLangId, config, intLangId, macLangId } from "../extension";
33
import { currentFile } from "../utils";
44
import { AtelierAPI } from "../api";
55

@@ -8,10 +8,10 @@ export class ObjectScriptCodeLensProvider implements vscode.CodeLensProvider {
88
document: vscode.TextDocument,
99
token: vscode.CancellationToken
1010
): vscode.ProviderResult<vscode.CodeLens[]> {
11-
if (document.languageId == "objectscript-class") {
11+
if (document.languageId == clsLangId) {
1212
return this.classMembers(document);
1313
}
14-
if (["objectscript", "objectscript-int"].includes(document.languageId)) {
14+
if ([macLangId, intLangId].includes(document.languageId)) {
1515
return this.routineLabels(document);
1616
}
1717
return [];

Diff for: src/providers/RuleEditorProvider.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as vscode from "vscode";
22
import { AtelierAPI } from "../api";
33
import { loadChanges } from "../commands/compile";
44
import { StudioActions } from "../commands/studio";
5-
import { cspApps } from "../extension";
5+
import { clsLangId, cspApps } from "../extension";
66
import { currentFile, outputChannel } from "../utils";
77

88
/**
@@ -28,7 +28,7 @@ export class RuleEditorProvider implements vscode.CustomTextEditorProvider {
2828
token: vscode.CancellationToken
2929
): Promise<void> {
3030
// Check that document is a clean, well-formed class
31-
if (document.languageId != "objectscript-class") {
31+
if (document.languageId != clsLangId) {
3232
return RuleEditorProvider._errorMessage(`${document.fileName} is not a class.`);
3333
}
3434
if (document.isUntitled) {

Diff for: src/web-extension.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
2323
documentSelector("objectscript"),
2424
new ObjectScriptRoutineSymbolProvider()
2525
),
26-
vscode.languages.setLanguageConfiguration("objectscript-class", getLanguageConfiguration("class")),
27-
vscode.languages.setLanguageConfiguration("objectscript", getLanguageConfiguration("routine")),
28-
vscode.languages.setLanguageConfiguration("objectscript-int", getLanguageConfiguration("routine")),
29-
vscode.languages.setLanguageConfiguration("objectscript-macros", getLanguageConfiguration("routine"))
26+
vscode.languages.setLanguageConfiguration("objectscript-class", getLanguageConfiguration("objectscript-class")),
27+
vscode.languages.setLanguageConfiguration("objectscript", getLanguageConfiguration("objectscript")),
28+
vscode.languages.setLanguageConfiguration("objectscript-int", getLanguageConfiguration("objectscript-int")),
29+
vscode.languages.setLanguageConfiguration("objectscript-macros", getLanguageConfiguration("objectscript-macros"))
3030
);
3131
}
3232

0 commit comments

Comments
 (0)