Skip to content

Commit 3f9be5e

Browse files
Don't crash when receiving null initializationOptions (#1043)
Fixes #1041.
1 parent 8875165 commit 3f9be5e

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

effekt/jvm/src/main/scala/effekt/Server.scala

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -505,10 +505,15 @@ class Server(config: EffektConfig, compileOnChange: Boolean=false) extends Langu
505505
// nested under an "effekt" key `{ "effekt": { "showIR": "core", ... } }`
506506
// The former is sent by the VSCode extension for `initializationOptions`,
507507
// the latter by newer extension versions for `workspace/didChangeConfiguration`.
508-
val newSettings = params.getSettings.asInstanceOf[JsonElement].getAsJsonObject
509-
this.settings = newSettings;
510-
if (newSettings == null) return
511-
val effektSection = newSettings.get("effekt")
508+
val newSettings = params.getSettings.asInstanceOf[JsonElement]
509+
// When the settings come via `initializationOptions`, they can be null as per the LSP spec.
510+
if (newSettings.isJsonNull) {
511+
this.settings = null;
512+
return;
513+
}
514+
val newSettingsObj = newSettings.getAsJsonObject
515+
this.settings = newSettingsObj;
516+
val effektSection = newSettingsObj.get("effekt")
512517
if (effektSection != null) {
513518
this.settings = effektSection
514519
}
@@ -521,18 +526,16 @@ class Server(config: EffektConfig, compileOnChange: Boolean=false) extends Langu
521526
//
522527

523528
def settingBool(name: String): Boolean = {
524-
if (settings == null) return false
529+
if (settings == null || settings.isJsonNull) return false
525530
val obj = settings.getAsJsonObject
526-
if (obj == null) return false
527531
val value = obj.get(name)
528532
if (value == null) return false
529533
value.getAsBoolean
530534
}
531535

532536
def settingString(name: String): Option[String] = {
533-
if (settings == null) return None
537+
if (settings == null || settings.isJsonNull) return None
534538
val obj = settings.getAsJsonObject
535-
if (obj == null) return None
536539
val value = obj.get(name)
537540
if (value == null) return None
538541
Some(value.getAsString)

effekt/jvm/src/test/scala/effekt/LSPTests.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ class LSPTests extends FunSuite {
102102
}
103103
}
104104

105+
// Regression test: https://github.com/effekt-lang/effekt/issues/1041
106+
test("Initialization with initializationOptions set to null does not crash") {
107+
withClientAndServer { (client, server) =>
108+
val params = new InitializeParams()
109+
params.setInitializationOptions(JsonParser.parseString("null"))
110+
server.initialize(params).get()
111+
}
112+
}
113+
105114
test("didOpen yields empty diagnostics") {
106115
withClientAndServer { (client, server) =>
107116
val didOpenParams = new DidOpenTextDocumentParams()

0 commit comments

Comments
 (0)