IC IDE: Add intention to add @JvmInline annotation to value class on JVM

#KTIJ-5663 Fixed
This commit is contained in:
Ilmir Usmanov
2021-03-22 17:29:12 +01:00
parent ea01c97a8e
commit 823d2d0748
7 changed files with 90 additions and 0 deletions
@@ -1636,6 +1636,7 @@ add.braces=Add braces
add.indices.to.for.loop=Add indices to 'for' loop
add.jvmoverloads.annotation=Add '@JvmOverloads' annotation
add.jvmstatic.annotation=Add '@JvmStatic' annotation
add.jvminline.annotation=Add '@JvmInline' annotation
add.labeled.return.to.last.expression.in.a.lambda=Add labeled return to last expression in a lambda
add.missing.component=Add missing component
add.names.to.call.arguments=Add names to call arguments
+5
View File
@@ -360,6 +360,11 @@
<category>Kotlin</category>
</intentionAction>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.AddJvmInlineIntention</className>
<category>Kotlin</category>
</intentionAction>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.RemoveArgumentNameIntention</className>
<category>Kotlin</category>
@@ -0,0 +1,52 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.intentions
import com.intellij.codeInsight.intention.HighPriorityAction
import com.intellij.codeInsight.intention.IntentionAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction
import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory
import org.jetbrains.kotlin.idea.util.addAnnotation
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtModifierListOwner
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
import org.jetbrains.kotlin.resolve.JVM_INLINE_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
class AddJvmInlineIntention : SelfTargetingRangeIntention<KtClass>(
KtClass::class.java,
KotlinBundle.lazyMessage("add.jvminline.annotation")
), HighPriorityAction {
override fun applyTo(element: KtClass, editor: Editor?) {
runWriteAction {
element.addAnnotation(JVM_INLINE_ANNOTATION_FQ_NAME)
}
}
override fun applicabilityRange(element: KtClass): TextRange? {
if (!element.isValue()) return null
val modifier = element.modifierList?.getModifier(KtTokens.VALUE_KEYWORD) ?: return null
return modifier.textRange
}
companion object : KotlinSingleIntentionActionFactory() {
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
val valueModifier = ErrorsJvm.VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION.cast(diagnostic)
val modifierListOwner = valueModifier.psiElement.getParentOfType<KtModifierListOwner>(strict = true) ?: return null
return if (valueModifier != null) AddJvmInlineIntention() else null
}
}
}
+1
View File
@@ -0,0 +1 @@
org.jetbrains.kotlin.idea.intentions.AddJvmInlineIntention
+6
View File
@@ -0,0 +1,6 @@
// WITH_RUNTIME
// ERROR: Value classes without @JvmInline annotation are not supported yet
// SKIP_ERRORS_AFTER
<caret>value class VC(val i: Int)
@@ -0,0 +1,7 @@
// WITH_RUNTIME
// ERROR: Value classes without @JvmInline annotation are not supported yet
// SKIP_ERRORS_AFTER
@JvmInline
value class VC(val i: Int)
@@ -932,6 +932,24 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
}
}
@TestMetadata("idea/testData/intentions/addJvmInline")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class AddJvmInline extends AbstractIntentionTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInAddJvmInline() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/intentions/addJvmInline"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true);
}
@TestMetadata("valueClass.kt")
public void testValueClass() throws Exception {
runTest("idea/testData/intentions/addJvmInline/valueClass.kt");
}
}
@TestMetadata("idea/testData/intentions/addJvmOverloads")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)