Skip to content

Command to open compiled file #294

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 3, 2022
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 4 additions & 32 deletions client/src/commands.ts
Original file line number Diff line number Diff line change
@@ -1,40 +1,12 @@
import * as fs from "fs";
import { window, DiagnosticCollection } from "vscode";
import { LanguageClient, RequestType } from "vscode-languageclient/node";
import { DiagnosticCollection } from "vscode";

import {
DiagnosticsResultCodeActionsMap,
runDeadCodeAnalysisWithReanalyze,
} from "./commands/dead_code_analysis";

interface CreateInterfaceRequestParams {
uri: string;
}

let createInterfaceRequest = new RequestType<
CreateInterfaceRequestParams,
string,
void
>("rescript-vscode.create_interface");

export const createInterface = (client: LanguageClient) => {
if (!client) {
return window.showInformationMessage("Language server not running");
}

const editor = window.activeTextEditor;

if (!editor) {
return window.showInformationMessage("No active editor");
}

if (fs.existsSync(editor.document.uri.fsPath + "i")) {
return window.showInformationMessage("Interface file already exists");
}

client.sendRequest(createInterfaceRequest, {
uri: editor.document.uri.toString(),
});
};
export { createInterface } from "./commands/create_interface";
export { openCompiled } from "./commands/open_compiled";

export const deadCodeAnalysisWithReanalyze = (
targetDir: string | null,
Expand Down
33 changes: 33 additions & 0 deletions client/src/commands/create_interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import * as fs from "fs";
import { LanguageClient, RequestType } from "vscode-languageclient/node";
import { window } from "vscode";

interface CreateInterfaceRequestParams {
uri: string;
}

let createInterfaceRequest = new RequestType<
CreateInterfaceRequestParams,
string,
void
>("rescript-vscode.create_interface");

export const createInterface = (client: LanguageClient) => {
if (!client) {
return window.showInformationMessage("Language server not running");
}

const editor = window.activeTextEditor;

if (!editor) {
return window.showInformationMessage("No active editor");
}

if (fs.existsSync(editor.document.uri.fsPath + "i")) {
return window.showInformationMessage("Interface file already exists");
}

client.sendRequest(createInterfaceRequest, {
uri: editor.document.uri.toString(),
});
};
45 changes: 45 additions & 0 deletions client/src/commands/open_compiled.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import * as fs from "fs";
import { window, Uri, ViewColumn } from "vscode";
import { LanguageClient, RequestType } from "vscode-languageclient/node";

interface OpenCompiledFileRequestParams {
uri: string;
}

interface OpenCompiledFileResponseParams {
uri: string;
}

let openCompiledFileRequest = new RequestType<
OpenCompiledFileRequestParams,
OpenCompiledFileResponseParams,
void
>("rescript-vscode.open_compiled");

export const openCompiled = (client: LanguageClient) => {
if (!client) {
return window.showInformationMessage("Language server not running");
}

const editor = window.activeTextEditor;

if (!editor) {
return window.showInformationMessage("No active editor");
}

if (!fs.existsSync(editor.document.uri.fsPath)) {
return window.showInformationMessage("Compiled file does not exist");
}

client
.sendRequest(openCompiledFileRequest, {
uri: editor.document.uri.toString(),
})
.then((response) => {
const document = Uri.file(response.uri);

return window.showTextDocument(document, {
viewColumn: ViewColumn.Beside,
});
});
};
4 changes: 4 additions & 0 deletions client/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ export function activate(context: ExtensionContext) {
customCommands.createInterface(client);
});

commands.registerCommand("rescript-vscode.open_compiled", () => {
customCommands.openCompiled(client);
});

