Skip to content

Commit 068c3c4

Browse files
peddiashrithAshrith Kumar Peddi
andauthored
Support Intellij 2024.2 (#72)
Co-authored-by: Ashrith Kumar Peddi <[email protected]>
1 parent 3dab4e1 commit 068c3c4

File tree

9 files changed

+180
-5
lines changed

9 files changed

+180
-5
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
strategy:
3737
fail-fast: false
3838
matrix:
39-
product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ]
39+
product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "IC-2024.2" ]
4040
max-parallel: 5
4141
env:
4242
PRODUCT_NAME: ${{ matrix.product }}

.github/workflows/pr.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
runs-on: ubuntu-latest
3535
strategy:
3636
matrix:
37-
product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ]
37+
product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "IC-2024.2" ]
3838
max-parallel: 5
3939
env:
4040
PRODUCT_NAME: ${{ matrix.product }}

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818
release:
1919
strategy:
2020
matrix:
21-
product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1" ]
21+
product: [ "IC-2023.1", "IC-2023.2", "IC-2023.3", "IC-2024.1", "IC-2024.2" ]
2222
max-parallel: 1
2323
env:
2424
PRODUCT_NAME: ${{ matrix.product }}

build.gradle.kts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,21 @@ val plugins = listOf(
7575
apiVersion = "1.6"
7676
),
7777
bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin")
78+
),
79+
PluginDescriptor(
80+
since = "242",
81+
until = "242.*",
82+
platformVersion = "2024.2",
83+
platformType = PlatformType.IdeaCommunity,
84+
sourceFolder = "IC-242",
85+
kotlin = KotlinOptions(
86+
apiVersion = "1.6"
87+
),
88+
bundledDependencies = listOf("com.intellij.java", "org.jetbrains.kotlin")
7889
)
7990
)
8091

