Skip to content
This repository has been archived by the owner on Aug 10, 2024. It is now read-only.

Commit

Permalink
ALS-1699: add semantic extension configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
llibarona committed Oct 5, 2021
1 parent 82e8a18 commit 6e8bd83
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 30 deletions.
27 changes: 27 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,23 @@
"light": "path/to/light/icon.svg",
"dark": "path/to/dark/icon.svg"
}
},{
"command": "als.registerSemantic",
"title": "Register Semantic",
"category": "Modifications",
"icon": {
"light": "path/to/light/icon.svg",
"dark": "path/to/dark/icon.svg"
}
},
{
"command": "als.unregisterSemantic",
"title": "Unregister Semantic",
"category": "Modifications",
"icon": {
"light": "path/to/light/icon.svg",
"dark": "path/to/dark/icon.svg"
}
},
{
"command": "als.restart",
Expand Down Expand Up @@ -256,6 +273,16 @@
"when": "resourceLangId == aml",
"command": "als.unregisterProfile",
"group": "7_modification"
},
{
"when": "resourceLangId == aml",
"command": "als.registerSemantic",
"group": "7_modification"
},
{
"when": "resourceLangId == aml",
"command": "als.unregisterSemantic",
"group": "7_modification"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion src/server/als.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { ExecuteCommandRequest, StateChangeEvent } from 'vscode-languageclient';
import { notifyConfig } from './alsConfiguration';
import { FormattingProvider, LANGUAGE_ID } from '../language';
import { LanguageClient } from 'vscode-languageclient/node';
import { conversionHandler, registerProfileHandler, renameFileHandler, serializationHandler, unregisterProfileHandler } from './handlers';
import { conversionHandler, registerProfileHandler, registerSemanticHandler, renameFileHandler, serializationHandler, unregisterProfileHandler, unregisterSemanticHandler } from './handlers';
import { ConfigurationViewProvider } from '../ui/configurationView';
import { SettingsManager } from '../settings';
import { Disposable } from 'vscode';
Expand All @@ -22,6 +22,8 @@ export class AlsLanguageClient {
this.disposable(vscode.commands.registerCommand("als.serialization", serializationHandler(this)))
this.disposable(vscode.commands.registerCommand("als.registerProfile", registerProfileHandler(this)))
this.disposable(vscode.commands.registerCommand("als.unregisterProfile", unregisterProfileHandler(this)))
this.disposable(vscode.commands.registerCommand("als.registerSemantic", registerSemanticHandler(this)))
this.disposable(vscode.commands.registerCommand("als.unregisterSemantic", unregisterSemanticHandler(this)))
this.disposable(this.languageClient.onDidChangeState(this.languageClientStateListener))
this.disposable(vscode.languages.registerDocumentFormattingEditProvider(LANGUAGE_ID, new FormattingProvider(languageClient)))
this.disposable(vscode.languages.registerDocumentRangeFormattingEditProvider(LANGUAGE_ID, new FormattingProvider(languageClient)))
Expand Down
74 changes: 50 additions & 24 deletions src/server/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,37 +6,31 @@ import {alsLog} from "../extension"

export const registerProfileHandler = (als: AlsLanguageClient) => {
return (fileUri: vscode.Uri) => {
alsLog.appendLine("Registering profile " + fileUri)
const uri = als.languageClient.code2ProtocolConverter.asUri(fileUri)
als.getWorkspaceConfiguration(uri).then(workspaceConfig => {
const newWorkspaceConfig: DidChangeConfigurationNotificationParams = {
mainUri: workspaceConfig.configuration.mainUri,
folder: uri,
dependencies: [...workspaceConfig.configuration.dependencies, {file: uri, scope: "custom-validation"}]
}
als.changeWorkspaceConfigurationCommand(newWorkspaceConfig);
})
const scopeName = "custom-validation"
registerDependency(als, fileUri, scopeName);
}
}

export const registerSemanticHandler = (als: AlsLanguageClient) => {
return (fileUri: vscode.Uri) => {
const scopeName = "semantic-extension"
registerDependency(als, fileUri, scopeName);
}
}

export const unregisterProfileHandler = (als: AlsLanguageClient) => {
return (fileUri: vscode.Uri) => {
alsLog.appendLine("Unregistering profile " + fileUri)
const uri = als.languageClient.code2ProtocolConverter.asUri(fileUri)
als.getWorkspaceConfiguration(uri).then(workspaceConfig => {
const newWorkspaceConfig: DidChangeConfigurationNotificationParams = {
mainUri: workspaceConfig.configuration.mainUri,
folder: uri,
dependencies: workspaceConfig.configuration.dependencies
.filter(v => {
!isDependencyConfiguration(v) || !(v.scope == "custom-validation" && v.file.toLowerCase() == uri.toLowerCase())
})
}
als.changeWorkspaceConfigurationCommand(newWorkspaceConfig);
})
const scopeName = "custom-validation"
unregisterDependency(scopeName, fileUri, als);
}
}

export const unregisterSemanticHandler = (als: AlsLanguageClient) => {
return (fileUri: vscode.Uri) => {
const scopeName = "semantic-extension"
unregisterDependency(scopeName, fileUri, als);
}
}

export const serializationHandler = (als: AlsLanguageClient) => {
return (fileUri: vscode.Uri) => {
Expand Down Expand Up @@ -98,4 +92,36 @@ export const conversionHandler = (als: AlsLanguageClient) => {
}
})
}
}
}

