From 0de93e3dbdb068ccf60729231cf5c56fefc63be3 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Wed, 24 Jun 2026 18:04:56 +0200 Subject: [PATCH] IJPL-248476 fix and simplify JsonLazyParsing enabling GitOrigin-RevId: fcb584483499a68dece545f96321c8db52edb74a --- .../intellij/json/JsonNonLazyParsingTest.java | 3 +- .../com/intellij/json/JsonParsingTest.java | 9 ++++- .../JsonSortPropertiesIntentionTest.kt | 6 +-- .../intellij/json/json5/Json5ParsingTest.java | 5 ++- json/resources/intellij.json.xml | 4 ++ .../com/intellij/json/JsonElementFactory.kt | 14 +------ .../json/JsonRegistryLazyParsingVetoer.kt | 12 ++++++ json/syntax/BUILD.bazel | 5 +-- json/syntax/intellij.json.syntax.iml | 2 +- .../intellij/json/syntax/JsonLazyParsing.kt | 37 ++++++++++++++++--- .../json/syntax/JsonLazyParsingJvm.kt | 7 ---- .../json/syntax/JsonLazyParsingWasmJs.kt | 7 ---- 12 files changed, 69 insertions(+), 42 deletions(-) create mode 100644 json/src/com/intellij/json/JsonRegistryLazyParsingVetoer.kt delete mode 100644 json/syntax/srcJvm/com/intellij/json/syntax/JsonLazyParsingJvm.kt delete mode 100644 json/syntax/srcWasmJs/com/intellij/json/syntax/JsonLazyParsingWasmJs.kt diff --git a/json/backend/tests/test/com/intellij/json/JsonNonLazyParsingTest.java b/json/backend/tests/test/com/intellij/json/JsonNonLazyParsingTest.java index 96599c02955b..0e0d834a664a 100644 --- a/json/backend/tests/test/com/intellij/json/JsonNonLazyParsingTest.java +++ b/json/backend/tests/test/com/intellij/json/JsonNonLazyParsingTest.java @@ -1,6 +1,7 @@ // Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.json; +import com.intellij.json.syntax.JsonLazyParsingKt; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; @@ -29,6 +30,6 @@ public class JsonNonLazyParsingTest extends JsonParsingTest { @Override protected boolean isIgnore() { - return JsonElementFactory.getJsonLazyParsingIJ(); + return JsonLazyParsingKt.getJsonLazyParsing(); } } diff --git a/json/backend/tests/test/com/intellij/json/JsonParsingTest.java b/json/backend/tests/test/com/intellij/json/JsonParsingTest.java index ae5e127938f5..36789a10f211 100644 --- a/json/backend/tests/test/com/intellij/json/JsonParsingTest.java +++ b/json/backend/tests/test/com/intellij/json/JsonParsingTest.java @@ -3,6 +3,9 @@ package com.intellij.json; import com.intellij.json.psi.JsonElementTypeConverterFactory; import com.intellij.json.syntax.JsonLanguageDefinition; +import com.intellij.json.syntax.JsonLazyParsingKt; +import com.intellij.json.syntax.JsonLazyParsingVetoer; +import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.platform.syntax.psi.CommonElementTypeConverterFactory; import com.intellij.platform.syntax.psi.ElementTypeConverters; import com.intellij.platform.syntax.psi.LanguageSyntaxDefinitions; @@ -24,8 +27,12 @@ public class JsonParsingTest extends ParsingTestCase { addExplicitExtension(ElementTypeConverters.getInstance(), JsonLanguage.INSTANCE, new CommonElementTypeConverterFactory()); addExplicitExtension(ElementTypeConverters.getInstance(), JsonLanguage.INSTANCE, new JsonFileTypeConverterFactory()); addExplicitExtension(LanguageSyntaxDefinitions.getINSTANCE(), JsonLanguage.INSTANCE, new JsonLanguageDefinition()); + registerExtensionPoint(LAZY_PARSING_VETOER_EP, JsonLazyParsingVetoer.class); } + public static final ExtensionPointName LAZY_PARSING_VETOER_EP = + new ExtensionPointName<>("com.intellij.json.lazyParsingVetoer"); + public JsonParsingTest() { super("psi", "json", new JsonParserDefinition()); } @@ -43,7 +50,7 @@ public class JsonParsingTest extends ParsingTestCase { } protected boolean isIgnore() { - return !JsonElementFactory.getJsonLazyParsingIJ(); + return !JsonLazyParsingKt.getJsonLazyParsing(); } public void testKeywords() { diff --git a/json/backend/tests/test/com/intellij/json/intentions/JsonSortPropertiesIntentionTest.kt b/json/backend/tests/test/com/intellij/json/intentions/JsonSortPropertiesIntentionTest.kt index 59d7a97246ce..1b5a9ccf138c 100644 --- a/json/backend/tests/test/com/intellij/json/intentions/JsonSortPropertiesIntentionTest.kt +++ b/json/backend/tests/test/com/intellij/json/intentions/JsonSortPropertiesIntentionTest.kt @@ -2,8 +2,8 @@ package com.intellij.json.intentions import com.intellij.json.JsonBundle -import com.intellij.json.JsonElementFactory.JsonLazyParsingIJ import com.intellij.json.JsonTestCase +import com.intellij.json.syntax.JsonLazyParsing import org.junit.AssumptionViolatedException class JsonSortPropertiesIntentionTest : JsonTestCase() { @@ -20,12 +20,12 @@ class JsonSortPropertiesIntentionTest : JsonTestCase() { } fun testSortMalformedJson() { - if (!JsonLazyParsingIJ) throw AssumptionViolatedException("lazy pasting is off") + if (!JsonLazyParsing) throw AssumptionViolatedException("lazy pasting is off") doTest() } fun testSortMalformedJson_non_lazy() { - if (JsonLazyParsingIJ) throw AssumptionViolatedException("Lazy pasting is on") + if (JsonLazyParsing) throw AssumptionViolatedException("Lazy pasting is on") doTest() } diff --git a/json/backend/tests/test/com/intellij/json/json5/Json5ParsingTest.java b/json/backend/tests/test/com/intellij/json/json5/Json5ParsingTest.java index d135b0c9362b..f4b2b808c65b 100644 --- a/json/backend/tests/test/com/intellij/json/json5/Json5ParsingTest.java +++ b/json/backend/tests/test/com/intellij/json/json5/Json5ParsingTest.java @@ -1,9 +1,11 @@ -// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.json.json5; import com.intellij.json.JsonFileTypeConverterFactory; import com.intellij.json.JsonParserDefinition; +import com.intellij.json.JsonParsingTest; import com.intellij.json.psi.JsonElementTypeConverterFactory; +import com.intellij.json.syntax.JsonLazyParsingVetoer; import com.intellij.json.syntax.json5.Json5LanguageDefinition; import com.intellij.platform.syntax.psi.CommonElementTypeConverterFactory; import com.intellij.platform.syntax.psi.ElementTypeConverters; @@ -25,6 +27,7 @@ public class Json5ParsingTest extends ParsingTestCase { addExplicitExtension(ElementTypeConverters.getInstance(), Json5Language.INSTANCE, new CommonElementTypeConverterFactory()); addExplicitExtension(ElementTypeConverters.getInstance(), Json5Language.INSTANCE, new JsonFileTypeConverterFactory()); addExplicitExtension(LanguageSyntaxDefinitions.getINSTANCE(), Json5Language.INSTANCE, new Json5LanguageDefinition()); + registerExtensionPoint(JsonParsingTest.LAZY_PARSING_VETOER_EP, JsonLazyParsingVetoer.class); } @Override diff --git a/json/resources/intellij.json.xml b/json/resources/intellij.json.xml index 134fa5e938fe..2d4c6e0f608c 100644 --- a/json/resources/intellij.json.xml +++ b/json/resources/intellij.json.xml @@ -8,6 +8,9 @@ + @@ -25,6 +28,7 @@ language="JSON Lines"/> + diff --git a/json/src/com/intellij/json/JsonElementFactory.kt b/json/src/com/intellij/json/JsonElementFactory.kt index 038766abd9d9..c3524f8f90b5 100644 --- a/json/src/com/intellij/json/JsonElementFactory.kt +++ b/json/src/com/intellij/json/JsonElementFactory.kt @@ -15,7 +15,6 @@ import com.intellij.lang.tree.util.parents import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.Project -import com.intellij.openapi.util.registry.Registry import com.intellij.platform.syntax.CancellationProvider import com.intellij.platform.syntax.lexer.Lexer import com.intellij.platform.syntax.lexer.TokenList @@ -33,20 +32,11 @@ import com.intellij.psi.tree.IReparseableElementType object JsonElementFactory { @JvmStatic fun getType(name: String): IElementType = when (name) { - "OBJECT" -> if (JsonLazyParsingIJ) LAZY_OBJECT else OBJECT - "ARRAY" -> if (JsonLazyParsingIJ) LAZY_ARRAY else ARRAY + "OBJECT" -> if (JsonLazyParsing) LAZY_OBJECT else OBJECT + "ARRAY" -> if (JsonLazyParsing) LAZY_ARRAY else ARRAY else -> throw IllegalArgumentException(name) } - /** - * Handles lazy parsing switch of JSON files in IntelliJ platform. - * - * @see JsonLazyParsing - */ - @JvmStatic - val JsonLazyParsingIJ: Boolean = - JsonLazyParsing || Registry.get("json.lazy.parsing").isBoolean - private val LAZY_OBJECT: IElementType = lazyElementType( name = "OBJECT", createNode = { JsonLazyObjectImpl(it) }, diff --git a/json/src/com/intellij/json/JsonRegistryLazyParsingVetoer.kt b/json/src/com/intellij/json/JsonRegistryLazyParsingVetoer.kt new file mode 100644 index 000000000000..bff7e3eabc4b --- /dev/null +++ b/json/src/com/intellij/json/JsonRegistryLazyParsingVetoer.kt @@ -0,0 +1,12 @@ +// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.json + +import com.intellij.json.syntax.JsonLazyParsingVetoer +import com.intellij.openapi.util.registry.Registry + +/** + * Vetoes lazy parsing of JSON when the `json.lazy.parsing` registry flag is turned off. + */ +internal class JsonRegistryLazyParsingVetoer : JsonLazyParsingVetoer { + override fun isLazyParsingVetoed(): Boolean = !Registry.`is`("json.lazy.parsing", true) +} diff --git a/json/syntax/BUILD.bazel b/json/syntax/BUILD.bazel index fe84e05a3e6b..208539e31f27 100644 --- a/json/syntax/BUILD.bazel +++ b/json/syntax/BUILD.bazel @@ -23,9 +23,6 @@ jvm_library( "src/**/*.kt", "src/**/*.java", "src/**/*.form", - "srcJvm/**/*.kt", - "srcJvm/**/*.java", - "srcJvm/**/*.form", ], allow_empty = True, ), @@ -41,6 +38,7 @@ jvm_library( "@lib//:kotlin-stdlib", "//platform/syntax/syntax-api:syntax", "//platform/syntax/syntax-util:util", + "//platform/syntax/syntax-extensions:extensions", "@lib//:jetbrains-annotations", ":platform_multiplatformSupport_provided", ], @@ -61,6 +59,7 @@ jvm_library( ":syntax", "//platform/syntax/syntax-api:syntax_test_lib", "//platform/syntax/syntax-util:util_test_lib", + "//platform/syntax/syntax-extensions:extensions_test_lib", "//platform/multiplatformSupport", "//platform/multiplatformSupport:multiplatformSupport_test_lib", ], diff --git a/json/syntax/intellij.json.syntax.iml b/json/syntax/intellij.json.syntax.iml index aad405d2d68e..3134f2302cb4 100644 --- a/json/syntax/intellij.json.syntax.iml +++ b/json/syntax/intellij.json.syntax.iml @@ -21,7 +21,6 @@ - @@ -29,6 +28,7 @@ + diff --git a/json/syntax/src/com/intellij/json/syntax/JsonLazyParsing.kt b/json/syntax/src/com/intellij/json/syntax/JsonLazyParsing.kt index eb6695750a8a..f240da52c243 100644 --- a/json/syntax/src/com/intellij/json/syntax/JsonLazyParsing.kt +++ b/json/syntax/src/com/intellij/json/syntax/JsonLazyParsing.kt @@ -1,13 +1,38 @@ // Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.json.syntax -import fleet.util.multiplatform.linkToActual - -internal fun jsonLazyParsing(): Boolean = linkToActual() +import com.intellij.platform.syntax.extensions.ExtensionPointKey +import com.intellij.platform.syntax.extensions.currentExtensionSupport +import org.jetbrains.annotations.ApiStatus /** - * Handles lazy parsing switch of JSON files in syntax lib which has no dependency on IntelliJ platform. + * Implement this extension point to disable ("veto") lazy parsing of JSON. * - * @see jsonLazyParsingJvm, jsonLazyParsingWasmJs + * Lazy parsing is enabled by default and stays enabled unless some vetoer vetoes it. This is how the syntax lib, + * which has no dependency on the IntelliJ platform, learns about the IntelliJ-side `json.lazy.parsing` registry flag. */ -val JsonLazyParsing: Boolean = jsonLazyParsing() \ No newline at end of file +@ApiStatus.Internal +@ApiStatus.OverrideOnly +interface JsonLazyParsingVetoer { + fun isLazyParsingVetoed(): Boolean +} + +private val jsonLazyParsingVetoerEP: ExtensionPointKey = + ExtensionPointKey("com.intellij.json.lazyParsingVetoer") + +/** + * Handles the lazy parsing switch of JSON files in the syntax lib which has no dependency on the IntelliJ platform. + * + * Lazy parsing is enabled unless some [JsonLazyParsingVetoer] vetoes it. The query is defensive — if no extension + * support / extension point is available (very early startup, or a lightweight test fixture that did not register the + * extension point), lazy parsing stays enabled, matching the registry default. + * + * @see JsonLazyParsingVetoer + */ +val JsonLazyParsing: Boolean + get() = try { + currentExtensionSupport().getExtensions(jsonLazyParsingVetoerEP).none { it.isLazyParsingVetoed() } + } + catch (_: Throwable) { + true + } diff --git a/json/syntax/srcJvm/com/intellij/json/syntax/JsonLazyParsingJvm.kt b/json/syntax/srcJvm/com/intellij/json/syntax/JsonLazyParsingJvm.kt deleted file mode 100644 index 05b0aed3d748..000000000000 --- a/json/syntax/srcJvm/com/intellij/json/syntax/JsonLazyParsingJvm.kt +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.json.syntax - -import fleet.util.multiplatform.Actual - -@Actual -internal fun jsonLazyParsingJvm(): Boolean = System.getProperty("json.lazy.parsing") != "false" \ No newline at end of file diff --git a/json/syntax/srcWasmJs/com/intellij/json/syntax/JsonLazyParsingWasmJs.kt b/json/syntax/srcWasmJs/com/intellij/json/syntax/JsonLazyParsingWasmJs.kt deleted file mode 100644 index 95574a8cdbf1..000000000000 --- a/json/syntax/srcWasmJs/com/intellij/json/syntax/JsonLazyParsingWasmJs.kt +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.json.syntax - -import fleet.util.multiplatform.Actual - -@Actual -internal fun jsonLazyParsingWasmJs(): Boolean = true \ No newline at end of file