81-
val defaultProductName = "IC-2023.1"
92+
val defaultProductName = "IC-2024.2"
8293
val productName = System.getenv("PRODUCT_NAME") ?: defaultProductName
8394
val maybeGithubRunNumber = System.getenv("GITHUB_RUN_NUMBER")?.toInt()
8495
val descriptor = plugins.first { it.getSDKVersion() == productName }
@@ -89,7 +100,7 @@ val pluginGroup: String by project
89100
// `pluginName_` variable ends with `_` because of the collision with Kotlin magic getter in the `intellij` closure.
90101
// Read more about the issue: https://github.com/JetBrains/intellij-platform-plugin-template/issues/29
91102
val pluginName_: String by project
92-
val pluginVersion: String = pluginVersion(major = "2", minor = "7", patch = "1")
103+
val pluginVersion: String = pluginVersion(major = "2", minor = "8", patch = "1")
93104
val pluginDescriptionFile: String by project
94105
val pluginChangeNotesFile: String by project
95106

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.amazon.ion.plugin.intellij.formatting
2+
3+
import com.amazon.ion.plugin.intellij.utils.filterWhitespace
4+
import com.intellij.lang.ASTNode
5+
import org.jetbrains.kotlin.idea.base.psi.getLineNumber
6+
import org.jetbrains.kotlin.psi.psiUtil.siblings
7+
8+
/**
9+
* Determine if a node is on the same line as another node.
10+
*/
11+
fun ASTNode.sameLineAs(another: ASTNode) =
12+
another.psi.getLineNumber(start = true) == this.psi.getLineNumber(start = true)
13+
14+
/**
15+
* Return the previous sibling of a node if it exists.
16+
*/
17+
fun ASTNode.previousSibling(): ASTNode? =
18+
siblings(forward = false).filterWhitespace().firstOrNull()
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.amazon.ion.plugin.intellij.formatting
2+
3+
import com.amazon.ion.plugin.intellij.IonLanguage
4+
import com.intellij.application.options.CodeStyleAbstractConfigurable
5+
import com.intellij.application.options.CodeStyleAbstractPanel
6+
import com.intellij.application.options.TabbedLanguageCodeStylePanel
7+
import com.intellij.openapi.options.Configurable
8+
import com.intellij.psi.codeStyle.CodeStyleSettings
9+
import com.intellij.psi.codeStyle.CodeStyleSettingsProvider
10+
11+
private const val CODE_STYLE_SETTINGS_DISPLAY_NAME = "Ion"
12+
13+
class IonCodeStyleSettingsProvider : CodeStyleSettingsProvider() {
14+
override fun getConfigurableDisplayName(): String = CODE_STYLE_SETTINGS_DISPLAY_NAME
15+
16+
override fun createSettingsPage(settings: CodeStyleSettings, modelSettings: CodeStyleSettings): Configurable =
17+
CodeStyleConfigurableConfiguration(settings, modelSettings)
18+
}
19+
20+
private class CodeStyleConfigurableConfiguration(settings: CodeStyleSettings, modelSettings: CodeStyleSettings)
21+
: CodeStyleAbstractConfigurable(settings, modelSettings, CODE_STYLE_SETTINGS_DISPLAY_NAME) {
22+
23+
override fun createPanel(settings: CodeStyleSettings): CodeStyleAbstractPanel = IonCodeStyleMainPanel(currentSettings, settings)
24+
override fun getHelpTopic(): String? = null
25+
}
26+
27+
private class IonCodeStyleMainPanel(currentSettings: CodeStyleSettings, settings: CodeStyleSettings)
28+
: TabbedLanguageCodeStylePanel(IonLanguage.INSTANCE, currentSettings, settings) {
29+
30+
override fun initTabs(settings: CodeStyleSettings?) {
31+
addIndentOptionsTab(settings)
32+
}
33+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.amazon.ion.plugin.intellij.formatting
2+
3+
import com.amazon.ion.plugin.intellij.formatting.blocks.IonBlockOptions
4+
import com.amazon.ion.plugin.intellij.formatting.blocks.RootIonBlock
5+
import com.intellij.formatting.FormattingContext
6+
import com.intellij.formatting.FormattingModel
7+
import com.intellij.formatting.FormattingModelBuilder
8+
import com.intellij.formatting.FormattingModelProvider
9+
10+
/**
11+
* Creates the block model for an Ion file.
12+
*
13+
* The block model will determine how elements are spaced, indented and aligned.
14+
*/
15+
class IonFormattingModelBuilder : FormattingModelBuilder {
16+
override fun createModel(formattingContext: FormattingContext): FormattingModel {
17+
val element = formattingContext.psiElement
18+
val settings = formattingContext.codeStyleSettings
19+
20+
val rootBlock = RootIonBlock(
21+
node = element.node,
22+
options = IonBlockOptions(
23+
spaceBuilder = IonCodeBlockSpacingProvider(settings),
24+
codeStyle = settings
25+
)
26+
)
27+
28+
29+
return FormattingModelProvider.createFormattingModelForPsiFile(
30+
element.containingFile,
31+
rootBlock, settings
32+
)
33+
}
34+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.amazon.ion.plugin.intellij.formatting.blocks
2+
3+
import com.amazon.ion.plugin.intellij.formatting.previousSibling
4+
import com.amazon.ion.plugin.intellij.formatting.sameLineAs
5+
import com.amazon.ion.plugin.intellij.psi.IonTypes
6+
import com.amazon.ion.plugin.intellij.psi.isOneLiner
7+
import com.amazon.ion.plugin.intellij.utils.elementIsA
8+
import com.intellij.lang.ASTNode
9+
import com.intellij.openapi.diagnostic.debug
10+
import com.intellij.openapi.diagnostic.logger
11+
import com.intellij.psi.tree.IElementType
12+
import org.jetbrains.kotlin.idea.base.psi.getLineNumber
13+
14+
private val logger = logger<IonSExpressionBlock>()
15+
16+
class IonSExpressionBlock(
17+
node: ASTNode,
18+
formatting: IonBlockFormattingOptions,
19+
options: IonBlockOptions
20+
) : AbstractIonBlock(node, formatting = formatting, options = options) {
21+
22+
override val childIndentedTypes: Set<IElementType> = setOf(
23+
IonTypes.SEXPRESSION_ATOM,
24+
IonTypes.COMMENT
25+
)
26+
27+
override val childContainerTypes: Set<IElementType> = setOf(
28+
IonTypes.SEXPRESSION_ELEMENTS
29+
)
30+
31+
override val containerWrapperTypes: Set<IElementType> = setOf(
32+
IonTypes.LPAREN,
33+
IonTypes.RPAREN
34+
)
35+
36+
override fun buildChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions =
37+
buildSpecialCaseChildBlockFormatting(child) ?:
38+
super.buildChildBlockFormatting(child)
39+
40+
private fun buildSpecialCaseChildBlockFormatting(child: ASTNode): IonBlockFormattingOptions? {
41+
42+
// Lazy evaluate the previous sibling if needed.
43+
val previous by lazy { child.previousSibling() }
44+
45+
/**
46+
* Check if we are the first comment within the expression, there is a special comment
47+
* case where we don't want to apply the child alignment to the comment. For example:
48+
*
49+
* (join // special case comment which is inline with operator
50+
* // child comments are inline with inner values
51+
* anotherValue
52+
* )
53+
*/
54+
if (child elementIsA IonTypes.COMMENT && previous?.elementType == IonTypes.SEXPRESSION_OPERATOR) {
55+
56+
logger.debug { "Formatting [${child.psi.getLineNumber()}] - Special case inline expression comment line" }
57+
58+
val comment = child.psi
59+
val expressionOperator = previous!!
60+
61+
if (comment.isOneLiner() && child.sameLineAs(expressionOperator)) {
62+
return IonBlockFormatting.sameAlignment(this)
63+
}
64+
}
65+
66+
return null
67+
}
68+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.amazon.ion.plugin.intellij.psi
2+
3+
import com.intellij.psi.PsiElement
4+
import org.jetbrains.kotlin.idea.base.psi.getLineCount
5+
6+
/**
7+
* True if the element is all in a single line.
8+
*
9+
* Exists for Backwards Compatibility: <= IC-2020.2
10+
*/
11+
fun PsiElement.isOneLiner() = getLineCount() == 1

0 commit comments

Comments
 (0)