From 4eb5ac0635a5981c6732bad532eb157a696a8af2 Mon Sep 17 00:00:00 2001 From: Maksim Kurnikov Date: Wed, 3 Jul 2024 15:05:05 +0300 Subject: [PATCH] highlight not supported index expr in compiler v1 with quickfix --- .../ide/annotator/MvSyntaxErrorAnnotator.kt | 11 +++++ .../annotator/fixes/WrapWithParensExprFix.kt | 1 + .../ide/inspections/MvLocalInspectionTool.kt | 6 +++ .../fixes/EnableCompilerV2FeatureFix.kt | 38 ++++++++++++++++++ .../kotlin/org/move/lang/utils/Diagnostic.kt | 13 ++++++ .../kotlin/org/move/utils/tests/MvTestBase.kt | 11 ++--- .../annotator/HighlightingAnnotatorTest.kt | 2 +- .../syntaxErrors/compilerV2/IndexExprTest.kt | 40 +++++++++++++++++++ .../MvMissingAcquiresInspectionTest.kt | 2 +- .../inspections/MvTypeCheckInspectionTest.kt | 2 - .../MvUnusedAcquiresTypeInspectionTest.kt | 2 +- ...laceWithMethodCallInspectionProjectTest.kt | 2 +- .../ReplaceWithMethodCallInspectionTest.kt | 2 - .../compilerV2/TypeCheckIndexExprTest.kt | 2 +- .../lang/completion/KeywordCompletionTest.kt | 2 +- .../move/lang/parser/CompleteParsingTest.kt | 2 +- .../ResolveResourceAccessSpecifiersTest.kt | 2 +- .../org/move/lang/resolve/ResolveTypesTest.kt | 2 +- .../lang/types/ExpressionTypeInferenceTest.kt | 2 - .../lang/types/compilerV2/IndexExprTypes.kt | 2 +- 20 files changed, 122 insertions(+), 24 deletions(-) create mode 100644 src/main/kotlin/org/move/ide/inspections/fixes/EnableCompilerV2FeatureFix.kt create mode 100644 src/test/kotlin/org/move/ide/annotator/syntaxErrors/compilerV2/IndexExprTest.kt diff --git a/src/main/kotlin/org/move/ide/annotator/MvSyntaxErrorAnnotator.kt b/src/main/kotlin/org/move/ide/annotator/MvSyntaxErrorAnnotator.kt index 1f2156709..f999b7d80 100644 --- a/src/main/kotlin/org/move/ide/annotator/MvSyntaxErrorAnnotator.kt +++ b/src/main/kotlin/org/move/ide/annotator/MvSyntaxErrorAnnotator.kt @@ -3,6 +3,7 @@ package org.move.ide.annotator import com.intellij.lang.annotation.AnnotationHolder import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement +import org.move.cli.settings.moveSettings import org.move.lang.core.psi.* import org.move.lang.core.psi.ext.* import org.move.lang.utils.Diagnostic @@ -20,6 +21,7 @@ class MvSyntaxErrorAnnotator: MvAnnotatorBase() { override fun visitStruct(s: MvStruct) = checkStruct(moveHolder, s) override fun visitFunction(o: MvFunction) = checkFunction(moveHolder, o) override fun visitSpecFunction(o: MvSpecFunction) = checkSpecFunction(moveHolder, o) + override fun visitIndexExpr(o: MvIndexExpr) = checkIndexExpr(moveHolder, o) } element.accept(visitor) } @@ -56,6 +58,14 @@ class MvSyntaxErrorAnnotator: MvAnnotatorBase() { } } + private fun checkIndexExpr(holder: MvAnnotationHolder, indexExpr: MvIndexExpr) { + if (!indexExpr.project.moveSettings.enableIndexExpr) { + Diagnostic + .IndexExprIsNotAllowed(indexExpr) + .addToHolder(holder) + } + } + private fun checkStruct(holder: MvAnnotationHolder, struct: MvStruct) { val native = struct.native ?: return val errorRange = TextRange.create(native.startOffset, struct.structKw.endOffset) @@ -154,6 +164,7 @@ class MvSyntaxErrorAnnotator: MvAnnotatorBase() { } } + @Suppress("CompanionObjectInExtension") companion object { private val INTEGER_WITH_SUFFIX_REGEX = Regex("([0-9a-zA-Z_]+)(u[0-9]{1,4})") diff --git a/src/main/kotlin/org/move/ide/annotator/fixes/WrapWithParensExprFix.kt b/src/main/kotlin/org/move/ide/annotator/fixes/WrapWithParensExprFix.kt index 6ba8199d7..847a12650 100644 --- a/src/main/kotlin/org/move/ide/annotator/fixes/WrapWithParensExprFix.kt +++ b/src/main/kotlin/org/move/ide/annotator/fixes/WrapWithParensExprFix.kt @@ -10,6 +10,7 @@ import org.move.lang.core.psi.* class WrapWithParensExprFix(castExpr: MvCastExpr) : DiagnosticIntentionFix(castExpr) { override fun generatePreview(project: Project, previewDescriptor: ProblemDescriptor): IntentionPreviewInfo = IntentionPreviewInfo.EMPTY + override fun getFamilyName(): String = "Wrap cast with ()" override fun getText(): String = "Wrap cast with ()" diff --git a/src/main/kotlin/org/move/ide/inspections/MvLocalInspectionTool.kt b/src/main/kotlin/org/move/ide/inspections/MvLocalInspectionTool.kt index 71100a487..c7931c6d2 100644 --- a/src/main/kotlin/org/move/ide/inspections/MvLocalInspectionTool.kt +++ b/src/main/kotlin/org/move/ide/inspections/MvLocalInspectionTool.kt @@ -2,6 +2,9 @@ package org.move.ide.inspections import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo import com.intellij.codeInspection.* +import com.intellij.model.SideEffectGuard +import com.intellij.model.SideEffectGuard.EffectType.EXEC +import com.intellij.model.SideEffectGuard.EffectType.SETTINGS import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement @@ -107,6 +110,9 @@ abstract class DiagnosticIntentionFix(element: T) : override fun generatePreview(project: Project, previewDescriptor: ProblemDescriptor): IntentionPreviewInfo = IntentionPreviewInfo.EMPTY + override fun generatePreview(project: Project, editor: Editor, file: PsiFile): IntentionPreviewInfo = + IntentionPreviewInfo.EMPTY + override fun getFamilyName(): String = text override fun isAvailable( diff --git a/src/main/kotlin/org/move/ide/inspections/fixes/EnableCompilerV2FeatureFix.kt b/src/main/kotlin/org/move/ide/inspections/fixes/EnableCompilerV2FeatureFix.kt new file mode 100644 index 000000000..0a0a479d8 --- /dev/null +++ b/src/main/kotlin/org/move/ide/inspections/fixes/EnableCompilerV2FeatureFix.kt @@ -0,0 +1,38 @@ +package org.move.ide.inspections.fixes + +import com.intellij.model.SideEffectGuard +import com.intellij.model.SideEffectGuard.EffectType.SETTINGS +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import io.ktor.http.* +import org.move.cli.settings.moveSettings +import org.move.ide.inspections.DiagnosticIntentionFix +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.CompilerV2Feat.RESOURCE_CONTROL + +enum class CompilerV2Feat(val title: String) { + INDEXING("Index notation"), + RESOURCE_CONTROL("Resource access control"); +} + +class EnableCompilerV2FeatureFix( + element: PsiElement, + val feature: CompilerV2Feat +): + DiagnosticIntentionFix(element) { + + override fun getText(): String = + "Enable ${feature.title.quote()} feature of Aptos Move V2 Compiler in the plugin settings" + + override fun invoke(project: Project, file: PsiFile, element: PsiElement) { + @Suppress("UnstableApiUsage") + SideEffectGuard.checkSideEffectAllowed(SETTINGS) + project.moveSettings.modify { + when (feature) { + INDEXING -> it.enableIndexExpr = true + RESOURCE_CONTROL -> it.enableResourceAccessControl = true + } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/org/move/lang/utils/Diagnostic.kt b/src/main/kotlin/org/move/lang/utils/Diagnostic.kt index 11b30bfa1..25fb508b4 100644 --- a/src/main/kotlin/org/move/lang/utils/Diagnostic.kt +++ b/src/main/kotlin/org/move/lang/utils/Diagnostic.kt @@ -13,6 +13,8 @@ import org.move.ide.annotator.MvAnnotationHolder import org.move.ide.annotator.fixes.ItemSpecSignatureFix import org.move.ide.annotator.fixes.WrapWithParensExprFix import org.move.ide.annotator.pluralise +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.EnableCompilerV2FeatureFix import org.move.lang.core.psi.* import org.move.lang.core.psi.ext.endOffset import org.move.lang.core.psi.ext.itemSpecBlock @@ -170,6 +172,17 @@ sealed class Diagnostic( ) } } + + class IndexExprIsNotAllowed(indexExpr: MvIndexExpr): Diagnostic(indexExpr) { + + override fun prepare(): PreparedAnnotation { + return PreparedAnnotation( + ERROR, + "Index operator is not supported in Aptos Move V1 outside specs", + fixes = listOf(EnableCompilerV2FeatureFix(element, INDEXING)) + ) + } + } } enum class Severity { diff --git a/src/main/kotlin/org/move/utils/tests/MvTestBase.kt b/src/main/kotlin/org/move/utils/tests/MvTestBase.kt index 39bd1f39f..ec762b4ba 100644 --- a/src/main/kotlin/org/move/utils/tests/MvTestBase.kt +++ b/src/main/kotlin/org/move/utils/tests/MvTestBase.kt @@ -7,15 +7,14 @@ package org.move.utils.tests import com.intellij.codeInspection.InspectionProfileEntry import com.intellij.openapi.project.Project -import com.intellij.openapi.util.Disposer import com.intellij.psi.PsiElement import com.intellij.testFramework.UsefulTestCase import com.intellij.testFramework.enableInspectionTool import org.intellij.lang.annotations.Language -import org.move.cli.settings.MvProjectSettingsService import org.move.cli.settings.moveSettings -import org.move.utils.tests.CompilerV2Feat.INDEXING -import org.move.utils.tests.CompilerV2Feat.RESOURCE_CONTROL +import org.move.ide.inspections.fixes.CompilerV2Feat +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.CompilerV2Feat.RESOURCE_CONTROL import org.move.utils.tests.base.MvTestCase import org.move.utils.tests.base.TestCase import org.move.utils.tests.base.findElementsWithDataAndOffsetInEditor @@ -33,10 +32,6 @@ annotation class DebugMode(val enabled: Boolean) @Retention(AnnotationRetention.RUNTIME) annotation class WithEnabledInspections(vararg val inspections: KClass) -enum class CompilerV2Feat { - INDEXING, RESOURCE_CONTROL; -} - @Inherited @Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) diff --git a/src/test/kotlin/org/move/ide/annotator/HighlightingAnnotatorTest.kt b/src/test/kotlin/org/move/ide/annotator/HighlightingAnnotatorTest.kt index c110353fe..f8e37fa08 100644 --- a/src/test/kotlin/org/move/ide/annotator/HighlightingAnnotatorTest.kt +++ b/src/test/kotlin/org/move/ide/annotator/HighlightingAnnotatorTest.kt @@ -1,7 +1,7 @@ package org.move.ide.annotator import org.move.ide.colors.MvColor -import org.move.utils.tests.CompilerV2Feat.RESOURCE_CONTROL +import org.move.ide.inspections.fixes.CompilerV2Feat.RESOURCE_CONTROL import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.annotation.AnnotatorTestCase diff --git a/src/test/kotlin/org/move/ide/annotator/syntaxErrors/compilerV2/IndexExprTest.kt b/src/test/kotlin/org/move/ide/annotator/syntaxErrors/compilerV2/IndexExprTest.kt new file mode 100644 index 000000000..acfcb260c --- /dev/null +++ b/src/test/kotlin/org/move/ide/annotator/syntaxErrors/compilerV2/IndexExprTest.kt @@ -0,0 +1,40 @@ +package org.move.ide.annotator.syntaxErrors.compilerV2 + +import org.move.ide.annotator.MvSyntaxErrorAnnotator +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING +import org.move.utils.tests.CompilerV2Features +import org.move.utils.tests.annotation.AnnotatorTestCase + +class IndexExprTest: AnnotatorTestCase(MvSyntaxErrorAnnotator::class) { + @CompilerV2Features() + fun `test vector index expr in not allowed in main code with compiler v1`() = checkWarnings(""" + module 0x1::m { + fun main() { + let v = vector[1, 2]; + v[1]; + } + } + """) + + @CompilerV2Features() + fun `test resource index expr in not allowed in main code with compiler v1`() = checkWarnings(""" + module 0x1::m { + fun main() { + let v = vector[1, 2]; + v[1]; + } + } + """) + + @CompilerV2Features(INDEXING) + fun `test no error with index expr in compiler v2`() = checkWarnings(""" + module 0x1::m { + struct S has key { field: u8 } + fun main() { + let v1 = vector[1, 2]; + v1[1]; + S[@0x1].field = 11; + } + } + """) +} \ No newline at end of file diff --git a/src/test/kotlin/org/move/ide/inspections/MvMissingAcquiresInspectionTest.kt b/src/test/kotlin/org/move/ide/inspections/MvMissingAcquiresInspectionTest.kt index 7d503351d..e9277ee20 100644 --- a/src/test/kotlin/org/move/ide/inspections/MvMissingAcquiresInspectionTest.kt +++ b/src/test/kotlin/org/move/ide/inspections/MvMissingAcquiresInspectionTest.kt @@ -1,6 +1,6 @@ package org.move.ide.inspections -import org.move.utils.tests.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.annotation.InspectionTestBase diff --git a/src/test/kotlin/org/move/ide/inspections/MvTypeCheckInspectionTest.kt b/src/test/kotlin/org/move/ide/inspections/MvTypeCheckInspectionTest.kt index 498afb337..4b657b937 100644 --- a/src/test/kotlin/org/move/ide/inspections/MvTypeCheckInspectionTest.kt +++ b/src/test/kotlin/org/move/ide/inspections/MvTypeCheckInspectionTest.kt @@ -1,7 +1,5 @@ package org.move.ide.inspections -import org.move.utils.tests.CompilerV2Feat.INDEXING -import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.annotation.InspectionTestBase class MvTypeCheckInspectionTest: InspectionTestBase(MvTypeCheckInspection::class) { diff --git a/src/test/kotlin/org/move/ide/inspections/MvUnusedAcquiresTypeInspectionTest.kt b/src/test/kotlin/org/move/ide/inspections/MvUnusedAcquiresTypeInspectionTest.kt index d799be557..01852e8ad 100644 --- a/src/test/kotlin/org/move/ide/inspections/MvUnusedAcquiresTypeInspectionTest.kt +++ b/src/test/kotlin/org/move/ide/inspections/MvUnusedAcquiresTypeInspectionTest.kt @@ -1,6 +1,6 @@ package org.move.ide.inspections -import org.move.utils.tests.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.annotation.InspectionTestBase diff --git a/src/test/kotlin/org/move/ide/inspections/ReplaceWithMethodCallInspectionProjectTest.kt b/src/test/kotlin/org/move/ide/inspections/ReplaceWithMethodCallInspectionProjectTest.kt index ecc144722..14782ca85 100644 --- a/src/test/kotlin/org/move/ide/inspections/ReplaceWithMethodCallInspectionProjectTest.kt +++ b/src/test/kotlin/org/move/ide/inspections/ReplaceWithMethodCallInspectionProjectTest.kt @@ -1,7 +1,7 @@ package org.move.ide.inspections import org.intellij.lang.annotations.Language -import org.move.utils.tests.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.FileTreeBuilder import org.move.utils.tests.annotation.InspectionProjectTestBase diff --git a/src/test/kotlin/org/move/ide/inspections/ReplaceWithMethodCallInspectionTest.kt b/src/test/kotlin/org/move/ide/inspections/ReplaceWithMethodCallInspectionTest.kt index f5539962b..083217fa1 100644 --- a/src/test/kotlin/org/move/ide/inspections/ReplaceWithMethodCallInspectionTest.kt +++ b/src/test/kotlin/org/move/ide/inspections/ReplaceWithMethodCallInspectionTest.kt @@ -1,8 +1,6 @@ package org.move.ide.inspections import org.intellij.lang.annotations.Language -import org.move.utils.tests.CompilerV2Feat.INDEXING -import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.annotation.InspectionTestBase class ReplaceWithMethodCallInspectionTest: InspectionTestBase(ReplaceWithMethodCallInspection::class) { diff --git a/src/test/kotlin/org/move/ide/inspections/compilerV2/TypeCheckIndexExprTest.kt b/src/test/kotlin/org/move/ide/inspections/compilerV2/TypeCheckIndexExprTest.kt index ddb01d92a..6956ccd54 100644 --- a/src/test/kotlin/org/move/ide/inspections/compilerV2/TypeCheckIndexExprTest.kt +++ b/src/test/kotlin/org/move/ide/inspections/compilerV2/TypeCheckIndexExprTest.kt @@ -1,7 +1,7 @@ package org.move.ide.inspections.compilerV2 import org.move.ide.inspections.MvTypeCheckInspection -import org.move.utils.tests.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.annotation.InspectionTestBase diff --git a/src/test/kotlin/org/move/lang/completion/KeywordCompletionTest.kt b/src/test/kotlin/org/move/lang/completion/KeywordCompletionTest.kt index f7d2302fc..09a5d344b 100644 --- a/src/test/kotlin/org/move/lang/completion/KeywordCompletionTest.kt +++ b/src/test/kotlin/org/move/lang/completion/KeywordCompletionTest.kt @@ -1,6 +1,6 @@ package org.move.lang.completion -import org.move.utils.tests.CompilerV2Feat.RESOURCE_CONTROL +import org.move.ide.inspections.fixes.CompilerV2Feat.RESOURCE_CONTROL import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.completion.CompletionTestCase diff --git a/src/test/kotlin/org/move/lang/parser/CompleteParsingTest.kt b/src/test/kotlin/org/move/lang/parser/CompleteParsingTest.kt index 03e0d2e0d..b02f17881 100644 --- a/src/test/kotlin/org/move/lang/parser/CompleteParsingTest.kt +++ b/src/test/kotlin/org/move/lang/parser/CompleteParsingTest.kt @@ -1,6 +1,6 @@ package org.move.lang.parser -import org.move.utils.tests.CompilerV2Feat.RESOURCE_CONTROL +import org.move.ide.inspections.fixes.CompilerV2Feat.RESOURCE_CONTROL import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.parser.MvParsingTestCase diff --git a/src/test/kotlin/org/move/lang/resolve/ResolveResourceAccessSpecifiersTest.kt b/src/test/kotlin/org/move/lang/resolve/ResolveResourceAccessSpecifiersTest.kt index 49c4a9b55..fecdc5029 100644 --- a/src/test/kotlin/org/move/lang/resolve/ResolveResourceAccessSpecifiersTest.kt +++ b/src/test/kotlin/org/move/lang/resolve/ResolveResourceAccessSpecifiersTest.kt @@ -1,6 +1,6 @@ package org.move.lang.resolve -import org.move.utils.tests.CompilerV2Feat.RESOURCE_CONTROL +import org.move.ide.inspections.fixes.CompilerV2Feat.RESOURCE_CONTROL import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.resolve.ResolveTestCase diff --git a/src/test/kotlin/org/move/lang/resolve/ResolveTypesTest.kt b/src/test/kotlin/org/move/lang/resolve/ResolveTypesTest.kt index 6fadbe2a1..bedd9d33e 100644 --- a/src/test/kotlin/org/move/lang/resolve/ResolveTypesTest.kt +++ b/src/test/kotlin/org/move/lang/resolve/ResolveTypesTest.kt @@ -1,6 +1,6 @@ package org.move.lang.resolve -import org.move.utils.tests.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.resolve.ResolveTestCase diff --git a/src/test/kotlin/org/move/lang/types/ExpressionTypeInferenceTest.kt b/src/test/kotlin/org/move/lang/types/ExpressionTypeInferenceTest.kt index 7d2e94a7c..055e50d31 100644 --- a/src/test/kotlin/org/move/lang/types/ExpressionTypeInferenceTest.kt +++ b/src/test/kotlin/org/move/lang/types/ExpressionTypeInferenceTest.kt @@ -1,7 +1,5 @@ package org.move.lang.types -import org.move.utils.tests.CompilerV2Feat.INDEXING -import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.types.TypificationTestCase class ExpressionTypeInferenceTest: TypificationTestCase() { diff --git a/src/test/kotlin/org/move/lang/types/compilerV2/IndexExprTypes.kt b/src/test/kotlin/org/move/lang/types/compilerV2/IndexExprTypes.kt index 0a100745d..f3a2e0dae 100644 --- a/src/test/kotlin/org/move/lang/types/compilerV2/IndexExprTypes.kt +++ b/src/test/kotlin/org/move/lang/types/compilerV2/IndexExprTypes.kt @@ -1,6 +1,6 @@ package org.move.lang.types.compilerV2 -import org.move.utils.tests.CompilerV2Feat.INDEXING +import org.move.ide.inspections.fixes.CompilerV2Feat.INDEXING import org.move.utils.tests.CompilerV2Features import org.move.utils.tests.types.TypificationTestCase