Skip to content

Commit

Permalink
Merge pull request #113 from mkslanc/semantic-tokens
Browse files Browse the repository at this point in the history
Semantic tokens support
  • Loading branch information
mkslanc committed Apr 17, 2024
2 parents f14e4fb + 01a3631 commit 20ab149
Show file tree
Hide file tree
Showing 44 changed files with 1,246 additions and 208 deletions.
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ languageProvider.registerEditor(editor);
[Example webworker.js with all services](https://github.com/mkslanc/ace-linters/blob/main/packages/demo/webworker-lsp/webworker.ts)
## New Features in 1.2.0
- add `setProviderOptions` method to `LanguageProvider` to set options for client.
- add experimental semantic tokens support (turned off by default). To turn on semantic tokens, set `semanticTokens` to
`true` in `setProviderOptions` method or use it in `create` or `fromCdn` methods like that
```javascript
LanguageProvider.create(worker, {functionality: {semanticTokens: true}})
```
## New Features in 1.0.0
- `registerServer` method in `ServiceManager` enables management of both services and servers on the web worker's side.
Expand Down
6 changes: 3 additions & 3 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
@@ -1,6 +1,6 @@
{
"name": "ace-linters-root",
"version": "1.1.3",
"version": "1.2.0",
"scripts": {
"build:ace-linters": "cd packages/ace-linters && npm run build",
"build:ace-sql-linter": "cd packages/ace-sql-linter && npm run build",
Expand Down
48 changes: 28 additions & 20 deletions packages/ace-linters/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ languageProvider.registerEditor(editor);
[Example webworker.js with all services](https://github.com/mkslanc/ace-linters/blob/main/packages/demo/webworker-lsp/webworker.ts)
## New Features in 1.2.0
- add `setProviderOptions` method to `LanguageProvider` to set options for client.
- add experimental semantic tokens support (turned off by default). To turn on semantic tokens, set `semanticTokens` to
`true` in `setProviderOptions` method or use it in `create` or `fromCdn` methods like that
```javascript
LanguageProvider.create(worker, {functionality: {semanticTokens: true}})
```
## New Features in 1.0.0
- `registerServer` method in `ServiceManager` enables management of both services and servers on the web worker's side.
Expand Down Expand Up @@ -73,16 +81,16 @@ languageProvider.registerEditor(editor);
<div id="editor" style="height: 100px">some text</div>

<script>
ace.require("ace/ext/language_tools"); //To allow autocompletion
var CssMode = ace.require("ace/mode/css").Mode;
var editor = ace.edit("editor", {
enableBasicAutocompletion: true,
enableLiveAutocompletion: true,
mode: new CssMode()
});

var provider = LanguageProvider.fromCdn("https://www.unpkg.com/ace-linters@latest/build/");
provider.registerEditor(editor);
ace.require("ace/ext/language_tools"); //To allow autocompletion
var CssMode = ace.require("ace/mode/css").Mode;
var editor = ace.edit("editor", {
enableBasicAutocompletion: true,
enableLiveAutocompletion: true,
mode: new CssMode()
});

var provider = LanguageProvider.fromCdn("https://www.unpkg.com/ace-linters@latest/build/");
provider.registerEditor(editor);
</script>
```
Expand All @@ -102,14 +110,14 @@ import {AceLanguageClient} from "ace-linters/build/ace-language-client";

// Create a web socket
const serverData = {
module: () => import("ace-linters/build/language-client"),
modes: "json|json5",
type: "socket",
socket: new WebSocket("ws://127.0.0.1:3000/exampleServer"), // address of your websocket server
module: () => import("ace-linters/build/language-client"),
modes: "json|json5",
type: "socket",
socket: new WebSocket("ws://127.0.0.1:3000/exampleServer"), // address of your websocket server
}
// Create an Ace editor
let editor = ace.edit("container", {
mode: new JSONMode() // Set the mode of the editor to JSON
mode: new JSONMode() // Set the mode of the editor to JSON
});

// Create a language provider for web socket
Expand All @@ -135,15 +143,15 @@ import {AceLanguageClient} from "ace-linters/build/ace-language-client";
// Create a web worker
let worker = new Worker(new URL('./webworker.js', import.meta.url));
const serverData = {
module: () => import("ace-linters/build/language-client"),
modes: "json",
type: "webworker",
worker: worker,
module: () => import("ace-linters/build/language-client"),
modes: "json",
type: "webworker",
worker: worker,
}

// Create an Ace editor
let editor = ace.edit("container", {
mode: new TypescriptMode() // Set the mode of the editor to Typescript
mode: new TypescriptMode() // Set the mode of the editor to Typescript
});

// Create a language provider for web worker
Expand Down
2 changes: 1 addition & 1 deletion packages/ace-linters/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ace-linters",
"author": "Azat Alimov <mkslanc@gmail.com>",
"version": "1.1.3",
"version": "1.2.0",
"scripts": {
"clean": "rimraf build",
"prebuild": "node prebuild.js",
Expand Down
27 changes: 20 additions & 7 deletions packages/ace-linters/src/cdn-worker.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import {ServiceStruct, SupportedServices} from "./types/language-service";

type IncludeLinters = Partial<{ [name in SupportedServices]: boolean | undefined }> | boolean;

function createWorkerBlob(cdnUrl: string, services: ServiceStruct[]) {
return new Blob([`
importScripts("${cdnUrl}/service-manager.js");
Expand All @@ -21,12 +23,16 @@ function createWorkerBlob(cdnUrl: string, services: ServiceStruct[]) {
export function createWorker(services: {
services: ServiceStruct[],
serviceManagerCdn: string
}, includeLinters?: { [name in SupportedServices]: boolean | undefined } | boolean): Worker
export function createWorker(cdnUrl: string, includeLinters?: { [name in SupportedServices]: boolean } | boolean): Worker
}, includeLinters?: IncludeLinters): Worker
export function createWorker(cdnUrl: string, includeLinters?: IncludeLinters): Worker
export function createWorker(source: string | {
services: ServiceStruct[],
serviceManagerCdn: string
}, includeLinters: { [name in SupportedServices]: boolean | undefined } | boolean = true) {
}, includeLinters?: IncludeLinters) {
if (includeLinters === undefined) {// if `includeLinters` is not defined, set it to true
includeLinters = true;
}

if (typeof Worker == "undefined") return {
postMessage: function () {
},
Expand All @@ -50,7 +56,7 @@ export function createWorker(source: string | {
return new Worker(blobURL);
}

function getServices(includeLinters: { [name in SupportedServices]: boolean | undefined } | boolean = true): ServiceStruct[] {
export function getServices(includeLinters?: IncludeLinters): ServiceStruct[] {
const allServices = [
{
name: "json",
Expand Down Expand Up @@ -113,7 +119,7 @@ function getServices(includeLinters: { [name in SupportedServices]: boolean | un
modes: "php",
},
{
name: "javascript",
name: "eslint",
script: "javascript-service.js",
className: "JavascriptService",
modes: "javascript",
Expand All @@ -126,11 +132,18 @@ function getServices(includeLinters: { [name in SupportedServices]: boolean | un
}
];

if (includeLinters === true) {
if (includeLinters === true || includeLinters === undefined) {
return allServices;
} else if (includeLinters === false) {
return [];
}

return allServices.filter(service => includeLinters[service.name]);
if (includeLinters.javascript) { // left for backward compatibility
includeLinters.eslint = includeLinters.javascript;
delete includeLinters.javascript;
}

return allServices.filter(service => {
return includeLinters[service.name]
});
}
2 changes: 1 addition & 1 deletion packages/ace-linters/src/components/signature-tooltip.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export class SignatureTooltip extends BaseTooltip {
};

provideSignatureHelp = () => {
if (!this.provider.options.functionality.signatureHelp)
if (!this.provider.options.functionality!.signatureHelp)
return;
let cursor = this.$activeEditor!.getCursorPosition();
let session = this.$activeEditor!.session;
Expand Down
Loading

0 comments on commit 20ab149

Please sign in to comment.