Skip to content
This repository was archived by the owner on Aug 31, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
2 changes: 1 addition & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ trim_trailing_whitespace = true
insert_final_newline = true

[*.js]
indent_style = space
indent_style = tab
indent_size = 2
1 change: 0 additions & 1 deletion completion

This file was deleted.

270 changes: 135 additions & 135 deletions packages/@romejs-integration/vscode/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
*/

import {
LanguageClient,
LanguageClientOptions,
ServerOptions,
TransportKind,
LanguageClient,
LanguageClientOptions,
ServerOptions,
TransportKind,
} from 'vscode-languageclient';
// rome-ignore resolver/notFound
import * as vscode from 'vscode';
Expand All @@ -22,151 +22,151 @@ import os = require('os');
let client: LanguageClient;

function crawl(root: string): Iterable<string> {
return {
[Symbol.iterator]() {
return {
next() {
const value = root;
root = path.dirname(value);

return {
value,
done: root === '.' || root === '/',
};
},
};
},
};
return {
[Symbol.iterator]() {
return {
next() {
const value = root;
root = path.dirname(value);

return {
value,
done: root === '.' || root === '/',
};
},
};
},
};
}

async function tryChain(
root: string,
suffix: string,
root: string,
suffix: string,
): Promise<undefined | string> {
for (const dir of crawl(root)) {
const possible = path.join(dir, suffix);

try {
await fs.promises.access(possible);
return possible;
} catch (err) {
}
}
return undefined;
for (const dir of crawl(root)) {
const possible = path.join(dir, suffix);

try {
await fs.promises.access(possible);
return possible;
} catch (err) {
}
}
return undefined;
}

async function tryManifest(root: string): Promise<undefined | string> {
for (const dir of crawl(root)) {
const manifestLoc = path.join(dir, 'package.json');

try {
const content = await fs.promises.readFile(manifestLoc, 'utf8');
const json = JSON.parse(content);
if (json.romeLSPBin) {
return String(path.resolve(dir, json.romeLSPBin));
}
} catch (err) {
if (err instanceof SyntaxError || err.code === 'ENOENT') {
continue;
} else {
throw err;
}
}
}
return undefined;
for (const dir of crawl(root)) {
const manifestLoc = path.join(dir, 'package.json');

try {
const content = await fs.promises.readFile(manifestLoc, 'utf8');
const json = JSON.parse(content);
if (json.romeLSPBin) {
return String(path.resolve(dir, json.romeLSPBin));
}
} catch (err) {
if (err instanceof SyntaxError || err.code === 'ENOENT') {
continue;
} else {
throw err;
}
}
}
return undefined;
}

async function getRomeLocation(): Promise<undefined | string> {
const {workspaceFolders} = vscode.workspace;
if (workspaceFolders === undefined) {
return undefined;
}

// Find relative to workspace folders
for (const {uri} of workspaceFolders) {
if (uri.scheme === 'file') {
const manifest = await tryManifest(uri.path);
if (manifest !== undefined) {
return manifest;
}

const nodeModules = await tryChain(uri.path, `node_modules/rome/index.js`);
if (nodeModules !== undefined) {
return nodeModules;
}
}
}

// Find development build
try {
const possible = path.join(os.tmpdir(), 'rome-dev', 'index.js');
await fs.promises.access(possible);
return possible;
} catch (err) {
}

return undefined;
const {workspaceFolders} = vscode.workspace;
if (workspaceFolders === undefined) {
return undefined;
}

// Find relative to workspace folders
for (const {uri} of workspaceFolders) {
if (uri.scheme === 'file') {
const manifest = await tryManifest(uri.path);
if (manifest !== undefined) {
return manifest;
}

const nodeModules = await tryChain(uri.path, `node_modules/rome/index.js`);
if (nodeModules !== undefined) {
return nodeModules;
}
}
}

// Find development build
try {
const possible = path.join(os.tmpdir(), 'rome-dev', 'index.js');
await fs.promises.access(possible);
return possible;
} catch (err) {
}

return undefined;
}

export async function activate() {
const outputChannel = vscode.window.createOutputChannel('Rome');

function log(message: string) {
outputChannel.appendLine(message);
}

let romePath: undefined | string = await getRomeLocation();

// If no romePath was found then watch workspace folders until we find one
if (romePath === undefined) {
log(
'No Rome path found. Waiting for workspace folder changes before trying again',
);

await new Promise((resolve) => {
const event = vscode.workspace.onDidChangeWorkspaceFolders(() => {
getRomeLocation().then((filename) => {
if (filename !== undefined) {
romePath = filename;
event.dispose();
resolve();
}
});
});
});
}

if (romePath === undefined) {
throw new Error('Should have been defined');
}

log(`Discovered Rome path ${romePath}`);

let serverOptions: ServerOptions = {
module: romePath,
args: ['lsp'],
transport: TransportKind.stdio,
};

let clientOptions: LanguageClientOptions = {
outputChannel,
documentSelector: [
{scheme: 'file', language: 'javascript'},
{scheme: 'file', language: 'javascriptreact'},
{scheme: 'file', language: 'typescript'},
{scheme: 'file', language: 'typescriptreact'},
{scheme: 'file', language: 'json'},
],
};

client = new LanguageClient('rome', 'Rome', serverOptions, clientOptions);

client.start();
const outputChannel = vscode.window.createOutputChannel('Rome');

function log(message: string) {
outputChannel.appendLine(message);
}

let romePath: undefined | string = await getRomeLocation();

// If no romePath was found then watch workspace folders until we find one
if (romePath === undefined) {
log(
'No Rome path found. Waiting for workspace folder changes before trying again',
);

await new Promise((resolve) => {
const event = vscode.workspace.onDidChangeWorkspaceFolders(() => {
getRomeLocation().then((filename) => {
if (filename !== undefined) {
romePath = filename;
event.dispose();
resolve();
}
});
});
});
}

if (romePath === undefined) {
throw new Error('Should have been defined');
}

log(`Discovered Rome path ${romePath}`);

let serverOptions: ServerOptions = {
module: romePath,
args: ['lsp'],
transport: TransportKind.stdio,
};

let clientOptions: LanguageClientOptions = {
outputChannel,
documentSelector: [
{scheme: 'file', language: 'javascript'},
{scheme: 'file', language: 'javascriptreact'},
{scheme: 'file', language: 'typescript'},
{scheme: 'file', language: 'typescriptreact'},
{scheme: 'file', language: 'json'},
],
};

client = new LanguageClient('rome', 'Rome', serverOptions, clientOptions);

client.start();
}

export function deactivate(): Thenable<void> | undefined {
if (!client) {
return undefined;
}
return client.stop();
if (!client) {
return undefined;
}
return client.stop();
}
Loading