mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
perf(lsp): simplify some of the startup code (#21538)
Remove some dead code in "99_main_compiler.js". Eagerly start the LSP TSC host, it was adding some not needed complexity around the TSC thread code.
This commit is contained in:
parent
6bdf2388da
commit
7bf267c197
3 changed files with 15 additions and 26 deletions
|
@ -226,13 +226,9 @@ impl TsServer {
|
||||||
|
|
||||||
let runtime = create_basic_runtime();
|
let runtime = create_basic_runtime();
|
||||||
runtime.block_on(async {
|
runtime.block_on(async {
|
||||||
let mut started = false;
|
start_tsc(&mut ts_runtime, false).unwrap();
|
||||||
|
|
||||||
while let Some((req, state_snapshot, tx, token)) = rx.recv().await {
|
while let Some((req, state_snapshot, tx, token)) = rx.recv().await {
|
||||||
if !started {
|
|
||||||
// TODO(@kitsonk) need to reflect the debug state of the lsp here
|
|
||||||
start(&mut ts_runtime, false).unwrap();
|
|
||||||
started = true;
|
|
||||||
}
|
|
||||||
let value =
|
let value =
|
||||||
request(&mut ts_runtime, state_snapshot, req, token.clone());
|
request(&mut ts_runtime, state_snapshot, req, token.clone());
|
||||||
let was_sent = tx.send(value).is_ok();
|
let was_sent = tx.send(value).is_ok();
|
||||||
|
@ -3778,6 +3774,8 @@ impl TscSpecifierMap {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(bartlomieju): we have similar struct in `cli/tsc/mod.rs` - maybe at least change
|
||||||
|
// the name of the struct to avoid confusion?
|
||||||
struct State {
|
struct State {
|
||||||
last_id: usize,
|
last_id: usize,
|
||||||
performance: Arc<Performance>,
|
performance: Arc<Performance>,
|
||||||
|
@ -4057,7 +4055,7 @@ deno_core::extension!(deno_tsc,
|
||||||
|
|
||||||
/// Instruct a language server runtime to start the language server and provide
|
/// Instruct a language server runtime to start the language server and provide
|
||||||
/// it with a minimal bootstrap configuration.
|
/// it with a minimal bootstrap configuration.
|
||||||
fn start(runtime: &mut JsRuntime, debug: bool) -> Result<(), AnyError> {
|
fn start_tsc(runtime: &mut JsRuntime, debug: bool) -> Result<(), AnyError> {
|
||||||
let init_config = json!({ "debug": debug });
|
let init_config = json!({ "debug": debug });
|
||||||
let init_src = format!("globalThis.serverInit({init_config});");
|
let init_src = format!("globalThis.serverInit({init_config});");
|
||||||
|
|
||||||
|
|
|
@ -519,6 +519,7 @@ delete Object.prototype.__proto__;
|
||||||
if (logDebug) {
|
if (logDebug) {
|
||||||
debug(`host.fileExists("${specifier}")`);
|
debug(`host.fileExists("${specifier}")`);
|
||||||
}
|
}
|
||||||
|
// TODO(bartlomieju): is this assumption still valid?
|
||||||
// this is used by typescript to find the libs path
|
// this is used by typescript to find the libs path
|
||||||
// so we can completely ignore it
|
// so we can completely ignore it
|
||||||
return false;
|
return false;
|
||||||
|
@ -963,6 +964,9 @@ delete Object.prototype.__proto__;
|
||||||
* @param {number} id
|
* @param {number} id
|
||||||
* @param {any} data
|
* @param {any} data
|
||||||
*/
|
*/
|
||||||
|
// TODO(bartlomieju): this feels needlessly generic, both type chcking
|
||||||
|
// and language server use it with inefficient serialization. Id is not used
|
||||||
|
// anyway...
|
||||||
function respond(id, data = null) {
|
function respond(id, data = null) {
|
||||||
ops.op_respond({ id, data });
|
ops.op_respond({ id, data });
|
||||||
}
|
}
|
||||||
|
@ -1046,6 +1050,7 @@ delete Object.prototype.__proto__;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let hasStarted = false;
|
||||||
/** @param {{ debug: boolean; }} init */
|
/** @param {{ debug: boolean; }} init */
|
||||||
function serverInit({ debug: debugFlag }) {
|
function serverInit({ debug: debugFlag }) {
|
||||||
if (hasStarted) {
|
if (hasStarted) {
|
||||||
|
@ -1063,19 +1068,6 @@ delete Object.prototype.__proto__;
|
||||||
debug("serverRestart()");
|
debug("serverRestart()");
|
||||||
}
|
}
|
||||||
|
|
||||||
let hasStarted = false;
|
|
||||||
|
|
||||||
/** Startup the runtime environment, setting various flags.
|
|
||||||
* @param {{ debugFlag?: boolean; legacyFlag?: boolean; }} msg
|
|
||||||
*/
|
|
||||||
function startup({ debugFlag = false }) {
|
|
||||||
if (hasStarted) {
|
|
||||||
throw new Error("The compiler runtime already started.");
|
|
||||||
}
|
|
||||||
hasStarted = true;
|
|
||||||
setLogDebug(!!debugFlag, "TS");
|
|
||||||
}
|
|
||||||
|
|
||||||
// A build time only op that provides some setup information that is used to
|
// A build time only op that provides some setup information that is used to
|
||||||
// ensure the snapshot is setup properly.
|
// ensure the snapshot is setup properly.
|
||||||
/** @type {{ buildSpecifier: string; libs: string[]; nodeBuiltInModuleNames: string[] }} */
|
/** @type {{ buildSpecifier: string; libs: string[]; nodeBuiltInModuleNames: string[] }} */
|
||||||
|
@ -1161,7 +1153,6 @@ delete Object.prototype.__proto__;
|
||||||
// checking TypeScript.
|
// checking TypeScript.
|
||||||
/** @type {any} */
|
/** @type {any} */
|
||||||
const global = globalThis;
|
const global = globalThis;
|
||||||
global.startup = startup;
|
|
||||||
global.exec = exec;
|
global.exec = exec;
|
||||||
global.getAssets = getAssets;
|
global.getAssets = getAssets;
|
||||||
|
|
||||||
|
|
|
@ -326,6 +326,8 @@ pub struct Response {
|
||||||
pub stats: Stats,
|
pub stats: Stats,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(bartlomieju): we have similar struct in `tsc.rs` - maybe at least change
|
||||||
|
// the name of the struct to avoid confusion?
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct State {
|
struct State {
|
||||||
hash_data: u64,
|
hash_data: u64,
|
||||||
|
@ -764,6 +766,8 @@ struct RespondArgs {
|
||||||
pub stats: Stats,
|
pub stats: Stats,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(bartlomieju): this mechanism is questionable.
|
||||||
|
// Can't we use something more efficient here?
|
||||||
#[op2]
|
#[op2]
|
||||||
fn op_respond(state: &mut OpState, #[serde] args: RespondArgs) {
|
fn op_respond(state: &mut OpState, #[serde] args: RespondArgs) {
|
||||||
let state = state.borrow_mut::<State>();
|
let state = state.borrow_mut::<State>();
|
||||||
|
@ -822,7 +826,6 @@ pub fn exec(request: Request) -> Result<Response, AnyError> {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
let startup_source = ascii_str!("globalThis.startup({ legacyFlag: false })");
|
|
||||||
let request_value = json!({
|
let request_value = json!({
|
||||||
"config": request.config,
|
"config": request.config,
|
||||||
"debug": request.debug,
|
"debug": request.debug,
|
||||||
|
@ -841,9 +844,6 @@ pub fn exec(request: Request) -> Result<Response, AnyError> {
|
||||||
..Default::default()
|
..Default::default()
|
||||||
});
|
});
|
||||||
|
|
||||||
runtime
|
|
||||||
.execute_script(located_script_name!(), startup_source)
|
|
||||||
.context("Could not properly start the compiler runtime.")?;
|
|
||||||
runtime.execute_script(located_script_name!(), exec_source)?;
|
runtime.execute_script(located_script_name!(), exec_source)?;
|
||||||
|
|
||||||
let op_state = runtime.op_state();
|
let op_state = runtime.op_state();
|
||||||
|
@ -1007,7 +1007,7 @@ mod tests {
|
||||||
.execute_script_static(
|
.execute_script_static(
|
||||||
"<anon>",
|
"<anon>",
|
||||||
r#"
|
r#"
|
||||||
if (!(startup)) {
|
if (!(globalThis.exec)) {
|
||||||
throw Error("bad");
|
throw Error("bad");
|
||||||
}
|
}
|
||||||
console.log(`ts version: ${ts.version}`);
|
console.log(`ts version: ${ts.version}`);
|
||||||
|
|
Loading…
Add table
Reference in a new issue