From e69f5c66af5833a25ee046ca4c4ac4739c3662f4 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Wed, 28 May 2025 12:48:23 +0200 Subject: [PATCH] syntax: move LanguageSyntaxDefinition to syntax lib and extract GrammarKitLanguageDefinition GitOrigin-RevId: 940e09c0ca86363fa97358d9c10851453faefb25 --- .../syntax/JShellSyntaxDefinitionExtension.kt | 2 +- .../syntax/JavaSyntaxDefinitionExtension.kt | 2 +- ...tractBasicJavaParsingTestConfigurator.java | 2 +- .../parser/JavaParsingTestConfigurator.java | 1 + .../syntax-api/api-dump-experimental.txt | 4 ++ .../syntax/LanguageSyntaxDefinition.kt | 31 ++++++++++++ .../syntax-psi/api-dump-experimental.txt | 5 -- .../intellij.platform.syntax.psi.xml | 2 +- .../syntax/psi/LanguageSyntaxDefinition.kt | 48 ------------------- .../syntax/psi/LanguageSyntaxDefinitions.kt | 16 +++++++ .../syntax/psi/impl/PsiSyntaxBuilderImpl.kt | 1 + .../impl/PsiSyntaxParserRuntimeFactoryImpl.kt | 4 ++ .../syntax-util/api-dump-experimental.txt | 3 ++ .../runtime/GrammarKitLanguageDefinition.kt | 10 ++++ 14 files changed, 74 insertions(+), 57 deletions(-) create mode 100644 platform/syntax/syntax-api/src/com/intellij/platform/syntax/LanguageSyntaxDefinition.kt delete mode 100644 platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/LanguageSyntaxDefinition.kt create mode 100644 platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/LanguageSyntaxDefinitions.kt create mode 100644 platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/runtime/GrammarKitLanguageDefinition.kt diff --git a/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/JShellSyntaxDefinitionExtension.kt b/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/JShellSyntaxDefinitionExtension.kt index fb29d1581ca6..83c7896fc83d 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/JShellSyntaxDefinitionExtension.kt +++ b/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/JShellSyntaxDefinitionExtension.kt @@ -4,7 +4,7 @@ package com.intellij.java.frontback.psi.impl.syntax import com.intellij.java.syntax.JavaSyntaxDefinition import com.intellij.platform.syntax.SyntaxElementTypeSet import com.intellij.platform.syntax.lexer.Lexer -import com.intellij.platform.syntax.psi.LanguageSyntaxDefinition +import com.intellij.platform.syntax.LanguageSyntaxDefinition import com.intellij.pom.java.LanguageLevel internal class JShellSyntaxDefinitionExtension : LanguageSyntaxDefinition { diff --git a/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/JavaSyntaxDefinitionExtension.kt b/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/JavaSyntaxDefinitionExtension.kt index 9ceb571751ff..0a4c9c46dd2c 100644 --- a/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/JavaSyntaxDefinitionExtension.kt +++ b/java/java-frontback-psi-impl/src/com/intellij/java/frontback/psi/impl/syntax/JavaSyntaxDefinitionExtension.kt @@ -4,7 +4,7 @@ package com.intellij.java.frontback.psi.impl.syntax import com.intellij.java.syntax.JavaSyntaxDefinition import com.intellij.platform.syntax.SyntaxElementTypeSet import com.intellij.platform.syntax.lexer.Lexer -import com.intellij.platform.syntax.psi.LanguageSyntaxDefinition +import com.intellij.platform.syntax.LanguageSyntaxDefinition import com.intellij.pom.java.LanguageLevel internal class JavaSyntaxDefinitionExtension : LanguageSyntaxDefinition { diff --git a/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicJavaParsingTestConfigurator.java b/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicJavaParsingTestConfigurator.java index 4f6b2f4b99e5..f29ac2441f41 100644 --- a/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicJavaParsingTestConfigurator.java +++ b/java/java-frontback-tests/testSrc/com/intellij/java/parser/AbstractBasicJavaParsingTestConfigurator.java @@ -3,7 +3,7 @@ package com.intellij.java.parser; import com.intellij.lang.ParserDefinition; import com.intellij.lang.java.parser.BasicJavaParserUtil; -import com.intellij.platform.syntax.psi.LanguageSyntaxDefinition; +import com.intellij.platform.syntax.LanguageSyntaxDefinition; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; diff --git a/java/java-tests/testSrc/com/intellij/java/parser/JavaParsingTestConfigurator.java b/java/java-tests/testSrc/com/intellij/java/parser/JavaParsingTestConfigurator.java index cce8af0b7891..2fb2a177dff6 100644 --- a/java/java-tests/testSrc/com/intellij/java/parser/JavaParsingTestConfigurator.java +++ b/java/java-tests/testSrc/com/intellij/java/parser/JavaParsingTestConfigurator.java @@ -12,6 +12,7 @@ import com.intellij.lang.java.parser.JavaParserUtil; import com.intellij.lang.java.syntax.JavaElementTypeConverterExtension; import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.roots.impl.LanguageLevelProjectExtensionImpl; +import com.intellij.platform.syntax.LanguageSyntaxDefinition; import com.intellij.platform.syntax.SyntaxElementType; import com.intellij.platform.syntax.SyntaxElementTypeKt; import com.intellij.platform.syntax.parser.SyntaxTreeBuilder; diff --git a/platform/syntax/syntax-api/api-dump-experimental.txt b/platform/syntax/syntax-api/api-dump-experimental.txt index 64849793acfb..c355483998fe 100644 --- a/platform/syntax/syntax-api/api-dump-experimental.txt +++ b/platform/syntax/syntax-api/api-dump-experimental.txt @@ -1,5 +1,9 @@ *:com.intellij.platform.syntax.CancellationProvider - a:checkCancelled():V +*:com.intellij.platform.syntax.LanguageSyntaxDefinition +- a:getCommentTokens():com.intellij.platform.syntax.SyntaxElementTypeSet +- a:getLexer():com.intellij.platform.syntax.lexer.Lexer +- getWhitespaceTokens():com.intellij.platform.syntax.SyntaxElementTypeSet *f:com.intellij.platform.syntax.LazyLexingContext - (com.intellij.platform.syntax.tree.SyntaxNode,com.intellij.platform.syntax.CancellationProvider):V - f:getCancellationProvider():com.intellij.platform.syntax.CancellationProvider diff --git a/platform/syntax/syntax-api/src/com/intellij/platform/syntax/LanguageSyntaxDefinition.kt b/platform/syntax/syntax-api/src/com/intellij/platform/syntax/LanguageSyntaxDefinition.kt new file mode 100644 index 000000000000..145a13a28f25 --- /dev/null +++ b/platform/syntax/syntax-api/src/com/intellij/platform/syntax/LanguageSyntaxDefinition.kt @@ -0,0 +1,31 @@ +// 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 + +import com.intellij.platform.syntax.element.SyntaxTokenTypes +import com.intellij.platform.syntax.lexer.Lexer +import org.jetbrains.annotations.ApiStatus + +/** + * Extension point providing syntax implementation for a given [com.intellij.lang.Language] + * + * @see com.intellij.platform.syntax.psi.LanguageSyntaxDefinitions + */ +@ApiStatus.Experimental +@ApiStatus.OverrideOnly +interface LanguageSyntaxDefinition { + /** + * An instance of [com.intellij.platform.syntax.lexer.Lexer] for the language with default settings. + * Create your lexer directly if you need to set some custom settings. + */ + fun getLexer(): Lexer + + /** + * The set of whitespace token types of the language + */ + fun getWhitespaceTokens(): SyntaxElementTypeSet = syntaxElementTypeSetOf(SyntaxTokenTypes.WHITE_SPACE) + + /** + * The set of comment token types of the language + */ + fun getCommentTokens(): SyntaxElementTypeSet +} \ No newline at end of file diff --git a/platform/syntax/syntax-psi/api-dump-experimental.txt b/platform/syntax/syntax-psi/api-dump-experimental.txt index 2ac8165fc821..989eb88cb9d1 100644 --- a/platform/syntax/syntax-psi/api-dump-experimental.txt +++ b/platform/syntax/syntax-psi/api-dump-experimental.txt @@ -15,11 +15,6 @@ - sf:getConverter(com.intellij.lang.Language):com.intellij.platform.syntax.psi.ElementTypeConverter *f:com.intellij.platform.syntax.psi.IntelliJLogger - *sf:asSyntaxLogger(com.intellij.openapi.diagnostic.Logger):com.intellij.platform.syntax.Logger -*:com.intellij.platform.syntax.psi.LanguageSyntaxDefinition -- a:getCommentTokens():com.intellij.platform.syntax.SyntaxElementTypeSet -- a:getLexer():com.intellij.platform.syntax.lexer.Lexer -- getPairedBraces():java.util.Collection -- getWhitespaceTokens():com.intellij.platform.syntax.SyntaxElementTypeSet *f:com.intellij.platform.syntax.psi.LanguageSyntaxDefinitions - com.intellij.lang.LanguageExtension - *sf:Companion:com.intellij.platform.syntax.psi.LanguageSyntaxDefinitions$Companion diff --git a/platform/syntax/syntax-psi/resources/intellij.platform.syntax.psi.xml b/platform/syntax/syntax-psi/resources/intellij.platform.syntax.psi.xml index c7db119c0a55..6ebcfae5df7c 100644 --- a/platform/syntax/syntax-psi/resources/intellij.platform.syntax.psi.xml +++ b/platform/syntax/syntax-psi/resources/intellij.platform.syntax.psi.xml @@ -4,7 +4,7 @@ - + = emptyList() -} - -/** - * Extension providing access to [LanguageSyntaxDefinition]s - */ -class LanguageSyntaxDefinitions : LanguageExtension("com.intellij.syntax.syntaxDefinition") { - companion object { - @JvmStatic - val INSTANCE: LanguageSyntaxDefinitions = LanguageSyntaxDefinitions() - } -} \ No newline at end of file diff --git a/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/LanguageSyntaxDefinitions.kt b/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/LanguageSyntaxDefinitions.kt new file mode 100644 index 000000000000..a52ea779cc6f --- /dev/null +++ b/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/LanguageSyntaxDefinitions.kt @@ -0,0 +1,16 @@ +// 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.psi + +import com.intellij.lang.LanguageExtension +import com.intellij.platform.syntax.LanguageSyntaxDefinition +import kotlin.jvm.JvmStatic + +/** + * Extension providing access to [com.intellij.platform.syntax.LanguageSyntaxDefinition]s + */ +class LanguageSyntaxDefinitions : LanguageExtension("com.intellij.syntax.syntaxDefinition") { + companion object { + @JvmStatic + val INSTANCE: LanguageSyntaxDefinitions = LanguageSyntaxDefinitions() + } +} \ No newline at end of file diff --git a/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/impl/PsiSyntaxBuilderImpl.kt b/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/impl/PsiSyntaxBuilderImpl.kt index 9061c958284e..e20580f3ba80 100644 --- a/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/impl/PsiSyntaxBuilderImpl.kt +++ b/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/impl/PsiSyntaxBuilderImpl.kt @@ -11,6 +11,7 @@ import com.intellij.openapi.util.Key import com.intellij.openapi.util.NlsContexts import com.intellij.openapi.util.UnprotectedUserDataHolder import com.intellij.openapi.util.text.StringUtil +import com.intellij.platform.syntax.LanguageSyntaxDefinition import com.intellij.platform.syntax.SyntaxElementType import com.intellij.platform.syntax.lexer.TokenList import com.intellij.platform.syntax.parser.* diff --git a/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/impl/PsiSyntaxParserRuntimeFactoryImpl.kt b/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/impl/PsiSyntaxParserRuntimeFactoryImpl.kt index 9bb217f1d021..f7b3315f9d8e 100644 --- a/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/impl/PsiSyntaxParserRuntimeFactoryImpl.kt +++ b/platform/syntax/syntax-psi/src/com/intellij/platform/syntax/psi/impl/PsiSyntaxParserRuntimeFactoryImpl.kt @@ -7,6 +7,7 @@ import com.intellij.openapi.diagnostic.logger import com.intellij.platform.syntax.parser.SyntaxTreeBuilder import com.intellij.platform.syntax.psi.LanguageSyntaxDefinitions import com.intellij.platform.syntax.psi.asSyntaxLogger +import com.intellij.platform.syntax.util.runtime.GrammarKitLanguageDefinition import com.intellij.platform.syntax.util.runtime.SyntaxGeneratedParserRuntime import com.intellij.platform.syntax.util.runtime.SyntaxParserRuntimeFactory @@ -14,6 +15,9 @@ internal class PsiSyntaxParserRuntimeFactoryImpl(private val language: Language) override fun buildParserRuntime(builder: SyntaxTreeBuilder, extendedState: SyntaxGeneratedParserRuntime.ParserUserState?): SyntaxGeneratedParserRuntime { val languageInformer = LanguageSyntaxDefinitions.INSTANCE.forLanguage(language) + if (languageInformer !is GrammarKitLanguageDefinition) { + error("Language $language is not supported by GrammarKit") + } return SyntaxGeneratedParserRuntime( syntaxBuilder = builder, isCaseSensitive = language.isCaseSensitive, diff --git a/platform/syntax/syntax-util/api-dump-experimental.txt b/platform/syntax/syntax-util/api-dump-experimental.txt index 1e4bab237301..b4363964df79 100644 --- a/platform/syntax/syntax-util/api-dump-experimental.txt +++ b/platform/syntax/syntax-util/api-dump-experimental.txt @@ -143,6 +143,9 @@ - setDebugMode(Z):V - setTokenTypeRemapper(com.intellij.platform.syntax.parser.SyntaxElementTypeRemapper):V - setWhitespaceSkippedCallback(com.intellij.platform.syntax.parser.WhitespaceSkippedCallback):V +*:com.intellij.platform.syntax.util.runtime.GrammarKitLanguageDefinition +- com.intellij.platform.syntax.LanguageSyntaxDefinition +- getPairedBraces():java.util.Collection *f:com.intellij.platform.syntax.util.runtime.Modifiers - *sf:Companion:com.intellij.platform.syntax.util.runtime.Modifiers$Companion - sf:and-thSIBIw(I,I):I diff --git a/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/runtime/GrammarKitLanguageDefinition.kt b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/runtime/GrammarKitLanguageDefinition.kt new file mode 100644 index 000000000000..403ccde48cee --- /dev/null +++ b/platform/syntax/syntax-util/src/com/intellij/platform/syntax/util/runtime/GrammarKitLanguageDefinition.kt @@ -0,0 +1,10 @@ +// 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.util.runtime + +import com.intellij.platform.syntax.LanguageSyntaxDefinition +import org.jetbrains.annotations.ApiStatus + +@ApiStatus.Experimental +interface GrammarKitLanguageDefinition : LanguageSyntaxDefinition { + fun getPairedBraces(): Collection = emptyList() +} \ No newline at end of file