// Starts the dead code analysis mode.
commands.registerCommand("rescript-vscode.start_dead_code_analysis", () => {
// Save the directory this first ran from, and re-use that when continuously
Expand Down
15 changes: 15 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,26 @@
"command": "rescript-vscode.create_interface",
"title": "ReScript: Create an interface file for this implementation file."
},
{
"command": "rescript-vscode.open_compiled",
"category": "ReScript",
"title": "Open the compiled JS file for this implementation file.",
"icon": "$(output)"
},
{
"command": "rescript-vscode.start_dead_code_analysis",
"title": "ReScript: Start dead code analysis."
}
],
"menus": {
"editor/title": [
{
"command": "rescript-vscode.open_compiled",
"when": "editorLangId == rescript",
"group": "navigation"
}
]
},
"snippets": [
{
"language": "rescript",
Expand Down
4 changes: 4 additions & 0 deletions server/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,7 @@ export let resExt = ".res";
export let resiExt = ".resi";
export let cmiExt = ".cmi";
export let startBuildAction = "Start Build";

// bsconfig defaults according configuration schema (https://rescript-lang.org/docs/manual/latest/build-configuration-schema)
export let bsconfigModuleDefault = "commonjs";
export let bsconfigSuffixDefault = ".js";
74 changes: 72 additions & 2 deletions server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ let createInterfaceRequest =
string,
void>("rescript-vscode.create_interface");

interface OpenCompiledFileParams {
uri: string;
}

let openCompiledFileRequest = new v.RequestType<
OpenCompiledFileParams,
OpenCompiledFileParams,
void
>("rescript-vscode.open_compiled");

let sendUpdatedDiagnostics = () => {
projectsFiles.forEach(({ filesWithDiagnostics }, projectRootPath) => {
let content = fs.readFileSync(
Expand Down Expand Up @@ -120,7 +130,7 @@ let sendCompilationFinishedMessage = () => {
jsonrpc: c.jsonrpcVersion,
method: "rescript/compilationFinished",
};

send(notification);
};

Expand Down Expand Up @@ -548,7 +558,7 @@ function createInterface(msg: p.RequestMessage): m.Message {
return response;
}

let namespace = namespaceResult.result
let namespace = namespaceResult.result;
let suffixToAppend = namespace.length > 0 ? "-" + namespace : "";

let cmiPartialPath = path.join(
Expand Down Expand Up @@ -602,6 +612,64 @@ function createInterface(msg: p.RequestMessage): m.Message {
}
}

function openCompiledFile(msg: p.RequestMessage): m.Message {
let params = msg.params as OpenCompiledFileParams;
let filePath = fileURLToPath(params.uri);
let projDir = utils.findProjectRootOfFile(filePath);

if (projDir === null) {
let params: p.ShowMessageParams = {
type: p.MessageType.Error,
message: `Cannot locate project directory.`,
};

let response: m.NotificationMessage = {
jsonrpc: c.jsonrpcVersion,
method: "window/showMessage",
params: params,
};

return response;
}

let compiledFilePath = utils.getCompiledFilePath(filePath, projDir);

if (
compiledFilePath.kind === "error" ||
!fs.existsSync(compiledFilePath.result)
) {
let message =
compiledFilePath.kind === "success"
? `No compiled file found. Expected it at: ${compiledFilePath.result}`
: `No compiled file found. Please compile your project first.`;

let params: p.ShowMessageParams = {
type: p.MessageType.Error,
message,
};

let response: m.NotificationMessage = {
jsonrpc: c.jsonrpcVersion,
method: "window/showMessage",
params,
};

return response;
}

let result: OpenCompiledFileParams = {
uri: compiledFilePath.result,
};

let response: m.ResponseMessage = {
jsonrpc: c.jsonrpcVersion,
id: msg.id,
result,
};

return response;
}

function onMessage(msg: m.Message) {
if (m.isNotificationMessage(msg)) {
// notification message, aka the client ends it and doesn't want a reply
Expand Down Expand Up @@ -734,6 +802,8 @@ function onMessage(msg: m.Message) {
responses.forEach((response) => send(response));
} else if (msg.method === createInterfaceRequest.method) {
send(createInterface(msg));
} else if (msg.method === openCompiledFileRequest.method) {
send(openCompiledFile(msg));
} else {
let response: m.ResponseMessage = {
jsonrpc: c.jsonrpcVersion,
Expand Down
Loading