From 520aff6ccf9124174355efa5f7d6557ed33d089d Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Wed, 20 Aug 2025 11:14:51 +0200 Subject: [PATCH] Java doc parsing: add lazy parsers for doc comments GitOrigin-RevId: c39a77d27e6d1e8c8ab484c9fcc95f5c3c30a614 --- .../element/JavaDocSyntaxElementType.kt | 6 ++-- .../lazyParser/JavaDocCommentParser.kt | 28 +++++++++++++++++++ .../element/lazyParser/JavaDocTypeParser.kt | 27 ++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 java/java-syntax/src/com/intellij/java/syntax/element/lazyParser/JavaDocCommentParser.kt create mode 100644 java/java-syntax/src/com/intellij/java/syntax/element/lazyParser/JavaDocTypeParser.kt diff --git a/java/java-syntax/src/com/intellij/java/syntax/element/JavaDocSyntaxElementType.kt b/java/java-syntax/src/com/intellij/java/syntax/element/JavaDocSyntaxElementType.kt index 8ea2af0c88c6..cf89d1552a5c 100644 --- a/java/java-syntax/src/com/intellij/java/syntax/element/JavaDocSyntaxElementType.kt +++ b/java/java-syntax/src/com/intellij/java/syntax/element/JavaDocSyntaxElementType.kt @@ -1,6 +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.java.syntax.element +import com.intellij.java.syntax.element.lazyParser.JavaDocCommentParser +import com.intellij.java.syntax.element.lazyParser.JavaDocTypeParser import com.intellij.platform.syntax.SyntaxElementType import kotlin.jvm.JvmField @@ -22,9 +24,9 @@ object JavaDocSyntaxElementType { @JvmField val DOC_REFERENCE_HOLDER: SyntaxElementType = SyntaxElementType("DOC_REFERENCE_HOLDER") - @JvmField val DOC_TYPE_HOLDER: SyntaxElementType = SyntaxElementType("DOC_TYPE_HOLDER") + @JvmField val DOC_TYPE_HOLDER: SyntaxElementType = SyntaxElementType("DOC_TYPE_HOLDER", lazyParser = JavaDocTypeParser()) - @JvmField val DOC_COMMENT: SyntaxElementType = SyntaxElementType("DOC_COMMENT") + @JvmField val DOC_COMMENT: SyntaxElementType = SyntaxElementType("DOC_COMMENT", lazyParser = JavaDocCommentParser()) @JvmField val DOC_MARKDOWN_CODE_BLOCK: SyntaxElementType = SyntaxElementType("DOC_CODE_BLOCK") @JvmField val DOC_MARKDOWN_REFERENCE_LINK: SyntaxElementType = SyntaxElementType("DOC_REFERENCE_LINK") @JvmField val DOC_MARKDOWN_REFERENCE_LABEL: SyntaxElementType = SyntaxElementType("DOC_REFERENCE_LABEL") diff --git a/java/java-syntax/src/com/intellij/java/syntax/element/lazyParser/JavaDocCommentParser.kt b/java/java-syntax/src/com/intellij/java/syntax/element/lazyParser/JavaDocCommentParser.kt new file mode 100644 index 000000000000..e74820f30292 --- /dev/null +++ b/java/java-syntax/src/com/intellij/java/syntax/element/lazyParser/JavaDocCommentParser.kt @@ -0,0 +1,28 @@ +// 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.element.lazyParser + +import com.intellij.java.syntax.element.JavaDocSyntaxElementType +import com.intellij.java.syntax.parser.JavaDocParser +import com.intellij.platform.syntax.LazyParser +import com.intellij.platform.syntax.LazyParsingContext +import com.intellij.platform.syntax.parser.ProductionResult +import com.intellij.platform.syntax.parser.prepareProduction +import com.intellij.pom.java.LanguageLevel + +internal class JavaDocCommentParser : LazyParser { + override fun parse(parsingContext: LazyParsingContext): ProductionResult { + val syntaxTreeBuilder = parsingContext.syntaxTreeBuilder + JavaDocParser(syntaxTreeBuilder, LanguageLevel.HIGHEST).parseDocCommentText() + return prepareProduction(syntaxTreeBuilder) + } + + override fun canBeReparsedIncrementally(parsingContext: LazyParsingContext): Boolean { + val newText = parsingContext.text + val tokenList = parsingContext.tokenList + + return tokenList.tokenCount == 1 && + tokenList.getTokenType(0) == JavaDocSyntaxElementType.DOC_COMMENT && + newText.startsWith("/**") && + newText.endsWith("*/") + } +} \ No newline at end of file diff --git a/java/java-syntax/src/com/intellij/java/syntax/element/lazyParser/JavaDocTypeParser.kt b/java/java-syntax/src/com/intellij/java/syntax/element/lazyParser/JavaDocTypeParser.kt new file mode 100644 index 000000000000..200e79769c62 --- /dev/null +++ b/java/java-syntax/src/com/intellij/java/syntax/element/lazyParser/JavaDocTypeParser.kt @@ -0,0 +1,27 @@ +// 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.element.lazyParser + +import com.intellij.java.syntax.lexer.JavaLexer +import com.intellij.java.syntax.lexer.JavaTypeEscapeLexer +import com.intellij.java.syntax.parser.JavaDocParser +import com.intellij.java.syntax.parser.JavaParser +import com.intellij.platform.syntax.LazyLexingContext +import com.intellij.platform.syntax.LazyParser +import com.intellij.platform.syntax.LazyParsingContext +import com.intellij.platform.syntax.lexer.Lexer +import com.intellij.platform.syntax.parser.ProductionResult +import com.intellij.platform.syntax.parser.prepareProduction +import com.intellij.pom.java.LanguageLevel + +internal class JavaDocTypeParser : LazyParser { + override fun parse(parsingContext: LazyParsingContext): ProductionResult { + val syntaxTreeBuilder = parsingContext.syntaxTreeBuilder + JavaDocParser(syntaxTreeBuilder, languageLevel).parseJavadocType(JavaParser(languageLevel)) + return prepareProduction(syntaxTreeBuilder) + } + + override fun createLexer(lexingContext: LazyLexingContext): Lexer = + JavaTypeEscapeLexer(JavaLexer(languageLevel)) + + private val languageLevel get() = LanguageLevel.JDK_1_3 +} \ No newline at end of file