From d2fe662a60f5dadee45a643a4ba82f308a0467d6 Mon Sep 17 00:00:00 2001 From: Ashrith Kumar Peddi Date: Fri, 15 Dec 2023 18:17:05 +0530 Subject: [PATCH 01/12] Support IntelliJ 2023.3 1. adds GitHub actions changes 2. add plugin info in the build.gradle.kts 3. adds IC-233 source folder --- .github/workflows/build.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- build.gradle.kts | 13 +++- .../intellij/formatting/ASTNodeUtils.kt | 18 +++++ .../IonCodeStyleSettingsProvider.kt | 33 +++++++++ .../formatting/IonFormattingModelBuilder.kt | 34 ++++++++++ .../formatting/blocks/IonSExpressionBlock.kt | 68 +++++++++++++++++++ .../intellij/psi/PsiElementExtensions.kt | 11 +++ 9 files changed, 179 insertions(+), 4 deletions(-) create mode 100644 src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt create mode 100644 src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt create mode 100644 src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt create mode 100644 src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt create mode 100644 src/IC-233/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 47b45ba..2281b8f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: strategy: fail-fast: false matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2"] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3"] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c37722e..137ffeb 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2"] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3"] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5c96e9e..82a10e5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: release: strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2" ] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3"] max-parallel: 1 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/build.gradle.kts b/build.gradle.kts index 3e8b7e3..db6f6b6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -52,10 +52,21 @@ val plugins = listOf( apiVersion = "1.6" ), dependencies = listOf("java", "Kotlin") + ), + PluginDescriptor( + since = "233", + until = "233.*", + sdkVersion = "IC-2023.3", + platformType = PlatformType.IdeaCommunity, + sourceFolder = "IC-233", + kotlin = KotlinOptions( + apiVersion = "1.6" + ), + dependencies = listOf("java", "Kotlin") ) ) -val defaultProductName = "IC-2023.2" +val defaultProductName = "IC-2023.3" val productName = System.getenv("PRODUCT_NAME") ?: defaultProductName val maybeGithubRunNumber = System.getenv("GITHUB_RUN_NUMBER")?.toInt() val descriptor = plugins.first { it.sdkVersion == productName } diff --git a/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt new file mode 100644 index 0000000..3531811 --- /dev/null +++ b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt @@ -0,0 +1,18 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.utils.filterWhitespace +import com.intellij.lang.ASTNode +import org.jetbrains.kotlin.idea.base.psi.getLineNumber +import org.jetbrains.kotlin.psi.psiUtil.siblings + +/** + * Determine if a node is on the same line as another node. + */ +fun ASTNode.sameLineAs(another: ASTNode) = + another.psi.getLineNumber(start = true) == this.psi.getLineNumber(start = true) + +/** + * Return the previous sibling of a node if it exists. + */ +fun ASTNode.previousSibling(): ASTNode? = + siblings(forward = false).filterWhitespace().firstOrNull() diff --git a/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt new file mode 100644 index 0000000..eb52d10 --- /dev/null +++ b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt @@ -0,0 +1,33 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.IonLanguage +import com.intellij.application.options.CodeStyleAbstractConfigurable +import com.intellij.application.options.CodeStyleAbstractPanel +import com.intellij.application.options.TabbedLanguageCodeStylePanel +import com.intellij.openapi.options.Configurable +import com.intellij.psi.codeStyle.CodeStyleSettings +import com.intellij.psi.codeStyle.CodeStyleSettingsProvider + +private const val CODE_STYLE_SETTINGS_DISPLAY_NAME = "Ion" + +class IonCodeStyleSettingsProvider : CodeStyleSettingsProvider() { + override fun getConfigurableDisplayName(): String = CODE_STYLE_SETTINGS_DISPLAY_NAME + + override fun createSettingsPage(settings: CodeStyleSettings, modelSettings: CodeStyleSettings): Configurable = + CodeStyleConfigurableConfiguration(settings, modelSettings) +} + +private class CodeStyleConfigurableConfiguration(settings: CodeStyleSettings, modelSettings: CodeStyleSettings) + : CodeStyleAbstractConfigurable(settings, modelSettings, CODE_STYLE_SETTINGS_DISPLAY_NAME) { + + override fun createPanel(settings: CodeStyleSettings): CodeStyleAbstractPanel = IonCodeStyleMainPanel(currentSettings, settings) + override fun getHelpTopic(): String? = null +} + +private class IonCodeStyleMainPanel(currentSettings: CodeStyleSettings, settings: CodeStyleSettings) + : TabbedLanguageCodeStylePanel(IonLanguage.INSTANCE, currentSettings, settings) { + + override fun initTabs(settings: CodeStyleSettings?) { + addIndentOptionsTab(settings) + } +} diff --git a/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt new file mode 100644 index 0000000..51a531b --- /dev/null +++ b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt @@ -0,0 +1,34 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.formatting.blocks.IonBlockOptions +import com.amazon.ion.plugin.intellij.formatting.blocks.RootIonBlock +import com.intellij.formatting.FormattingContext +import com.intellij.formatting.FormattingModel +import com.intellij.formatting.FormattingModelBuilder +import com.intellij.formatting.FormattingModelProvider + +/** + * Creates the block model for an Ion file. + * + * The block model will determine how elements are spaced, indented and aligned. + */ +class IonFormattingModelBuilder : FormattingModelBuilder { + override fun createModel(formattingContext: FormattingContext): FormattingModel { + val element = formattingContext.psiElement + val settings = formattingContext.codeStyleSettings + + val rootBlock = RootIonBlock( + node = element.node, + options = IonBlockOptions( + spaceBuilder = IonCodeBlockSpacingProvider(settings), + codeStyle = settings + ) + ) + + + return FormattingModelProvider.createFormattingModelForPsiFile( + element.containingFile, + rootBlock, settings + ) + } +} diff --git a/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt new file mode 100644 index 0000000..12d64d3 --- /dev/null +++ b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt @@ -0,0 +1,68 @@ +package com.amazon.ion.plugin.intellij.formatting.blocks + +import com.amazon.ion.plugin.intellij.formatting.previousSibling +import com.amazon.ion.plugin.intellij.formatting.sameLineAs +import com.amazon.ion.plugin.intellij.psi.IonTypes +import com.amazon.ion.plugin.intellij.psi.isOneLiner +import com.amazon.ion.plugin.intellij.utils.elementIsA +import com.intellij.lang.ASTNode +import com.intellij.openapi.diagnostic.debug +import com.intellij.openapi.diagnostic.logger +import com.intellij.psi.tree.IElementType +import org.jetbrains.kotlin.idea.base.psi.getLineNumber + +private val logger = logger() + +class IonSExpressionBlock( + node: ASTNode, + formatting: IonBlockFormattingOptions, + options: IonBlockOptions +) : AbstractIonBlock(node, formatting = formatting, options = options) { + + override val childIndentedTypes: Set = setOf( + IonTypes.VALUE, + IonTypes.COMMENT + ) + + override val childContainerTypes: Set = setOf( + IonTypes.SEXPRESSION_ELEMENTS + ) + + override val containerWrapperTypes: Set = setOf( + IonTypes.LPAREN, + IonTypes.RPAREN + ) + + override fun buildChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions = + buildSpecialCaseChildBlockFormatting(child) ?: + super.buildChildBlockFormatting(child) + + private fun buildSpecialCaseChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions? { + + // Lazy evaluate the previous sibling if needed. + val previous by lazy { child.previousSibling() } + + /** + * Check if we are the first comment within the expression, there is a special comment + * case where we don't want to apply the child alignment to the comment. For example: + * + * (join // special case comment which is inline with operator + * // child comments are inline with inner values + * anotherValue + * ) + */ + if (child elementIsA IonTypes.COMMENT && previous?.elementType == IonTypes.SEXPRESSION_OPERATOR) { + + logger.debug { "Formatting [${child.psi.getLineNumber()}] - Special case inline expression comment line" } + + val comment = child.psi + val expressionOperator = previous!! + + if (comment.isOneLiner() && child.sameLineAs(expressionOperator)) { + return IonBlockFormatting.sameAlignment(this) + } + } + + return null + } +} diff --git a/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt new file mode 100644 index 0000000..5c36ea7 --- /dev/null +++ b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt @@ -0,0 +1,11 @@ +package com.amazon.ion.plugin.intellij.psi + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.base.psi.getLineCount + +/** + * True if the element is all in a single line. + * + * Exists for Backwards Compatibility: <= IC-2020.2 + */ +fun PsiElement.isOneLiner() = getLineCount() == 1 From a9104705822fd4ed5d756512132ed412af47b721 Mon Sep 17 00:00:00 2001 From: Peddi Ashrith Kumar Date: Mon, 18 Dec 2023 14:44:37 +0530 Subject: [PATCH 02/12] Add trailing spaces to the products list in workflow files Co-authored-by: Khushboo <68757952+desaikd@users.noreply.github.com> --- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 137ffeb..7ea1f2c 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3"] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3" ] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 82a10e5..ba3ca56 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: release: strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3"] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3" ] max-parallel: 1 env: PRODUCT_NAME: ${{ matrix.product }} From 034dec577ad37b7b350fd486774176e8b36117b2 Mon Sep 17 00:00:00 2001 From: Matthew Pope <81593196+popematt@users.noreply.github.com> Date: Tue, 2 Jan 2024 11:39:40 -0800 Subject: [PATCH 03/12] Release v2.5.0 (#60) --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index db6f6b6..7da4c59 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -77,7 +77,7 @@ val pluginGroup: String by project // `pluginName_` variable ends with `_` because of the collision with Kotlin magic getter in the `intellij` closure. // Read more about the issue: https://github.com/JetBrains/intellij-platform-plugin-template/issues/29 val pluginName_: String by project -val pluginVersion: String = pluginVersion(major = "2", minor = "4", patch = "0") +val pluginVersion: String = pluginVersion(major = "2", minor = "5", patch = "0") val pluginDescriptionFile: String by project val pluginChangeNotesFile: String by project From 3f51baf8ca321eda3a64709242bc174f706e3c2b Mon Sep 17 00:00:00 2001 From: Richard Giliam Date: Fri, 19 Apr 2024 13:43:50 -0700 Subject: [PATCH 04/12] Support IntelliJ 2024.1, and update plugin version to v2.6.0 (#63) * Support IntelliJ 2024.1, and update release to v2.6.0 * Add IC-2024.1 to release.yml product list --- .github/workflows/build.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- build.gradle.kts | 15 +++- .../intellij/formatting/ASTNodeUtils.kt | 18 +++++ .../IonCodeStyleSettingsProvider.kt | 33 +++++++++ .../formatting/IonFormattingModelBuilder.kt | 34 ++++++++++ .../formatting/blocks/IonSExpressionBlock.kt | 68 +++++++++++++++++++ .../intellij/psi/PsiElementExtensions.kt | 11 +++ 9 files changed, 180 insertions(+), 5 deletions(-) create mode 100644 src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt create mode 100644 src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt create mode 100644 src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt create mode 100644 src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt create mode 100644 src/IC-241/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2281b8f..8be7196 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: strategy: fail-fast: false matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3"] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1"] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 7ea1f2c..7922b4d 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3" ] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ba3ca56..ea5f08f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: release: strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3" ] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] max-parallel: 1 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/build.gradle.kts b/build.gradle.kts index 7da4c59..343d644 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -63,10 +63,21 @@ val plugins = listOf( apiVersion = "1.6" ), dependencies = listOf("java", "Kotlin") + ), + PluginDescriptor( + since = "241", + until = "241.*", + sdkVersion = "IC-2024.1", + platformType = PlatformType.IdeaCommunity, + sourceFolder = "IC-241", + kotlin = KotlinOptions( + apiVersion = "1.6" + ), + dependencies = listOf("java", "Kotlin") ) ) -val defaultProductName = "IC-2023.3" +val defaultProductName = "IC-2024.1" val productName = System.getenv("PRODUCT_NAME") ?: defaultProductName val maybeGithubRunNumber = System.getenv("GITHUB_RUN_NUMBER")?.toInt() val descriptor = plugins.first { it.sdkVersion == productName } @@ -77,7 +88,7 @@ val pluginGroup: String by project // `pluginName_` variable ends with `_` because of the collision with Kotlin magic getter in the `intellij` closure. // Read more about the issue: https://github.com/JetBrains/intellij-platform-plugin-template/issues/29 val pluginName_: String by project -val pluginVersion: String = pluginVersion(major = "2", minor = "5", patch = "0") +val pluginVersion: String = pluginVersion(major = "2", minor = "6", patch = "0") val pluginDescriptionFile: String by project val pluginChangeNotesFile: String by project diff --git a/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt new file mode 100644 index 0000000..3531811 --- /dev/null +++ b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt @@ -0,0 +1,18 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.utils.filterWhitespace +import com.intellij.lang.ASTNode +import org.jetbrains.kotlin.idea.base.psi.getLineNumber +import org.jetbrains.kotlin.psi.psiUtil.siblings + +/** + * Determine if a node is on the same line as another node. + */ +fun ASTNode.sameLineAs(another: ASTNode) = + another.psi.getLineNumber(start = true) == this.psi.getLineNumber(start = true) + +/** + * Return the previous sibling of a node if it exists. + */ +fun ASTNode.previousSibling(): ASTNode? = + siblings(forward = false).filterWhitespace().firstOrNull() diff --git a/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt new file mode 100644 index 0000000..eb52d10 --- /dev/null +++ b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt @@ -0,0 +1,33 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.IonLanguage +import com.intellij.application.options.CodeStyleAbstractConfigurable +import com.intellij.application.options.CodeStyleAbstractPanel +import com.intellij.application.options.TabbedLanguageCodeStylePanel +import com.intellij.openapi.options.Configurable +import com.intellij.psi.codeStyle.CodeStyleSettings +import com.intellij.psi.codeStyle.CodeStyleSettingsProvider + +private const val CODE_STYLE_SETTINGS_DISPLAY_NAME = "Ion" + +class IonCodeStyleSettingsProvider : CodeStyleSettingsProvider() { + override fun getConfigurableDisplayName(): String = CODE_STYLE_SETTINGS_DISPLAY_NAME + + override fun createSettingsPage(settings: CodeStyleSettings, modelSettings: CodeStyleSettings): Configurable = + CodeStyleConfigurableConfiguration(settings, modelSettings) +} + +private class CodeStyleConfigurableConfiguration(settings: CodeStyleSettings, modelSettings: CodeStyleSettings) + : CodeStyleAbstractConfigurable(settings, modelSettings, CODE_STYLE_SETTINGS_DISPLAY_NAME) { + + override fun createPanel(settings: CodeStyleSettings): CodeStyleAbstractPanel = IonCodeStyleMainPanel(currentSettings, settings) + override fun getHelpTopic(): String? = null +} + +private class IonCodeStyleMainPanel(currentSettings: CodeStyleSettings, settings: CodeStyleSettings) + : TabbedLanguageCodeStylePanel(IonLanguage.INSTANCE, currentSettings, settings) { + + override fun initTabs(settings: CodeStyleSettings?) { + addIndentOptionsTab(settings) + } +} diff --git a/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt new file mode 100644 index 0000000..51a531b --- /dev/null +++ b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt @@ -0,0 +1,34 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.formatting.blocks.IonBlockOptions +import com.amazon.ion.plugin.intellij.formatting.blocks.RootIonBlock +import com.intellij.formatting.FormattingContext +import com.intellij.formatting.FormattingModel +import com.intellij.formatting.FormattingModelBuilder +import com.intellij.formatting.FormattingModelProvider + +/** + * Creates the block model for an Ion file. + * + * The block model will determine how elements are spaced, indented and aligned. + */ +class IonFormattingModelBuilder : FormattingModelBuilder { + override fun createModel(formattingContext: FormattingContext): FormattingModel { + val element = formattingContext.psiElement + val settings = formattingContext.codeStyleSettings + + val rootBlock = RootIonBlock( + node = element.node, + options = IonBlockOptions( + spaceBuilder = IonCodeBlockSpacingProvider(settings), + codeStyle = settings + ) + ) + + + return FormattingModelProvider.createFormattingModelForPsiFile( + element.containingFile, + rootBlock, settings + ) + } +} diff --git a/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt new file mode 100644 index 0000000..12d64d3 --- /dev/null +++ b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt @@ -0,0 +1,68 @@ +package com.amazon.ion.plugin.intellij.formatting.blocks + +import com.amazon.ion.plugin.intellij.formatting.previousSibling +import com.amazon.ion.plugin.intellij.formatting.sameLineAs +import com.amazon.ion.plugin.intellij.psi.IonTypes +import com.amazon.ion.plugin.intellij.psi.isOneLiner +import com.amazon.ion.plugin.intellij.utils.elementIsA +import com.intellij.lang.ASTNode +import com.intellij.openapi.diagnostic.debug +import com.intellij.openapi.diagnostic.logger +import com.intellij.psi.tree.IElementType +import org.jetbrains.kotlin.idea.base.psi.getLineNumber + +private val logger = logger() + +class IonSExpressionBlock( + node: ASTNode, + formatting: IonBlockFormattingOptions, + options: IonBlockOptions +) : AbstractIonBlock(node, formatting = formatting, options = options) { + + override val childIndentedTypes: Set = setOf( + IonTypes.VALUE, + IonTypes.COMMENT + ) + + override val childContainerTypes: Set = setOf( + IonTypes.SEXPRESSION_ELEMENTS + ) + + override val containerWrapperTypes: Set = setOf( + IonTypes.LPAREN, + IonTypes.RPAREN + ) + + override fun buildChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions = + buildSpecialCaseChildBlockFormatting(child) ?: + super.buildChildBlockFormatting(child) + + private fun buildSpecialCaseChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions? { + + // Lazy evaluate the previous sibling if needed. + val previous by lazy { child.previousSibling() } + + /** + * Check if we are the first comment within the expression, there is a special comment + * case where we don't want to apply the child alignment to the comment. For example: + * + * (join // special case comment which is inline with operator + * // child comments are inline with inner values + * anotherValue + * ) + */ + if (child elementIsA IonTypes.COMMENT && previous?.elementType == IonTypes.SEXPRESSION_OPERATOR) { + + logger.debug { "Formatting [${child.psi.getLineNumber()}] - Special case inline expression comment line" } + + val comment = child.psi + val expressionOperator = previous!! + + if (comment.isOneLiner() && child.sameLineAs(expressionOperator)) { + return IonBlockFormatting.sameAlignment(this) + } + } + + return null + } +} diff --git a/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt new file mode 100644 index 0000000..5c36ea7 --- /dev/null +++ b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt @@ -0,0 +1,11 @@ +package com.amazon.ion.plugin.intellij.psi + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.base.psi.getLineCount + +/** + * True if the element is all in a single line. + * + * Exists for Backwards Compatibility: <= IC-2020.2 + */ +fun PsiElement.isOneLiner() = getLineCount() == 1 From e5896f32da74e8f034adee5ec7f2e1138139c239 Mon Sep 17 00:00:00 2001 From: Khushboo <68757952+desaikd@users.noreply.github.com> Date: Tue, 11 Jun 2024 09:09:35 -0700 Subject: [PATCH 05/12] Fixes SExpression formatting (#65) * Changes SExpression children to use `SEXPRESSION_ATOM` instead of `VALUE` * Adds changes in `IonSExpressionBlock` to consider `SEXPRESSION_ATOM` as children as per BNF grammar * Adds changes in `IonCodeBlockSpacing` to correctly consider `SEXPRESSION_ATOM` as children as per BNF grammar * Adds changes in tests for usign correct node names * Adds changes for PR workflow to run Gradle Build task --- .github/workflows/pr.yml | 4 ++ .../formatting/blocks/IonSExpressionBlock.kt | 2 +- .../formatting/blocks/IonSExpressionBlock.kt | 2 +- .../formatting/blocks/IonSExpressionBlock.kt | 2 +- .../formatting/blocks/IonSExpressionBlock.kt | 2 +- .../formatting/blocks/IonSExpressionBlock.kt | 2 +- .../formatting/IonCodeBlockSpacingProvider.kt | 2 +- .../intellij/parser/IonBasicParsingTest.kt | 62 ++++++++++--------- .../intellij/parser/IonPartialParsingTest.kt | 19 +++--- 9 files changed, 53 insertions(+), 44 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 7922b4d..5c6e581 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -81,6 +81,10 @@ jobs: echo "::set-output name=name::$NAME" echo "::set-output name=artifact::$ARTIFACT" + # Build artifact using build Gradle task + - name: Build + run: ./gradlew build + # Build artifact using buildPlugin Gradle task - name: Build Plugin run: ./gradlew buildPlugin diff --git a/src/IC-222/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-222/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt index c7e1c91..7aeff8d 100644 --- a/src/IC-222/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt +++ b/src/IC-222/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt @@ -20,7 +20,7 @@ class IonSExpressionBlock( ) : AbstractIonBlock(node, formatting = formatting, options = options) { override val childIndentedTypes: Set = setOf( - IonTypes.VALUE, + IonTypes.SEXPRESSION_ATOM, IonTypes.COMMENT ) diff --git a/src/IC-231/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-231/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt index 12d64d3..ac0223e 100644 --- a/src/IC-231/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt +++ b/src/IC-231/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt @@ -20,7 +20,7 @@ class IonSExpressionBlock( ) : AbstractIonBlock(node, formatting = formatting, options = options) { override val childIndentedTypes: Set = setOf( - IonTypes.VALUE, + IonTypes.SEXPRESSION_ATOM, IonTypes.COMMENT ) diff --git a/src/IC-232/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-232/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt index 12d64d3..ac0223e 100644 --- a/src/IC-232/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt +++ b/src/IC-232/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt @@ -20,7 +20,7 @@ class IonSExpressionBlock( ) : AbstractIonBlock(node, formatting = formatting, options = options) { override val childIndentedTypes: Set = setOf( - IonTypes.VALUE, + IonTypes.SEXPRESSION_ATOM, IonTypes.COMMENT ) diff --git a/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt index 12d64d3..ac0223e 100644 --- a/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt +++ b/src/IC-233/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt @@ -20,7 +20,7 @@ class IonSExpressionBlock( ) : AbstractIonBlock(node, formatting = formatting, options = options) { override val childIndentedTypes: Set = setOf( - IonTypes.VALUE, + IonTypes.SEXPRESSION_ATOM, IonTypes.COMMENT ) diff --git a/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt index 12d64d3..ac0223e 100644 --- a/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt +++ b/src/IC-241/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt @@ -20,7 +20,7 @@ class IonSExpressionBlock( ) : AbstractIonBlock(node, formatting = formatting, options = options) { override val childIndentedTypes: Set = setOf( - IonTypes.VALUE, + IonTypes.SEXPRESSION_ATOM, IonTypes.COMMENT ) diff --git a/src/main/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeBlockSpacingProvider.kt b/src/main/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeBlockSpacingProvider.kt index 49f9e9f..5b96cc6 100644 --- a/src/main/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeBlockSpacingProvider.kt +++ b/src/main/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeBlockSpacingProvider.kt @@ -97,7 +97,7 @@ private fun createSpaceBuilder(settings: CodeStyleSettings) = before(IonTypes.SEXPRESSION_OPERATOR).none() before(IonTypes.RPAREN).lineBreakInCode() - beforeInside(IonTypes.VALUE, IonTypes.SEXPRESSION).lineBreakInCode() + beforeInside(IonTypes.SEXPRESSION_ATOM, IonTypes.SEXPRESSION).lineBreakInCode() /** * Separator spacing, by default no space before and one space after separator, like JSON. diff --git a/src/test/kotlin/com/amazon/ion/plugin/intellij/parser/IonBasicParsingTest.kt b/src/test/kotlin/com/amazon/ion/plugin/intellij/parser/IonBasicParsingTest.kt index 89cc0ee..b2c21e4 100644 --- a/src/test/kotlin/com/amazon/ion/plugin/intellij/parser/IonBasicParsingTest.kt +++ b/src/test/kotlin/com/amazon/ion/plugin/intellij/parser/IonBasicParsingTest.kt @@ -67,7 +67,7 @@ class IonBasicParsingTest : IonParserTestCaseBase(dataPath = "basic") { IonListImpl(LIST) PsiElement(LBRACKET)('[') PsiWhiteSpace(' ') - IonElementsImpl(ELEMENTS) + IonListElementsImpl(LIST_ELEMENTS) IonValueImpl(VALUE) IonSymbolImpl(SYMBOL) PsiElement(IDENTIFIER)('key') @@ -87,7 +87,7 @@ class IonBasicParsingTest : IonParserTestCaseBase(dataPath = "basic") { IonListImpl(LIST) PsiElement(LBRACKET)('[') PsiWhiteSpace(' ') - IonElementsImpl(ELEMENTS) + IonListElementsImpl(LIST_ELEMENTS) IonValueImpl(VALUE) IonSymbolImpl(SYMBOL) PsiElement(IDENTIFIER)('key') @@ -107,28 +107,31 @@ class IonBasicParsingTest : IonParserTestCaseBase(dataPath = "basic") { IonContainerImpl(CONTAINER) IonSexpressionImpl(SEXPRESSION) PsiElement(LPAREN)('(') - IonAtomsImpl(ATOMS) - IonValueImpl(VALUE) - IonStringImpl(STRING) - IonQqStringImpl(QQ_STRING) - PsiElement(QQ_START)('"') - PsiElement(QQ_VALUE)('first') - PsiElement(QQ_END)('"') + IonSexpressionElementsImpl(SEXPRESSION_ELEMENTS) + IonSexpressionAtomImpl(SEXPRESSION_ATOM) + IonValueImpl(VALUE) + IonStringImpl(STRING) + IonQqStringImpl(QQ_STRING) + PsiElement(QQ_START)('"') + PsiElement(QQ_VALUE)('first') + PsiElement(QQ_END)('"') PsiWhiteSpace(' ') - IonValueImpl(VALUE) - IonStringImpl(STRING) - IonQqStringImpl(QQ_STRING) - PsiElement(QQ_START)('"') - PsiElement(QQ_VALUE)('second') - PsiElement(QQ_END)('"') + IonSexpressionAtomImpl(SEXPRESSION_ATOM) + IonValueImpl(VALUE) + IonStringImpl(STRING) + IonQqStringImpl(QQ_STRING) + PsiElement(QQ_START)('"') + PsiElement(QQ_VALUE)('second') + PsiElement(QQ_END)('"') PsiWhiteSpace(' ') - IonValueImpl(VALUE) - IonContainerImpl(CONTAINER) - IonStructImpl(STRUCT) - PsiElement(LBRACE)('{') - IonMembersImpl(MEMBERS) - - PsiElement(RBRACE)('}') + IonSexpressionAtomImpl(SEXPRESSION_ATOM) + IonValueImpl(VALUE) + IonContainerImpl(CONTAINER) + IonStructImpl(STRUCT) + PsiElement(LBRACE)('{') + IonMembersImpl(MEMBERS) + + PsiElement(RBRACE)('}') PsiElement(RPAREN)(')') """ ) @@ -143,14 +146,15 @@ class IonBasicParsingTest : IonParserTestCaseBase(dataPath = "basic") { IonContainerImpl(CONTAINER) IonSexpressionImpl(SEXPRESSION) PsiElement(LPAREN)('(') - IonSexpressionOperatorImpl(SEXPRESSION_OPERATOR) - IonSymbolImpl(SYMBOL) - PsiElement(IDENTIFIER)('test') - PsiWhiteSpace(' ') - IonAtomsImpl(ATOMS) - IonValueImpl(VALUE) + IonSexpressionElementsImpl(SEXPRESSION_ELEMENTS) + IonSexpressionOperatorImpl(SEXPRESSION_OPERATOR) IonSymbolImpl(SYMBOL) - PsiElement(IDENTIFIER)('element') + PsiElement(IDENTIFIER)('test') + PsiWhiteSpace(' ') + IonSexpressionAtomImpl(SEXPRESSION_ATOM) + IonValueImpl(VALUE) + IonSymbolImpl(SYMBOL) + PsiElement(IDENTIFIER)('element') PsiElement(RPAREN)(')') """ ) diff --git a/src/test/kotlin/com/amazon/ion/plugin/intellij/parser/IonPartialParsingTest.kt b/src/test/kotlin/com/amazon/ion/plugin/intellij/parser/IonPartialParsingTest.kt index 191cdae..e040606 100644 --- a/src/test/kotlin/com/amazon/ion/plugin/intellij/parser/IonPartialParsingTest.kt +++ b/src/test/kotlin/com/amazon/ion/plugin/intellij/parser/IonPartialParsingTest.kt @@ -13,7 +13,7 @@ class IonPartialParsingTest : IonParserTestCaseBase(dataPath = "partial") { IonListImpl(LIST) PsiElement(LBRACKET)('[') PsiWhiteSpace(' ') - IonElementsImpl(ELEMENTS) + IonListElementsImpl(LIST_ELEMENTS) IonValueImpl(VALUE) IonSymbolImpl(SYMBOL) PsiElement(IDENTIFIER)('element') @@ -75,14 +75,15 @@ class IonPartialParsingTest : IonParserTestCaseBase(dataPath = "partial") { IonSexpressionImpl(SEXPRESSION) PsiElement(LPAREN)('(') PsiWhiteSpace(' ') - IonAtomsImpl(ATOMS) - IonValueImpl(VALUE) - IonBlobImpl(BLOB) - PsiElement(LOB_START)('{{') - PsiWhiteSpace(' ') - PsiElement(BAD_CHARACTER)('abcde_not_valid_base64') - PsiWhiteSpace(' ') - PsiElement(LOB_END)('}}') + IonSexpressionElementsImpl(SEXPRESSION_ELEMENTS) + IonSexpressionAtomImpl(SEXPRESSION_ATOM) + IonValueImpl(VALUE) + IonBlobImpl(BLOB) + PsiElement(LOB_START)('{{') + PsiWhiteSpace(' ') + PsiElement(BAD_CHARACTER)('abcde_not_valid_base64') + PsiWhiteSpace(' ') + PsiElement(LOB_END)('}}') PsiWhiteSpace(' ') PsiElement(RPAREN)(')') """ From 5492a1b13067e7d71307de03c5176adda2f12748 Mon Sep 17 00:00:00 2001 From: Khushboo <68757952+desaikd@users.noreply.github.com> Date: Tue, 11 Jun 2024 09:23:09 -0700 Subject: [PATCH 06/12] Bumps version to v2.6.1 (#68) --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 343d644..a02cf98 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -88,7 +88,7 @@ val pluginGroup: String by project // `pluginName_` variable ends with `_` because of the collision with Kotlin magic getter in the `intellij` closure. // Read more about the issue: https://github.com/JetBrains/intellij-platform-plugin-template/issues/29 val pluginName_: String by project -val pluginVersion: String = pluginVersion(major = "2", minor = "6", patch = "0") +val pluginVersion: String = pluginVersion(major = "2", minor = "6", patch = "1") val pluginDescriptionFile: String by project val pluginChangeNotesFile: String by project From c453241b32e4a40979069c98ceefd518a8fc4a83 Mon Sep 17 00:00:00 2001 From: Ashrith Kumar Peddi Date: Fri, 13 Sep 2024 16:58:00 +0530 Subject: [PATCH 07/12] Support IntelliJ 2024.2 1. Adds IC-242 source folder 2. Upgrade gradle. Intellij 2024+ (242+) needs gradle 8.2+ 3. Add plugin info in the build.gradle.kts 4. Adds GitHub actions changes --- .github/workflows/build.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- .gitignore | 1 + build.gradle.kts | 137 +++++++++++------- .../main/kotlin/plugin/PluginDescriptor.kt | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../intellij/formatting/ASTNodeUtils.kt | 18 +++ .../IonCodeStyleSettingsProvider.kt | 33 +++++ .../formatting/IonFormattingModelBuilder.kt | 34 +++++ .../formatting/blocks/IonSExpressionBlock.kt | 68 +++++++++ .../intellij/psi/PsiElementExtensions.kt | 11 ++ 12 files changed, 259 insertions(+), 61 deletions(-) create mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt create mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt create mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt create mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt create mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8be7196..39fefd2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: strategy: fail-fast: false matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1"] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "2024.2" ] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 5c6e581..6eaf0c8 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "IC-2024.2" ] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ea5f08f..16c69fb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: release: strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "IC-2024.2" ] max-parallel: 1 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.gitignore b/.gitignore index efa321e..38cd228 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ build *.iml *.ipr *.iws +.intellijPlatform diff --git a/build.gradle.kts b/build.gradle.kts index a02cf98..dfedb3c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.intellij.platform.gradle.IntelliJPlatformType +import org.jetbrains.intellij.platform.gradle.models.ProductRelease import plugin.PluginDescriptor import plugin.PluginDescriptor.KotlinOptions import plugin.PlatformType @@ -12,75 +14,90 @@ buildscript { plugins { kotlin("jvm") - id("org.jetbrains.intellij") version "1.15.0" + id("org.jetbrains.intellij.platform") version "2.0.1" } repositories { mavenCentral() + + intellijPlatform { + defaultRepositories() + } } val plugins = listOf( PluginDescriptor( since = "222", until = "223.*", - sdkVersion = "IC-2022.2", + platformVersion = "2022.2", platformType = PlatformType.IdeaCommunity, sourceFolder = "IC-222", kotlin = KotlinOptions( apiVersion = "1.6" ), - dependencies = listOf("java", "Kotlin") + bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") ), PluginDescriptor( since = "231", until = "231.*", - sdkVersion = "IC-2023.1", + platformVersion = "2023.1", platformType = PlatformType.IdeaCommunity, sourceFolder = "IC-231", kotlin = KotlinOptions( apiVersion = "1.6" ), - dependencies = listOf("java", "Kotlin") + bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") ), PluginDescriptor( since = "232", until = "232.*", - sdkVersion = "IC-2023.2", + platformVersion = "2023.2", platformType = PlatformType.IdeaCommunity, sourceFolder = "IC-232", kotlin = KotlinOptions( apiVersion = "1.6" ), - dependencies = listOf("java", "Kotlin") + bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") ), PluginDescriptor( since = "233", until = "233.*", - sdkVersion = "IC-2023.3", + platformVersion = "2023.3", platformType = PlatformType.IdeaCommunity, sourceFolder = "IC-233", kotlin = KotlinOptions( apiVersion = "1.6" ), - dependencies = listOf("java", "Kotlin") + bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") ), PluginDescriptor( - since = "241", - until = "241.*", - sdkVersion = "IC-2024.1", - platformType = PlatformType.IdeaCommunity, - sourceFolder = "IC-241", - kotlin = KotlinOptions( - apiVersion = "1.6" - ), - dependencies = listOf("java", "Kotlin") + since = "241", + until = "241.*", + platformVersion = "2024.1", + platformType = PlatformType.IdeaCommunity, + sourceFolder = "IC-241", + kotlin = KotlinOptions( + apiVersion = "1.6" + ), + bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") + ), + PluginDescriptor( + since = "242", + until = "242.*", + platformVersion = "2024.2", + platformType = PlatformType.IdeaCommunity, + sourceFolder = "IC-242", + kotlin = KotlinOptions( + apiVersion = "1.6" + ), + bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") ) ) -val defaultProductName = "IC-2024.1" +val defaultProductName = "2024.2" val productName = System.getenv("PRODUCT_NAME") ?: defaultProductName val maybeGithubRunNumber = System.getenv("GITHUB_RUN_NUMBER")?.toInt() -val descriptor = plugins.first { it.sdkVersion == productName } +val descriptor = plugins.first { it.platformVersion == productName } // Import variables from gradle.properties file val pluginGroup: String by project @@ -88,7 +105,7 @@ val pluginGroup: String by project // `pluginName_` variable ends with `_` because of the collision with Kotlin magic getter in the `intellij` closure. // Read more about the issue: https://github.com/JetBrains/intellij-platform-plugin-template/issues/29 val pluginName_: String by project -val pluginVersion: String = pluginVersion(major = "2", minor = "6", patch = "1") +val pluginVersion: String = pluginVersion(major = "2", minor = "7", patch = "1") val pluginDescriptionFile: String by project val pluginChangeNotesFile: String by project @@ -98,22 +115,51 @@ val packageVersion: String by project group = pluginGroup version = packageVersion -logger.lifecycle("Building Amazon Ion $pluginVersion for ${descriptor.platformType} ${descriptor.sdkVersion}") +logger.lifecycle("Building Amazon Ion $pluginVersion for ${descriptor.platformType} ${descriptor.platformVersion}") dependencies { - // Kotlin runtime dependency is provided by the IntelliJ platform. + intellijPlatform { + create(descriptor.platformType.acronym, descriptor.platformVersion) // https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin.html#setting-up-intellij-platform + bundledPlugins(descriptor.bundledDependencies) + pluginVerifier() + instrumentationTools() + } } -intellij { - pluginName.set(pluginName_) - version.set(descriptor.sdkVersion) - type.set(descriptor.platformType.acronym) - downloadSources.set(true) - updateSinceUntilBuild.set(false) +intellijPlatform { + pluginConfiguration { + name.set(pluginName_) + version.set(descriptor.platformVersion) + description.set(readResource(pluginDescriptionFile)) + changeNotes.set(readResource(pluginChangeNotesFile)) + + ideaVersion { + sinceBuild.set(descriptor.since) + untilBuild.set(descriptor.until) + } + } + + publishing { + token.set(System.getenv("PUBLISH_TOKEN")) - // Plugin Dependencies -> https://www.jetbrains.org/intellij/sdk/docs/basics/plugin_structure/plugin_dependencies.html - // Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22 - plugins.set(descriptor.dependencies) + // Publish to beta unless release is specified. + if (System.getenv("PUBLISH_CHANNEL") != "release") { + channels.set(listOf("beta")) + } + } + + pluginVerification { + ides { + ide(IntelliJPlatformType.IntellijIdeaCommunity, descriptor.platformVersion) + recommended() + select { + types.set(listOf(IntelliJPlatformType.IntellijIdeaCommunity)) + channels.set(listOf(ProductRelease.Channel.BETA)) + sinceBuild.set(descriptor.since) + untilBuild.set(descriptor.until) + } + } + } } sourceSets { @@ -155,25 +201,7 @@ tasks { } buildPlugin { - archiveClassifier.set(descriptor.sdkVersion) - } - - patchPluginXml { - version.set(pluginVersion) - sinceBuild.set(descriptor.since) - untilBuild.set(descriptor.until) - - pluginDescription.set(readResource(pluginDescriptionFile)) - changeNotes.set(readResource(pluginChangeNotesFile)) - } - - publishPlugin { - token.set(System.getenv("PUBLISH_TOKEN")) - - // Publish to beta unless release is specified. - if (System.getenv("PUBLISH_CHANNEL") != "release") { - channels.set(listOf("beta")) - } + archiveClassifier.set(descriptor.getSDKVersion()) } } @@ -192,7 +220,7 @@ fun readResource(name: String) = file("resources/$name").readText() * major: 2 * minor: 1 * patch: 1 - * sdkVersion: IC-2022.2 + * sdkVersion: 2022.2 * * RETURNS: * 2.1.1+30-IC-2022.2 @@ -203,7 +231,7 @@ fun readResource(name: String) = file("resources/$name").readText() * major: 2 * minor: 2 * patch: 34 - * sdkVersion: IC-2022.3 + * sdkVersion: 2022.3 * * RETURNS: * 2.2.34+0-IC-2022.3+alpha @@ -212,5 +240,6 @@ fun pluginVersion(major: String, minor: String, patch: String) = listOf( major, minor, - maybeGithubRunNumber?.let { "$patch+$it-${descriptor.sdkVersion}" } ?: "$patch+0-${descriptor.sdkVersion}+alpha" + maybeGithubRunNumber?.let { "$patch+$it-${descriptor.getSDKVersion()}" } + ?: "$patch+0-${descriptor.getSDKVersion()}+alpha" ).joinToString(".") diff --git a/buildSrc/src/main/kotlin/plugin/PluginDescriptor.kt b/buildSrc/src/main/kotlin/plugin/PluginDescriptor.kt index b1fb21f..e4919e3 100644 --- a/buildSrc/src/main/kotlin/plugin/PluginDescriptor.kt +++ b/buildSrc/src/main/kotlin/plugin/PluginDescriptor.kt @@ -23,9 +23,9 @@ data class PluginDescriptor( val platformType: PlatformType, /** - * The Platform SDK Version that this distribution will run on. + * The Platform Version that this distribution will run on. */ - val sdkVersion: String, + val platformVersion: String, /** * Source folder which defines source code specific to this distribution. @@ -40,7 +40,7 @@ data class PluginDescriptor( /** * Plugin dependencies. {@see https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html} */ - val dependencies: List + val bundledDependencies: List ) { data class KotlinOptions( /** @@ -49,6 +49,10 @@ data class PluginDescriptor( */ val apiVersion: String ) + + fun getSDKVersion(): String { + return platformType.acronym + "-" + platformVersion + } } enum class PlatformType(val acronym: String) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 98debb8..d642e7f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt new file mode 100644 index 0000000..3531811 --- /dev/null +++ b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt @@ -0,0 +1,18 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.utils.filterWhitespace +import com.intellij.lang.ASTNode +import org.jetbrains.kotlin.idea.base.psi.getLineNumber +import org.jetbrains.kotlin.psi.psiUtil.siblings + +/** + * Determine if a node is on the same line as another node. + */ +fun ASTNode.sameLineAs(another: ASTNode) = + another.psi.getLineNumber(start = true) == this.psi.getLineNumber(start = true) + +/** + * Return the previous sibling of a node if it exists. + */ +fun ASTNode.previousSibling(): ASTNode? = + siblings(forward = false).filterWhitespace().firstOrNull() diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt new file mode 100644 index 0000000..eb52d10 --- /dev/null +++ b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt @@ -0,0 +1,33 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.IonLanguage +import com.intellij.application.options.CodeStyleAbstractConfigurable +import com.intellij.application.options.CodeStyleAbstractPanel +import com.intellij.application.options.TabbedLanguageCodeStylePanel +import com.intellij.openapi.options.Configurable +import com.intellij.psi.codeStyle.CodeStyleSettings +import com.intellij.psi.codeStyle.CodeStyleSettingsProvider + +private const val CODE_STYLE_SETTINGS_DISPLAY_NAME = "Ion" + +class IonCodeStyleSettingsProvider : CodeStyleSettingsProvider() { + override fun getConfigurableDisplayName(): String = CODE_STYLE_SETTINGS_DISPLAY_NAME + + override fun createSettingsPage(settings: CodeStyleSettings, modelSettings: CodeStyleSettings): Configurable = + CodeStyleConfigurableConfiguration(settings, modelSettings) +} + +private class CodeStyleConfigurableConfiguration(settings: CodeStyleSettings, modelSettings: CodeStyleSettings) + : CodeStyleAbstractConfigurable(settings, modelSettings, CODE_STYLE_SETTINGS_DISPLAY_NAME) { + + override fun createPanel(settings: CodeStyleSettings): CodeStyleAbstractPanel = IonCodeStyleMainPanel(currentSettings, settings) + override fun getHelpTopic(): String? = null +} + +private class IonCodeStyleMainPanel(currentSettings: CodeStyleSettings, settings: CodeStyleSettings) + : TabbedLanguageCodeStylePanel(IonLanguage.INSTANCE, currentSettings, settings) { + + override fun initTabs(settings: CodeStyleSettings?) { + addIndentOptionsTab(settings) + } +} diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt new file mode 100644 index 0000000..51a531b --- /dev/null +++ b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt @@ -0,0 +1,34 @@ +package com.amazon.ion.plugin.intellij.formatting + +import com.amazon.ion.plugin.intellij.formatting.blocks.IonBlockOptions +import com.amazon.ion.plugin.intellij.formatting.blocks.RootIonBlock +import com.intellij.formatting.FormattingContext +import com.intellij.formatting.FormattingModel +import com.intellij.formatting.FormattingModelBuilder +import com.intellij.formatting.FormattingModelProvider + +/** + * Creates the block model for an Ion file. + * + * The block model will determine how elements are spaced, indented and aligned. + */ +class IonFormattingModelBuilder : FormattingModelBuilder { + override fun createModel(formattingContext: FormattingContext): FormattingModel { + val element = formattingContext.psiElement + val settings = formattingContext.codeStyleSettings + + val rootBlock = RootIonBlock( + node = element.node, + options = IonBlockOptions( + spaceBuilder = IonCodeBlockSpacingProvider(settings), + codeStyle = settings + ) + ) + + + return FormattingModelProvider.createFormattingModelForPsiFile( + element.containingFile, + rootBlock, settings + ) + } +} diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt new file mode 100644 index 0000000..ac0223e --- /dev/null +++ b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt @@ -0,0 +1,68 @@ +package com.amazon.ion.plugin.intellij.formatting.blocks + +import com.amazon.ion.plugin.intellij.formatting.previousSibling +import com.amazon.ion.plugin.intellij.formatting.sameLineAs +import com.amazon.ion.plugin.intellij.psi.IonTypes +import com.amazon.ion.plugin.intellij.psi.isOneLiner +import com.amazon.ion.plugin.intellij.utils.elementIsA +import com.intellij.lang.ASTNode +import com.intellij.openapi.diagnostic.debug +import com.intellij.openapi.diagnostic.logger +import com.intellij.psi.tree.IElementType +import org.jetbrains.kotlin.idea.base.psi.getLineNumber + +private val logger = logger() + +class IonSExpressionBlock( + node: ASTNode, + formatting: IonBlockFormattingOptions, + options: IonBlockOptions +) : AbstractIonBlock(node, formatting = formatting, options = options) { + + override val childIndentedTypes: Set = setOf( + IonTypes.SEXPRESSION_ATOM, + IonTypes.COMMENT + ) + + override val childContainerTypes: Set = setOf( + IonTypes.SEXPRESSION_ELEMENTS + ) + + override val containerWrapperTypes: Set = setOf( + IonTypes.LPAREN, + IonTypes.RPAREN + ) + + override fun buildChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions = + buildSpecialCaseChildBlockFormatting(child) ?: + super.buildChildBlockFormatting(child) + + private fun buildSpecialCaseChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions? { + + // Lazy evaluate the previous sibling if needed. + val previous by lazy { child.previousSibling() } + + /** + * Check if we are the first comment within the expression, there is a special comment + * case where we don't want to apply the child alignment to the comment. For example: + * + * (join // special case comment which is inline with operator + * // child comments are inline with inner values + * anotherValue + * ) + */ + if (child elementIsA IonTypes.COMMENT && previous?.elementType == IonTypes.SEXPRESSION_OPERATOR) { + + logger.debug { "Formatting [${child.psi.getLineNumber()}] - Special case inline expression comment line" } + + val comment = child.psi + val expressionOperator = previous!! + + if (comment.isOneLiner() && child.sameLineAs(expressionOperator)) { + return IonBlockFormatting.sameAlignment(this) + } + } + + return null + } +} diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt new file mode 100644 index 0000000..5c36ea7 --- /dev/null +++ b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt @@ -0,0 +1,11 @@ +package com.amazon.ion.plugin.intellij.psi + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.idea.base.psi.getLineCount + +/** + * True if the element is all in a single line. + * + * Exists for Backwards Compatibility: <= IC-2020.2 + */ +fun PsiElement.isOneLiner() = getLineCount() == 1 From 451e4cca1f31bb8ea7d60dcd0320a94739eb3e63 Mon Sep 17 00:00:00 2001 From: Ashrith Kumar Peddi Date: Tue, 17 Sep 2024 16:49:27 +0530 Subject: [PATCH 08/12] Defer supporting IntelliJ 2024.2 to another commit --- .github/workflows/build.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- build.gradle.kts | 13 +--- .../intellij/formatting/ASTNodeUtils.kt | 18 ----- .../IonCodeStyleSettingsProvider.kt | 33 --------- .../formatting/IonFormattingModelBuilder.kt | 34 ---------- .../formatting/blocks/IonSExpressionBlock.kt | 68 ------------------- .../intellij/psi/PsiElementExtensions.kt | 11 --- 9 files changed, 4 insertions(+), 179 deletions(-) delete mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt delete mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt delete mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt delete mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt delete mode 100644 src/IC-242/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 85f87ae..790077a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: strategy: fail-fast: false matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "2024.2" ] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 9e41208..8094d53 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "IC-2024.2" ] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 16c69fb..ea5f08f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: release: strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "IC-2024.2" ] + product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] max-parallel: 1 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/build.gradle.kts b/build.gradle.kts index dfedb3c..2a3ede0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -80,21 +80,10 @@ val plugins = listOf( apiVersion = "1.6" ), bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") - ), - PluginDescriptor( - since = "242", - until = "242.*", - platformVersion = "2024.2", - platformType = PlatformType.IdeaCommunity, - sourceFolder = "IC-242", - kotlin = KotlinOptions( - apiVersion = "1.6" - ), - bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") ) ) -val defaultProductName = "2024.2" +val defaultProductName = "2024.1" val productName = System.getenv("PRODUCT_NAME") ?: defaultProductName val maybeGithubRunNumber = System.getenv("GITHUB_RUN_NUMBER")?.toInt() val descriptor = plugins.first { it.platformVersion == productName } diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt deleted file mode 100644 index 3531811..0000000 --- a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/ASTNodeUtils.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.amazon.ion.plugin.intellij.formatting - -import com.amazon.ion.plugin.intellij.utils.filterWhitespace -import com.intellij.lang.ASTNode -import org.jetbrains.kotlin.idea.base.psi.getLineNumber -import org.jetbrains.kotlin.psi.psiUtil.siblings - -/** - * Determine if a node is on the same line as another node. - */ -fun ASTNode.sameLineAs(another: ASTNode) = - another.psi.getLineNumber(start = true) == this.psi.getLineNumber(start = true) - -/** - * Return the previous sibling of a node if it exists. - */ -fun ASTNode.previousSibling(): ASTNode? = - siblings(forward = false).filterWhitespace().firstOrNull() diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt deleted file mode 100644 index eb52d10..0000000 --- a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonCodeStyleSettingsProvider.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.amazon.ion.plugin.intellij.formatting - -import com.amazon.ion.plugin.intellij.IonLanguage -import com.intellij.application.options.CodeStyleAbstractConfigurable -import com.intellij.application.options.CodeStyleAbstractPanel -import com.intellij.application.options.TabbedLanguageCodeStylePanel -import com.intellij.openapi.options.Configurable -import com.intellij.psi.codeStyle.CodeStyleSettings -import com.intellij.psi.codeStyle.CodeStyleSettingsProvider - -private const val CODE_STYLE_SETTINGS_DISPLAY_NAME = "Ion" - -class IonCodeStyleSettingsProvider : CodeStyleSettingsProvider() { - override fun getConfigurableDisplayName(): String = CODE_STYLE_SETTINGS_DISPLAY_NAME - - override fun createSettingsPage(settings: CodeStyleSettings, modelSettings: CodeStyleSettings): Configurable = - CodeStyleConfigurableConfiguration(settings, modelSettings) -} - -private class CodeStyleConfigurableConfiguration(settings: CodeStyleSettings, modelSettings: CodeStyleSettings) - : CodeStyleAbstractConfigurable(settings, modelSettings, CODE_STYLE_SETTINGS_DISPLAY_NAME) { - - override fun createPanel(settings: CodeStyleSettings): CodeStyleAbstractPanel = IonCodeStyleMainPanel(currentSettings, settings) - override fun getHelpTopic(): String? = null -} - -private class IonCodeStyleMainPanel(currentSettings: CodeStyleSettings, settings: CodeStyleSettings) - : TabbedLanguageCodeStylePanel(IonLanguage.INSTANCE, currentSettings, settings) { - - override fun initTabs(settings: CodeStyleSettings?) { - addIndentOptionsTab(settings) - } -} diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt deleted file mode 100644 index 51a531b..0000000 --- a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/IonFormattingModelBuilder.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.amazon.ion.plugin.intellij.formatting - -import com.amazon.ion.plugin.intellij.formatting.blocks.IonBlockOptions -import com.amazon.ion.plugin.intellij.formatting.blocks.RootIonBlock -import com.intellij.formatting.FormattingContext -import com.intellij.formatting.FormattingModel -import com.intellij.formatting.FormattingModelBuilder -import com.intellij.formatting.FormattingModelProvider - -/** - * Creates the block model for an Ion file. - * - * The block model will determine how elements are spaced, indented and aligned. - */ -class IonFormattingModelBuilder : FormattingModelBuilder { - override fun createModel(formattingContext: FormattingContext): FormattingModel { - val element = formattingContext.psiElement - val settings = formattingContext.codeStyleSettings - - val rootBlock = RootIonBlock( - node = element.node, - options = IonBlockOptions( - spaceBuilder = IonCodeBlockSpacingProvider(settings), - codeStyle = settings - ) - ) - - - return FormattingModelProvider.createFormattingModelForPsiFile( - element.containingFile, - rootBlock, settings - ) - } -} diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt deleted file mode 100644 index ac0223e..0000000 --- a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/formatting/blocks/IonSExpressionBlock.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.amazon.ion.plugin.intellij.formatting.blocks - -import com.amazon.ion.plugin.intellij.formatting.previousSibling -import com.amazon.ion.plugin.intellij.formatting.sameLineAs -import com.amazon.ion.plugin.intellij.psi.IonTypes -import com.amazon.ion.plugin.intellij.psi.isOneLiner -import com.amazon.ion.plugin.intellij.utils.elementIsA -import com.intellij.lang.ASTNode -import com.intellij.openapi.diagnostic.debug -import com.intellij.openapi.diagnostic.logger -import com.intellij.psi.tree.IElementType -import org.jetbrains.kotlin.idea.base.psi.getLineNumber - -private val logger = logger() - -class IonSExpressionBlock( - node: ASTNode, - formatting: IonBlockFormattingOptions, - options: IonBlockOptions -) : AbstractIonBlock(node, formatting = formatting, options = options) { - - override val childIndentedTypes: Set = setOf( - IonTypes.SEXPRESSION_ATOM, - IonTypes.COMMENT - ) - - override val childContainerTypes: Set = setOf( - IonTypes.SEXPRESSION_ELEMENTS - ) - - override val containerWrapperTypes: Set = setOf( - IonTypes.LPAREN, - IonTypes.RPAREN - ) - - override fun buildChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions = - buildSpecialCaseChildBlockFormatting(child) ?: - super.buildChildBlockFormatting(child) - - private fun buildSpecialCaseChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions? { - - // Lazy evaluate the previous sibling if needed. - val previous by lazy { child.previousSibling() } - - /** - * Check if we are the first comment within the expression, there is a special comment - * case where we don't want to apply the child alignment to the comment. For example: - * - * (join // special case comment which is inline with operator - * // child comments are inline with inner values - * anotherValue - * ) - */ - if (child elementIsA IonTypes.COMMENT && previous?.elementType == IonTypes.SEXPRESSION_OPERATOR) { - - logger.debug { "Formatting [${child.psi.getLineNumber()}] - Special case inline expression comment line" } - - val comment = child.psi - val expressionOperator = previous!! - - if (comment.isOneLiner() && child.sameLineAs(expressionOperator)) { - return IonBlockFormatting.sameAlignment(this) - } - } - - return null - } -} diff --git a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt b/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt deleted file mode 100644 index 5c36ea7..0000000 --- a/src/IC-242/kotlin/com/amazon/ion/plugin/intellij/psi/PsiElementExtensions.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.amazon.ion.plugin.intellij.psi - -import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.base.psi.getLineCount - -/** - * True if the element is all in a single line. - * - * Exists for Backwards Compatibility: <= IC-2020.2 - */ -fun PsiElement.isOneLiner() = getLineCount() == 1 From 969622296ccf60e7a3aa4074765111838a11bf4e Mon Sep 17 00:00:00 2001 From: Ashrith Kumar Peddi Date: Wed, 18 Sep 2024 10:54:21 +0530 Subject: [PATCH 09/12] Fix workflow failure by filtering the correct plugin descriptor --- build.gradle.kts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 2a3ede0..45e0df6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -83,10 +83,10 @@ val plugins = listOf( ) ) -val defaultProductName = "2024.1" +val defaultProductName = "IC-2024.1" val productName = System.getenv("PRODUCT_NAME") ?: defaultProductName val maybeGithubRunNumber = System.getenv("GITHUB_RUN_NUMBER")?.toInt() -val descriptor = plugins.first { it.platformVersion == productName } +val descriptor = plugins.first { it.getSDKVersion() == productName } // Import variables from gradle.properties file val pluginGroup: String by project @@ -209,7 +209,8 @@ fun readResource(name: String) = file("resources/$name").readText() * major: 2 * minor: 1 * patch: 1 - * sdkVersion: 2022.2 + * platformVersion: 2022.2 + * platformType: IC * * RETURNS: * 2.1.1+30-IC-2022.2 @@ -220,7 +221,8 @@ fun readResource(name: String) = file("resources/$name").readText() * major: 2 * minor: 2 * patch: 34 - * sdkVersion: 2022.3 + * platformVersion: 2022.3 + * platformType: IC * * RETURNS: * 2.2.34+0-IC-2022.3+alpha From 0c20ff787362b26cb470ad5c3638776c56064bd7 Mon Sep 17 00:00:00 2001 From: Ashrith Kumar Peddi Date: Thu, 19 Sep 2024 09:54:02 +0530 Subject: [PATCH 10/12] Remove support for 2022.2 in favour of 2024.2 as the minimal supported version is 2022.3 by new intellij platform plugin --- .github/workflows/build.yml | 2 +- .github/workflows/pr.yml | 2 +- .github/workflows/release.yml | 2 +- build.gradle.kts | 17 +++-------------- 4 files changed, 6 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 790077a..bb171cd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: strategy: fail-fast: false matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] + product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 8094d53..901d109 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] + product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] max-parallel: 5 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ea5f08f..ff67a22 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: release: strategy: matrix: - product: [ "IC-2022.2", "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] + product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ] max-parallel: 1 env: PRODUCT_NAME: ${{ matrix.product }} diff --git a/build.gradle.kts b/build.gradle.kts index 45e0df6..259d7fc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,17 +26,6 @@ repositories { } val plugins = listOf( - PluginDescriptor( - since = "222", - until = "223.*", - platformVersion = "2022.2", - platformType = PlatformType.IdeaCommunity, - sourceFolder = "IC-222", - kotlin = KotlinOptions( - apiVersion = "1.6" - ), - bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin") - ), PluginDescriptor( since = "231", until = "231.*", @@ -83,7 +72,7 @@ val plugins = listOf( ) ) -val defaultProductName = "IC-2024.1" +val defaultProductName = "IC-2023.1" val productName = System.getenv("PRODUCT_NAME") ?: defaultProductName val maybeGithubRunNumber = System.getenv("GITHUB_RUN_NUMBER")?.toInt() val descriptor = plugins.first { it.getSDKVersion() == productName } @@ -209,11 +198,11 @@ fun readResource(name: String) = file("resources/$name").readText() * major: 2 * minor: 1 * patch: 1 - * platformVersion: 2022.2 + * platformVersion: 2024.2 * platformType: IC * * RETURNS: - * 2.1.1+30-IC-2022.2 + * 2.1.1+30-IC-2024.2 * * * GIVEN (local dev environment): From 6352326f8964603ce91ff177924b719190aeefca Mon Sep 17 00:00:00 2001 From: Matthew Pope Date: Thu, 19 Sep 2024 16:07:28 -0700 Subject: [PATCH 11/12] Require JDK 17 and fix test dependencies --- build.gradle.kts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 259d7fc..fc5148f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,10 @@ import org.jetbrains.intellij.platform.gradle.IntelliJPlatformType import org.jetbrains.intellij.platform.gradle.models.ProductRelease +import org.jetbrains.intellij.platform.gradle.TestFrameworkType import plugin.PluginDescriptor import plugin.PluginDescriptor.KotlinOptions import plugin.PlatformType import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet buildscript { repositories { @@ -12,6 +12,12 @@ buildscript { } } +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + plugins { kotlin("jvm") id("org.jetbrains.intellij.platform") version "2.0.1" @@ -22,7 +28,7 @@ repositories { intellijPlatform { defaultRepositories() - } + } } val plugins = listOf( @@ -101,7 +107,12 @@ dependencies { bundledPlugins(descriptor.bundledDependencies) pluginVerifier() instrumentationTools() + + testFramework(TestFrameworkType.Platform) } + + testImplementation("org.junit.jupiter:junit-jupiter:5.7.1") + testRuntimeOnly("org.junit.vintage:junit-vintage-engine") } intellijPlatform { @@ -142,8 +153,8 @@ intellijPlatform { sourceSets { main { - withConvention(KotlinSourceSet::class) { - kotlin.srcDir("src/${descriptor.sourceFolder}/kotlin") + kotlin { + srcDir("src/${descriptor.sourceFolder}/kotlin") } resources { From ed645ae7ab16188fb1335df0e59b06cd84bed269 Mon Sep 17 00:00:00 2001 From: Matthew Pope Date: Thu, 19 Sep 2024 16:43:56 -0700 Subject: [PATCH 12/12] Add missing junit 4 dependency --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index fc5148f..0dede27 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -112,6 +112,7 @@ dependencies { } testImplementation("org.junit.jupiter:junit-jupiter:5.7.1") + testCompileOnly("junit:junit:4.13") testRuntimeOnly("org.junit.vintage:junit-vintage-engine") }