Skip to content

Commit

Permalink
🐛 CoffeeScript: Fix completions provider
Browse files Browse the repository at this point in the history
  • Loading branch information
CosmoMyzrailGorynych committed May 19, 2024
1 parent f65de35 commit ad6ab86
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 28 deletions.
10 changes: 7 additions & 3 deletions src/js/3rdparty/mountMonaco.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ self.process.browser = true;
const typescriptTokenizer = require('src/node_requires/typescriptTokenizer.js').language;
// Extended coffeescript tokenizer & suggestions provider
const coffeescriptTokenizer = require('src/node_requires/coffeescriptTokenizer.js').language;
const coffeescriptSuggestions = require('src/node_requires/coffeescriptSuggestionProvider.js');
const {CompletionsProvider: CoffeeCompletionsProvider} = require('src/node_requires/coffeescriptSuggestionProvider');

themeManager.loadBuiltInThemes();
// To rollback to a default theme if the set one is inaccessible ⤵
Expand All @@ -46,8 +46,12 @@ monaco.editor.create(document.createElement('textarea'), {
setTimeout(() => {
monaco.languages.setMonarchTokensProvider('typescript', typescriptTokenizer);
monaco.languages.setMonarchTokensProvider('coffeescript', coffeescriptTokenizer);
monaco.languages.registerCompletionItemProvider('coffeescript', coffeescriptSuggestions.atCompletions);
window.signals.trigger('monacoBooted');
monaco.languages.typescript.getTypeScriptWorker()
.then((worker) => {
const coffeescriptSuggestions = new CoffeeCompletionsProvider(worker);
monaco.languages.registerCompletionItemProvider('coffeescript', coffeescriptSuggestions);
window.signals.trigger('monacoBooted');
});
}, 1000);

window.signals = window.signals || riot.observable({});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,6 @@
/* eslint-disable no-underscore-dangle */
const {languages} = monaco;

// The principle here is that we create an offscreen TypeScript document,
// put CoffeeScript statements into it with `@` replacement, and steal
// its code suggestions into another code editor.

const enslavedModel = monaco.editor.createModel('', 'typescript');
let workhorse;
languages.typescript.getTypeScriptWorker()
.then(worker => worker(enslavedModel.uri))
.then(service => {
workhorse = service;
});
import type Monaco from 'monaco-editor';
import type ts from 'typescript';

// There's definitely something not used in this list, but whatever
const workerToTSTypeMap = {
Expand All @@ -27,9 +16,19 @@ const workerToTSTypeMap = {
default: monaco.languages.CompletionItemKind.Text
};

module.exports.atCompletions = {
triggerCharacters: ['@', '.'],
provideCompletionItems: async (model, position) => {
// The principle here is that we create an offscreen TypeScript document,
// put CoffeeScript statements into it with `@` replacement, and steal
// its code suggestions into another code editor.
export class CompletionsProvider {
private _worker: (uri: string) => Promise<Monaco.languages.typescript.TypeScriptWorker>;
constructor(worker: (uri: string) => Promise<Monaco.languages.typescript.TypeScriptWorker>) {
this._worker = worker;
}
triggerCharacters = ['@', '.'];
completionsModel = monaco.editor.createModel('', 'typescript');
async provideCompletionItems(model: Monaco.editor.ITextModel & {
ctCodePrefix?: string;
}, position: Monaco.IPosition) {
const range = {
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
Expand All @@ -41,16 +40,18 @@ module.exports.atCompletions = {
if (currentLine.endsWith('@')) {
currentLine = currentLine.slice(0, -1) + 'this.';
}
currentLine = currentLine.split(' ').pop();
currentLine = currentLine.split(' ').pop()!;
// Add type definitions set by a code-editor-scriptable tag.
currentLine = (model.ctCodePrefix || 'function () {') + currentLine;
currentLine += '\n}';
const suggestPos = currentLine.length - 1;
enslavedModel.setValue(currentLine);
const completions = await workhorse.getCompletionsAtPosition(
enslavedModel.uri.toString(),
suggestPos
);
this.completionsModel.setValue(currentLine);
const client = await this._worker(this.completionsModel.uri.toString());
const completions: ts.CompletionInfo | undefined =
await client.getCompletionsAtPosition(
this.completionsModel.uri.toString(),
suggestPos
);
if (!completions) {
return {
suggestions: []
Expand All @@ -61,9 +62,10 @@ module.exports.atCompletions = {
.filter(completion => !completion.name.startsWith('_'))
.map(completion => ({
label: completion.name,
kind: workerToTSTypeMap[completion.kind] || workerToTSTypeMap.default,
kind: workerToTSTypeMap[completion.kind as keyof typeof workerToTSTypeMap] ||
workerToTSTypeMap.default,
insertText: completion.insertText || completion.name
}))
};
}
};
}
2 changes: 1 addition & 1 deletion src/riotTags/editors/script-editor.tag
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ script-editor.aPanel.aView.flexfix

this.convertCoffee = () => {
try {
const val = coffeescript.compile(this.codeEditor.getValue(), {
const val = compileCoffee(this.codeEditor.getValue(), {
bare: true,
sourcemaps: false
});
Expand Down

0 comments on commit ad6ab86

Please sign in to comment.