From 108a51c7da297d2aa5ff67dfa8f4d3f6880f3e8d Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Fri, 15 Aug 2025 15:29:29 +0200 Subject: [PATCH] [syntax] prepare syntax for JS target GitOrigin-RevId: 32c9b48b912025b7f5180572a79c2e387d9d1429 --- .../intellij/java/syntax/JavaSyntaxBundle.kt | 2 +- .../com/intellij/java/syntax/JavaSyntaxLog.kt | 9 ------ .../element/JavaLanguageLevelProvider.kt | 4 +-- .../syntax-api/api-dump-experimental.txt | 4 +-- .../platform/syntax/tree/ASTMarkers.kt | 5 ++- .../platform/syntax/tree/ToAstMarkers.kt | 4 +-- .../syntax/impl/builder/MarkerProductionJs.kt | 13 ++++++++ .../platform/syntax/tree/ChameleonRef.kt | 32 +++++++++++++++++++ .../platform/syntax/tree/ASTMarkersJvm.kt | 8 ++--- .../platform/syntax/tree/ChameleonRef.kt | 4 +-- .../syntax/impl/builder/ASTMarkersTests.kt | 6 ++-- .../api-dump-experimental.txt | 4 +-- .../syntax/extensions/ExtensionSupport.kt | 8 ++--- .../impl/ExtensionRegistryHolder.kt | 3 +- .../extensions/impl/CollectionsImplJs.kt | 18 +++++++++++ .../impl/ExtensionRegistryHolderJs.kt | 8 +++++ .../impl/ThreadLocalRegistryHolderJs.kt | 20 ++++++++++++ .../platform/syntax/i18n/JsResourceBundle.kt | 15 +++++++++ .../psi/tests/IntelliJExtensionSupportTest.kt | 4 +-- .../platform/syntax/tree/KmpSyntaxNode.kt | 4 +-- .../intellij/platform/syntax/tree/Parse.kt | 4 +-- .../CancellationProviderExtension.kt | 4 +-- .../language/SyntaxElementLanguageProvider.kt | 4 +-- .../util/lexer/MergingLexerAdapterBase.kt | 2 +- .../syntax/util/log/LogProviderExtension.kt | 10 ++---- .../srcJsMain/com/intellij/util/text/js.kt | 20 ++++++++++++ .../com/intellij/util/JavaVersion.js.kt | 15 +++++++++ 27 files changed, 180 insertions(+), 54 deletions(-) delete mode 100644 java/java-syntax/src/com/intellij/java/syntax/JavaSyntaxLog.kt create mode 100644 platform/syntax/syntax-api/srcJs/com/intellij/platform/syntax/impl/builder/MarkerProductionJs.kt create mode 100644 platform/syntax/syntax-api/srcJs/com/intellij/platform/syntax/tree/ChameleonRef.kt create mode 100644 platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/CollectionsImplJs.kt create mode 100644 platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/ExtensionRegistryHolderJs.kt create mode 100644 platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/ThreadLocalRegistryHolderJs.kt create mode 100644 platform/syntax/syntax-i18n/srcJsMain/com/intellij/platform/syntax/i18n/JsResourceBundle.kt create mode 100644 platform/util/base/multiplatform/srcJsMain/com/intellij/util/text/js.kt create mode 100644 platform/util/multiplatform/srcJsMain/com/intellij/util/JavaVersion.js.kt diff --git a/java/java-syntax/src/com/intellij/java/syntax/JavaSyntaxBundle.kt b/java/java-syntax/src/com/intellij/java/syntax/JavaSyntaxBundle.kt index ef2c7b65307f..b7e28cac7fcd 100644 --- a/java/java-syntax/src/com/intellij/java/syntax/JavaSyntaxBundle.kt +++ b/java/java-syntax/src/com/intellij/java/syntax/JavaSyntaxBundle.kt @@ -38,5 +38,5 @@ object JavaSyntaxBundle { @ApiStatus.Internal object DefaultJavaSyntaxResourcesTestAccessor { val mappings: Map get() = DefaultJavaSyntaxResources.mappings - val defaultJavaSyntaxResourcesName: String get() = DefaultJavaSyntaxResources::class.qualifiedName!! + const val defaultJavaSyntaxResourcesName: String = "com.intellij.java.syntax.DefaultJavaSyntaxResources" } diff --git a/java/java-syntax/src/com/intellij/java/syntax/JavaSyntaxLog.kt b/java/java-syntax/src/com/intellij/java/syntax/JavaSyntaxLog.kt deleted file mode 100644 index 06942f0b97b6..000000000000 --- a/java/java-syntax/src/com/intellij/java/syntax/JavaSyntaxLog.kt +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.intellij.java.syntax - -import com.intellij.platform.syntax.Logger -import com.intellij.platform.syntax.util.log.logger - -internal object JavaSyntaxLog { - val log: Logger = logger() -} \ No newline at end of file diff --git a/java/java-syntax/src/com/intellij/java/syntax/element/JavaLanguageLevelProvider.kt b/java/java-syntax/src/com/intellij/java/syntax/element/JavaLanguageLevelProvider.kt index f2fe6d8684cd..12815dfb5775 100644 --- a/java/java-syntax/src/com/intellij/java/syntax/element/JavaLanguageLevelProvider.kt +++ b/java/java-syntax/src/com/intellij/java/syntax/element/JavaLanguageLevelProvider.kt @@ -3,7 +3,7 @@ package com.intellij.java.syntax.element import com.intellij.platform.syntax.LazyParsingContext import com.intellij.platform.syntax.extensions.ExtensionPointKey -import com.intellij.platform.syntax.extensions.ExtensionSupport +import com.intellij.platform.syntax.extensions.currentExtensionSupport import com.intellij.platform.syntax.tree.SyntaxNode import com.intellij.pom.java.LanguageLevel import org.jetbrains.annotations.ApiStatus @@ -17,7 +17,7 @@ interface JavaLanguageLevelProvider { } internal fun getLanguageLevel(parsingContext: LazyParsingContext): LanguageLevel { - val languageLevelProvider = ExtensionSupport().getExtensions(languageLevelExtensionPoint).firstOrNull() + val languageLevelProvider = currentExtensionSupport().getExtensions(languageLevelExtensionPoint).firstOrNull() val languageLevel = languageLevelProvider?.getLanguageLevel(parsingContext.node) ?: LanguageLevel.HIGHEST return languageLevel } diff --git a/platform/syntax/syntax-api/api-dump-experimental.txt b/platform/syntax/syntax-api/api-dump-experimental.txt index 5b2fd7e02ff2..5df3ec1b8184 100644 --- a/platform/syntax/syntax-api/api-dump-experimental.txt +++ b/platform/syntax/syntax-api/api-dump-experimental.txt @@ -256,10 +256,10 @@ - a:changeMarkerCount(I,I,I):V - a:substitute(I,I,com.intellij.platform.syntax.tree.ASTMarkers):V *f:com.intellij.platform.syntax.tree.ASTMarkersKt -- sf:ChameleonRef():com.intellij.platform.syntax.tree.ChameleonRef -- sf:ChameleonRef(com.intellij.platform.syntax.tree.AstMarkersChameleon):com.intellij.platform.syntax.tree.ChameleonRef - sf:firstChild(com.intellij.platform.syntax.tree.ASTMarkers,I):I - sf:lastChild(com.intellij.platform.syntax.tree.ASTMarkers,I):I +- sf:newChameleonRef():com.intellij.platform.syntax.tree.ChameleonRef +- sf:newChameleonRef(com.intellij.platform.syntax.tree.AstMarkersChameleon):com.intellij.platform.syntax.tree.ChameleonRef - sf:nextSibling(com.intellij.platform.syntax.tree.ASTMarkers,I):I - sf:prevSibling(com.intellij.platform.syntax.tree.ASTMarkers,I):I *f:com.intellij.platform.syntax.tree.AstMarkersChameleon diff --git a/platform/syntax/syntax-api/src/com/intellij/platform/syntax/tree/ASTMarkers.kt b/platform/syntax/syntax-api/src/com/intellij/platform/syntax/tree/ASTMarkers.kt index ef56fb62ee15..9cdeffa33e37 100644 --- a/platform/syntax/syntax-api/src/com/intellij/platform/syntax/tree/ASTMarkers.kt +++ b/platform/syntax/syntax-api/src/com/intellij/platform/syntax/tree/ASTMarkers.kt @@ -22,11 +22,10 @@ interface ChameleonRef { fun realize(func: () -> AstMarkersChameleon): AstMarkersChameleon } -@Suppress("unused") -fun ChameleonRef(): ChameleonRef = linkToActual() +fun newChameleonRef(): ChameleonRef = linkToActual() @Suppress("unused") -fun ChameleonRef(chameleon: AstMarkersChameleon): ChameleonRef = linkToActual() +fun newChameleonRef(chameleon: AstMarkersChameleon): ChameleonRef = linkToActual() @ApiStatus.Experimental interface ASTMarkers { diff --git a/platform/syntax/syntax-api/src/com/intellij/platform/syntax/tree/ToAstMarkers.kt b/platform/syntax/syntax-api/src/com/intellij/platform/syntax/tree/ToAstMarkers.kt index d5ff19981d8e..890aa60ab333 100644 --- a/platform/syntax/syntax-api/src/com/intellij/platform/syntax/tree/ToAstMarkers.kt +++ b/platform/syntax/syntax-api/src/com/intellij/platform/syntax/tree/ToAstMarkers.kt @@ -107,7 +107,7 @@ fun SyntaxTreeBuilder.toAstMarkers(): ASTMarkers { item.getNodeType() ) if (item.getNodeType().isLazyParseable() && item.isCollapsed()) { - astMarkersResult.setChameleon(item.startIndex, ChameleonRef()) + astMarkersResult.setChameleon(item.startIndex, newChameleonRef()) isInsideChameleon = true } astTreeIndices.push(astTreeIndex) @@ -117,7 +117,7 @@ fun SyntaxTreeBuilder.toAstMarkers(): ASTMarkers { } for (i in 0.. AstMarkersChameleon): AstMarkersChameleon = + ref ?: func().also { ref = it } + + override fun toString(): String = ref?.toString() ?: "null" +} + +/** + * Wasm implementation of [newChameleonRef]. + */ +@Suppress("unused") +@Actual("ChameleonRef") +internal fun newChameleonRefJs(): ChameleonRef = ChameleonRefImpl() + +/** + * Wasm implementation of [newChameleonRef]. + */ +@Suppress("unused") +@Actual("ChameleonRef") +internal fun newChameleonRefJs(chameleon: AstMarkersChameleon): ChameleonRef = ChameleonRefImpl(chameleon) \ No newline at end of file diff --git a/platform/syntax/syntax-api/srcJvm/com/intellij/platform/syntax/tree/ASTMarkersJvm.kt b/platform/syntax/syntax-api/srcJvm/com/intellij/platform/syntax/tree/ASTMarkersJvm.kt index 94cbe0a9522a..87fb28a74dbe 100644 --- a/platform/syntax/syntax-api/srcJvm/com/intellij/platform/syntax/tree/ASTMarkersJvm.kt +++ b/platform/syntax/syntax-api/srcJvm/com/intellij/platform/syntax/tree/ASTMarkersJvm.kt @@ -23,15 +23,15 @@ private class ChameleonRefImpl( } /** - * Jvm implementation of [ChameleonRef]. + * Jvm implementation of [newChameleonRef]. */ @Suppress("unused") @Actual("ChameleonRef") -internal fun ChameleonRefJvm(): ChameleonRef = ChameleonRefImpl() +internal fun newChameleonRefJvm(): ChameleonRef = ChameleonRefImpl() /** - * Jvm implementation of [ChameleonRef]. + * Jvm implementation of [newChameleonRef]. */ @Suppress("unused") @Actual("ChameleonRef") -internal fun ChameleonRefJvm(chameleon: AstMarkersChameleon): ChameleonRef = ChameleonRefImpl(SoftReference(chameleon)) \ No newline at end of file +internal fun newChameleonRefJvm(chameleon: AstMarkersChameleon): ChameleonRef = ChameleonRefImpl(SoftReference(chameleon)) \ No newline at end of file diff --git a/platform/syntax/syntax-api/srcWasmJs/com/intellij/platform/syntax/tree/ChameleonRef.kt b/platform/syntax/syntax-api/srcWasmJs/com/intellij/platform/syntax/tree/ChameleonRef.kt index 011adabe8578..80346cd44185 100644 --- a/platform/syntax/syntax-api/srcWasmJs/com/intellij/platform/syntax/tree/ChameleonRef.kt +++ b/platform/syntax/syntax-api/srcWasmJs/com/intellij/platform/syntax/tree/ChameleonRef.kt @@ -22,11 +22,11 @@ private class ChameleonRefImpl(private var ref: AstMarkersChameleon? = null) : C */ @Suppress("unused") @Actual("ChameleonRef") -internal fun ChameleonRefWasmJs(): ChameleonRef = ChameleonRefImpl() +internal fun newChameleonRefWasmJs(): ChameleonRef = ChameleonRefImpl() /** * Wasm implementation of [ChameleonRef]. */ @Suppress("unused") @Actual("ChameleonRef") -internal fun ChameleonRefWasmJs(chameleon: AstMarkersChameleon): ChameleonRef = ChameleonRefImpl(chameleon) \ No newline at end of file +internal fun newChameleonRefWasmJs(chameleon: AstMarkersChameleon): ChameleonRef = ChameleonRefImpl(chameleon) \ No newline at end of file diff --git a/platform/syntax/syntax-api/testJvm/com/intellij/platform/syntax/impl/builder/ASTMarkersTests.kt b/platform/syntax/syntax-api/testJvm/com/intellij/platform/syntax/impl/builder/ASTMarkersTests.kt index d95fefbabbe4..e529001556ef 100644 --- a/platform/syntax/syntax-api/testJvm/com/intellij/platform/syntax/impl/builder/ASTMarkersTests.kt +++ b/platform/syntax/syntax-api/testJvm/com/intellij/platform/syntax/impl/builder/ASTMarkersTests.kt @@ -3,7 +3,7 @@ package com.intellij.platform.syntax.impl.builder import com.intellij.platform.syntax.element.SyntaxTokenTypes import com.intellij.platform.syntax.tree.ASTMarkersImpl -import com.intellij.platform.syntax.tree.ChameleonRef +import com.intellij.platform.syntax.tree.newChameleonRef import com.intellij.platform.syntax.tree.MarkerKind import org.junit.jupiter.api.Test import kotlin.test.assertEquals @@ -233,7 +233,7 @@ class ASTMarkersTests { @Test fun testSubstituteChameleonRemoved() { - val atomicReference = ChameleonRef() + val atomicReference = newChameleonRef() val firstTree = ASTMarkersImpl().apply { pushBack() setMarker(0, 0, MarkerKind.Start, false, null, null) @@ -319,7 +319,7 @@ class ASTMarkersTests { setMarker(3, 0, MarkerKind.End, false, null, null) } - val atomicReference = ChameleonRef() + val atomicReference = newChameleonRef() val secondTree = ASTMarkersImpl().apply { pushBack() setMarker(0, 0, MarkerKind.Start, false, null, null) diff --git a/platform/syntax/syntax-extensions/api-dump-experimental.txt b/platform/syntax/syntax-extensions/api-dump-experimental.txt index 2878ed051501..3ed5b8a175bf 100644 --- a/platform/syntax/syntax-extensions/api-dump-experimental.txt +++ b/platform/syntax/syntax-extensions/api-dump-experimental.txt @@ -14,8 +14,8 @@ - a:getExtensions(com.intellij.platform.syntax.extensions.ExtensionPointKey):java.util.List - a:getLanguageExtensions(com.intellij.platform.syntax.extensions.ExtensionPointKey,com.intellij.platform.syntax.SyntaxLanguage):java.util.List *f:com.intellij.platform.syntax.extensions.ExtensionSupportKt -- *sf:ExtensionRegistry():com.intellij.platform.syntax.extensions.ExtensionRegistry -- *sf:ExtensionSupport():com.intellij.platform.syntax.extensions.ExtensionSupport - sf:buildExtensionSupport(kotlin.jvm.functions.Function1):com.intellij.platform.syntax.extensions.ExtensionSupport +- *sf:currentExtensionRegistry():com.intellij.platform.syntax.extensions.ExtensionRegistry +- *sf:currentExtensionSupport():com.intellij.platform.syntax.extensions.ExtensionSupport - sf:performWithExtensionSupport(com.intellij.platform.syntax.extensions.ExtensionSupport,kotlin.jvm.functions.Function1):java.lang.Object *:com.intellij.platform.syntax.extensions.StaticExtensionSupport diff --git a/platform/syntax/syntax-extensions/src/com/intellij/platform/syntax/extensions/ExtensionSupport.kt b/platform/syntax/syntax-extensions/src/com/intellij/platform/syntax/extensions/ExtensionSupport.kt index 9c80d0521b18..91f3b544177f 100644 --- a/platform/syntax/syntax-extensions/src/com/intellij/platform/syntax/extensions/ExtensionSupport.kt +++ b/platform/syntax/syntax-extensions/src/com/intellij/platform/syntax/extensions/ExtensionSupport.kt @@ -12,16 +12,16 @@ import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract /** - * Provides the current instance of [ExtensionRegistry]. + * Provides the current instance of [currentExtensionRegistry]. */ @ApiStatus.Experimental -fun ExtensionSupport(): ExtensionSupport = registry +fun currentExtensionSupport(): ExtensionSupport = registry /** - * Provides the current instance of [ExtensionRegistry] or `null` if it is not supported in the current environment (i.e., in IntelliJ runtime). + * Provides the current instance of [currentExtensionRegistry] or `null` if it is not supported in the current environment (i.e., in IntelliJ runtime). */ @ApiStatus.Experimental -fun ExtensionRegistry(): ExtensionRegistry? = registry as? ExtensionRegistry +fun currentExtensionRegistry(): ExtensionRegistry? = registry as? ExtensionRegistry /** * Provides access for extensions registered in the current container. diff --git a/platform/syntax/syntax-extensions/src/com/intellij/platform/syntax/extensions/impl/ExtensionRegistryHolder.kt b/platform/syntax/syntax-extensions/src/com/intellij/platform/syntax/extensions/impl/ExtensionRegistryHolder.kt index 01d4b482ad4e..2b3d0350e108 100644 --- a/platform/syntax/syntax-extensions/src/com/intellij/platform/syntax/extensions/impl/ExtensionRegistryHolder.kt +++ b/platform/syntax/syntax-extensions/src/com/intellij/platform/syntax/extensions/impl/ExtensionRegistryHolder.kt @@ -3,6 +3,7 @@ package com.intellij.platform.syntax.extensions.impl import com.intellij.platform.syntax.extensions.ExtensionRegistry import com.intellij.platform.syntax.extensions.ExtensionSupport +import com.intellij.platform.syntax.extensions.currentExtensionSupport import com.intellij.platform.syntax.extensions.StaticExtensionSupport import fleet.util.multiplatform.linkToActual import kotlin.contracts.ExperimentalContracts @@ -28,7 +29,7 @@ internal val staticRegistryHolder: RegistryHolder by lazy { /** * Tries to find [com.intellij.platform.syntax.psi.IntelliJExtensionSupport] in the class path. - * If it succeeds, it means we are running in IntelliJ, and we must use IJ plugin model as the [ExtensionSupport] backend. + * If it succeeds, it means we are running in IntelliJ, and we must use IJ plugin model as the [currentExtensionSupport] backend. * Otherwise, returning [ExtensionRegistryImpl]. * * @See instantiateExtensionRegistryJvm diff --git a/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/CollectionsImplJs.kt b/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/CollectionsImplJs.kt new file mode 100644 index 000000000000..71a7bd73415e --- /dev/null +++ b/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/CollectionsImplJs.kt @@ -0,0 +1,18 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.platform.syntax.extensions.impl + +import fleet.util.multiplatform.Actual + +/** WasmJs implementation of [newConcurrentMap] */ +@Suppress("unused") +@Actual(linkedTo = "newConcurrentMap") +internal fun newConcurrentMapJs(): ConcurrentMap = + SyntaxConcurrentMapJs(HashMap()) + +private class SyntaxConcurrentMapJs( + private val map: HashMap, +) : MutableMap by map, ConcurrentMap { + + override fun computeIfAbsent(key: K, f: (K) -> V): V = + map[key] ?: f(key).also { map[key] = it } +} diff --git a/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/ExtensionRegistryHolderJs.kt b/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/ExtensionRegistryHolderJs.kt new file mode 100644 index 000000000000..3dce27776577 --- /dev/null +++ b/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/ExtensionRegistryHolderJs.kt @@ -0,0 +1,8 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.platform.syntax.extensions.impl + +import com.intellij.platform.syntax.extensions.ExtensionSupport +import fleet.util.multiplatform.Actual + +@Actual("instantiateExtensionRegistry") +internal fun instantiateExtensionRegistryJs(): ExtensionSupport = ExtensionRegistryImpl() diff --git a/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/ThreadLocalRegistryHolderJs.kt b/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/ThreadLocalRegistryHolderJs.kt new file mode 100644 index 000000000000..44f36baaa4b1 --- /dev/null +++ b/platform/syntax/syntax-extensions/srcJsMain/com/intellij/platform/syntax/extensions/impl/ThreadLocalRegistryHolderJs.kt @@ -0,0 +1,20 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.platform.syntax.extensions.impl + +internal object ThreadLocalRegistryHolderJs : com.intellij.platform.syntax.extensions.impl.RegistryHolder { + private var threadLocal: com.intellij.platform.syntax.extensions.ExtensionSupport? = null + + override val registry: com.intellij.platform.syntax.extensions.ExtensionSupport? + get() = threadLocal + + override fun installRegistry(registry: com.intellij.platform.syntax.extensions.ExtensionSupport) { + threadLocal = registry + } +} + +/** + * @see getThreadLocalRegistry + */ +@fleet.util.multiplatform.Actual("instantiateThreadLocalRegistry") +internal fun instantiateThreadLocalRegistryJs(): com.intellij.platform.syntax.extensions.impl.RegistryHolder = + ThreadLocalRegistryHolderJs \ No newline at end of file diff --git a/platform/syntax/syntax-i18n/srcJsMain/com/intellij/platform/syntax/i18n/JsResourceBundle.kt b/platform/syntax/syntax-i18n/srcJsMain/com/intellij/platform/syntax/i18n/JsResourceBundle.kt new file mode 100644 index 000000000000..85de9b40b9b3 --- /dev/null +++ b/platform/syntax/syntax-i18n/srcJsMain/com/intellij/platform/syntax/i18n/JsResourceBundle.kt @@ -0,0 +1,15 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.platform.syntax.i18n + +import fleet.util.multiplatform.Actual + +/** + * see expect function [com.intellij.platform.syntax.i18n.ResourceBundle] + */ +@Actual("ResourceBundle") +internal fun ResourceBundleJs( + bundleClass: String, + pathToBundle: String, + self: Any, + defaultMapping: Map, +): ResourceBundle = BaseResourceBundle(defaultMapping) diff --git a/platform/syntax/syntax-psi-tests/testSrc/com/intellij/syntax/psi/tests/IntelliJExtensionSupportTest.kt b/platform/syntax/syntax-psi-tests/testSrc/com/intellij/syntax/psi/tests/IntelliJExtensionSupportTest.kt index 219882aef2e4..48c8b8daa367 100644 --- a/platform/syntax/syntax-psi-tests/testSrc/com/intellij/syntax/psi/tests/IntelliJExtensionSupportTest.kt +++ b/platform/syntax/syntax-psi-tests/testSrc/com/intellij/syntax/psi/tests/IntelliJExtensionSupportTest.kt @@ -6,7 +6,7 @@ import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.util.Disposer import com.intellij.openapi.vfs.VirtualFileManagerListener import com.intellij.platform.syntax.extensions.ExtensionPointKey -import com.intellij.platform.syntax.extensions.ExtensionSupport +import com.intellij.platform.syntax.extensions.currentExtensionSupport import com.intellij.testFramework.junit5.TestApplication import com.intellij.testFramework.registerExtension import org.junit.jupiter.api.AfterEach @@ -32,7 +32,7 @@ class IntelliJExtensionSupportTest { @Test fun testSupport() { - val extensionSupport = ExtensionSupport() + val extensionSupport = currentExtensionSupport() val pointKey = ExtensionPointKey("com.intellij.virtualFileManagerListener") val extensions = extensionSupport.getExtensions(pointKey) diff --git a/platform/syntax/syntax-tree/src/com/intellij/platform/syntax/tree/KmpSyntaxNode.kt b/platform/syntax/syntax-tree/src/com/intellij/platform/syntax/tree/KmpSyntaxNode.kt index f55d48e6e5f6..609360bea28d 100644 --- a/platform/syntax/syntax-tree/src/com/intellij/platform/syntax/tree/KmpSyntaxNode.kt +++ b/platform/syntax/syntax-tree/src/com/intellij/platform/syntax/tree/KmpSyntaxNode.kt @@ -596,7 +596,7 @@ private fun substitute( val contextKey = key + syntaxNode.context.startLexemeIndex val newKey = if (contextKey >= syntaxNode.endLexemeIndex) key + diff else key if (contextKey == syntaxNode.startLexemeIndex) { - newKey to ChameleonRef(parsedChameleon) + newKey to newChameleonRef(parsedChameleon) } else { newKey to value @@ -637,7 +637,7 @@ private fun substitute( else oldParsedChameleon.customLexemeStore val newParsedChameleon = AstMarkersChameleon(newTokens, ast = reparsedAst) diff = if (theSameTokens) diff else 0 - lexemeIndex to ChameleonRef(newParsedChameleon) + lexemeIndex to newChameleonRef(newParsedChameleon) } else -> (lexemeIndex + diff) to ref diff --git a/platform/syntax/syntax-tree/src/com/intellij/platform/syntax/tree/Parse.kt b/platform/syntax/syntax-tree/src/com/intellij/platform/syntax/tree/Parse.kt index 6544e058df77..51fb3f0138aa 100644 --- a/platform/syntax/syntax-tree/src/com/intellij/platform/syntax/tree/Parse.kt +++ b/platform/syntax/syntax-tree/src/com/intellij/platform/syntax/tree/Parse.kt @@ -7,7 +7,7 @@ import com.intellij.platform.syntax.CancellationProvider import com.intellij.platform.syntax.Logger import com.intellij.platform.syntax.SyntaxElementTypeSet import com.intellij.platform.syntax.element.SyntaxTokenTypes -import com.intellij.platform.syntax.extensions.ExtensionSupport +import com.intellij.platform.syntax.extensions.currentExtensionSupport import com.intellij.platform.syntax.lexer.Lexer import com.intellij.platform.syntax.lexer.TokenList import com.intellij.platform.syntax.lexer.buildTokenList @@ -82,6 +82,6 @@ fun parse( builderFactory = SyntaxBuilderFactory { text, tokens, startLexeme -> createBuilder(text, tokens, startLexeme) }, - extensions = ::ExtensionSupport + extensions = ::currentExtensionSupport ) } diff --git a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/cancellation/CancellationProviderExtension.kt b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/cancellation/CancellationProviderExtension.kt index 7b0a8493924b..c8d96efd9688 100644 --- a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/cancellation/CancellationProviderExtension.kt +++ b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/cancellation/CancellationProviderExtension.kt @@ -5,7 +5,7 @@ package com.intellij.platform.syntax.util.cancellation import com.intellij.platform.syntax.CancellationProvider import com.intellij.platform.syntax.extensions.ExtensionPointKey -import com.intellij.platform.syntax.extensions.ExtensionSupport +import com.intellij.platform.syntax.extensions.currentExtensionSupport import org.jetbrains.annotations.ApiStatus /** @@ -13,7 +13,7 @@ import org.jetbrains.annotations.ApiStatus */ @ApiStatus.Experimental fun cancellationProvider(): CancellationProvider? = - ExtensionSupport().getExtensions(cancellationProviderEP).firstNotNullOfOrNull { it.getCancellationProvider() } + currentExtensionSupport().getExtensions(cancellationProviderEP).firstNotNullOfOrNull { it.getCancellationProvider() } /** * Implement this extension point to provide a [CancellationProvider] for your environment. diff --git a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/language/SyntaxElementLanguageProvider.kt b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/language/SyntaxElementLanguageProvider.kt index 1cda3a4fab4f..0218af494e30 100644 --- a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/language/SyntaxElementLanguageProvider.kt +++ b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/language/SyntaxElementLanguageProvider.kt @@ -7,7 +7,7 @@ import com.intellij.platform.syntax.SyntaxElementType import com.intellij.platform.syntax.SyntaxElementTypeSet import com.intellij.platform.syntax.SyntaxLanguage import com.intellij.platform.syntax.extensions.ExtensionPointKey -import com.intellij.platform.syntax.extensions.ExtensionSupport +import com.intellij.platform.syntax.extensions.currentExtensionSupport import org.jetbrains.annotations.ApiStatus /** @@ -44,7 +44,7 @@ fun SyntaxElementLanguageProvider.getLanguage(elementType: SyntaxElementType): S */ @ApiStatus.Experimental fun syntaxElementLanguageProvider(): SyntaxElementLanguageProvider? { - val languageProviders = ExtensionSupport().getExtensions(syntaxElementLanguageProviderEP) + val languageProviders = currentExtensionSupport().getExtensions(syntaxElementLanguageProviderEP) if (languageProviders.isEmpty()) return null if (languageProviders.size == 1) return languageProviders[0] diff --git a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/lexer/MergingLexerAdapterBase.kt b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/lexer/MergingLexerAdapterBase.kt index 340f2c6b4c32..e4f82547a6de 100644 --- a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/lexer/MergingLexerAdapterBase.kt +++ b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/lexer/MergingLexerAdapterBase.kt @@ -74,7 +74,7 @@ abstract class MergingLexerAdapterBase(original: Lexer) : DelegateLexer(original } override fun toString(): String { - return "${this::class.qualifiedName}[$delegate]" + return "${this::class.simpleName}[$delegate]" } override fun getCurrentPosition(): LexerPosition = diff --git a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/log/LogProviderExtension.kt b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/log/LogProviderExtension.kt index d4b46f81f3d9..143928b33b0d 100644 --- a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/log/LogProviderExtension.kt +++ b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/log/LogProviderExtension.kt @@ -5,7 +5,7 @@ package com.intellij.platform.syntax.util.log import com.intellij.platform.syntax.Logger import com.intellij.platform.syntax.extensions.ExtensionPointKey -import com.intellij.platform.syntax.extensions.ExtensionSupport +import com.intellij.platform.syntax.extensions.currentExtensionSupport import com.intellij.platform.syntax.logger.noopLogger import org.jetbrains.annotations.ApiStatus @@ -14,13 +14,7 @@ import org.jetbrains.annotations.ApiStatus */ @ApiStatus.Experimental fun logger(name: String): Logger = - ExtensionSupport().getExtensions(logProviderExtensionPoint).firstNotNullOfOrNull { it.getLogger(name) } ?: noopLogger() - -/** - * Provides a [Logger] for your environment with the qualified name of the receiver class, or [noopLogger] if no Logger was provided. - */ -@ApiStatus.Experimental -inline fun logger(): Logger = logger(T::class.qualifiedName!!) + currentExtensionSupport().getExtensions(logProviderExtensionPoint).firstNotNullOfOrNull { it.getLogger(name) } ?: noopLogger() /** * Implement this extension point to provide a [Logger] for your environment with the given name.. diff --git a/platform/util/base/multiplatform/srcJsMain/com/intellij/util/text/js.kt b/platform/util/base/multiplatform/srcJsMain/com/intellij/util/text/js.kt new file mode 100644 index 000000000000..e9993e13a1ed --- /dev/null +++ b/platform/util/base/multiplatform/srcJsMain/com/intellij/util/text/js.kt @@ -0,0 +1,20 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.util.text + +import fleet.util.multiplatform.Actual + +/** + * [com.intellij.util.text.fromSequenceWithoutCopyingPlatformSpecific] + */ +@Actual("fromSequenceWithoutCopyingPlatformSpecific") +internal fun fromSequenceWithoutCopyingPlatformSpecificJs(seq: CharSequence?): CharArray? { + return null +} + +/** + * [com.intellij.util.text.getCharsPlatformSpecific] + */ +@Actual("getCharsPlatformSpecific") +internal fun getCharsPlatformSpecificJs(string: CharSequence, srcOffset: Int, dst: CharArray, dstOffset: Int, len: Int): Boolean { + return false +} \ No newline at end of file diff --git a/platform/util/multiplatform/srcJsMain/com/intellij/util/JavaVersion.js.kt b/platform/util/multiplatform/srcJsMain/com/intellij/util/JavaVersion.js.kt new file mode 100644 index 000000000000..a095b08c2cda --- /dev/null +++ b/platform/util/multiplatform/srcJsMain/com/intellij/util/JavaVersion.js.kt @@ -0,0 +1,15 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.util + +import com.intellij.util.lang.JavaVersion +import fleet.util.multiplatform.Actual +import org.jetbrains.annotations.ApiStatus + +/** + * actual for [com.intellij.util.currentJavaVersionPlatformSpecific] + */ +@Actual("currentJavaVersionPlatformSpecific") +@ApiStatus.Internal +fun currentJavaVersionPlatformSpecificJs(): JavaVersion { + return JavaVersion.compose(21, 0, 0, 0, false) +} \ No newline at end of file