function unregisterDependency(scopeName: string, fileUri: vscode.Uri, als: AlsLanguageClient) {
alsLog.appendLine("Unregistering " + scopeName + " " + fileUri);
const uri = als.languageClient.code2ProtocolConverter.asUri(fileUri);
als.getWorkspaceConfiguration(uri).then(workspaceConfig => {
const newWorkspaceConfig: DidChangeConfigurationNotificationParams = {
mainUri: workspaceConfig.configuration.mainUri,
folder: uri,
dependencies: workspaceConfig.configuration.dependencies
.filter(v => {
// alsLog.appendLine("isDependencyConfiguration " + isDependencyConfiguration(v))
// alsLog.appendLine("scope and uri " + (!isDependencyConfiguration(v) || !(v.scope == scopeName && v.file.toLowerCase() == uri.toLowerCase())))
return !isDependencyConfiguration(v) || !(v.scope == scopeName && v.file.toLowerCase() == uri.toLowerCase());
})
};

als.changeWorkspaceConfigurationCommand(newWorkspaceConfig);
});
}

function registerDependency(als: AlsLanguageClient, fileUri: vscode.Uri, scopeName: string) {
alsLog.appendLine("Registering " + scopeName + " " + fileUri)
const uri = als.languageClient.code2ProtocolConverter.asUri(fileUri);
als.getWorkspaceConfiguration(uri).then(workspaceConfig => {
const newWorkspaceConfig: DidChangeConfigurationNotificationParams = {
mainUri: workspaceConfig.configuration.mainUri,
folder: uri,
dependencies: [...workspaceConfig.configuration.dependencies, { file: uri, scope: scopeName }]
};
als.changeWorkspaceConfigurationCommand(newWorkspaceConfig);
});
}
18 changes: 13 additions & 5 deletions src/ui/configurationView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,21 @@ export class ConfigurationViewProvider implements vscode.TreeDataProvider<Worksp
return resolve([new MainFileEntry(element.configuration.configuration.mainUri)])
}
if(element.configuration.configuration.dependencies.filter(isDependencyConfiguration).filter(v => v.scope == "custom-validation").length > 0) {
result.push(new ProfileHolderEntry("Profiles", vscode.TreeItemCollapsibleState.Collapsed, element.configuration))
result.push(new DependencyHolderEntry("Profiles", vscode.TreeItemCollapsibleState.Collapsed, element.configuration))
}
if(element.configuration.configuration.dependencies.filter(isDependencyConfiguration).filter(v => v.scope == "semantic-extension").length > 0) {
result.push(new DependencyHolderEntry("Extensions", vscode.TreeItemCollapsibleState.Collapsed, element.configuration))
}
return resolve(result);
} else if(element && element instanceof ProfileHolderEntry){
} else if(element && element instanceof DependencyHolderEntry && element.label == "Profiles"){
return resolve(element.configuration.configuration.dependencies.filter(isDependencyConfiguration).filter(v => v.scope == "custom-validation").map(profile => {
console.log(element.iconPath);
return new ProfileEntry(profile.file, vscode.TreeItemCollapsibleState.None, element.configuration)
return new DependencyEntry(profile.file, vscode.TreeItemCollapsibleState.None, element.configuration)
}))
} else if(element && element instanceof DependencyHolderEntry && element.label == "Extensions"){
return resolve(element.configuration.configuration.dependencies.filter(isDependencyConfiguration).filter(v => v.scope == "semantic-extension").map(profile => {
console.log(element.iconPath);
return new DependencyEntry(profile.file, vscode.TreeItemCollapsibleState.None, element.configuration)
}))
} else {
return resolve(Promise.all(this.workspaces.map<Promise<WorkspaceConfigurationEntry>>(async ws => {
Expand Down Expand Up @@ -81,7 +89,7 @@ class WorkspaceConfigurationParent extends WorkspaceConfigurationEntry {
}
}

class ProfileHolderEntry extends WorkspaceConfigurationEntry {
class DependencyHolderEntry extends WorkspaceConfigurationEntry {
constructor(
public readonly label: string,
public readonly collapsibleState: vscode.TreeItemCollapsibleState,
Expand All @@ -98,7 +106,7 @@ class ProfileHolderEntry extends WorkspaceConfigurationEntry {
};
}

class ProfileEntry extends WorkspaceConfigurationEntry {
class DependencyEntry extends WorkspaceConfigurationEntry {
constructor(
public readonly label: string,
public readonly collapsibleState: vscode.TreeItemCollapsibleState,
Expand Down

0 comments on commit 6e8bd83

Please sign in to comment.