From 943d829fa70b8487f5a07c4a13f28b315623daac Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 5 Mar 2024 23:26:14 +0100 Subject: [PATCH] [AA] treat named arguments as write access ^KTIJ-16835 fixed --- ...rceModuleReadWriteAccessTestGenerated.java | 83 +++++++++++++++++++ ...rceModuleReadWriteAccessTestGenerated.java | 47 +++++++++++ ...rceModuleReadWriteAccessTestGenerated.java | 83 +++++++++++++++++++ ...rceModuleReadWriteAccessTestGenerated.java | 47 +++++++++++ ...rceModuleReadWriteAccessTestGenerated.java | 83 +++++++++++++++++++ .../AbstractReadWriteAccessTest.kt | 30 +++++++ ...rceModuleReadWriteAccessTestGenerated.java | 83 +++++++++++++++++++ .../readWriteAccess/assignment.kt | 5 ++ .../readWriteAccess/assignment.txt | 2 + .../readWriteAccess/assignmentPlusEq.kt | 5 ++ .../readWriteAccess/assignmentPlusEq.txt | 2 + .../readWriteAccess/namedArguments.kt | 6 ++ .../readWriteAccess/namedArguments.txt | 2 + .../readWriteAccess/readReference.kt | 6 ++ .../readWriteAccess/readReference.txt | 2 + .../readReferenceInParenthesis.kt | 6 ++ .../readReferenceInParenthesis.txt | 2 + .../readWriteAccess/unary.kt | 5 ++ .../readWriteAccess/unary.txt | 2 + .../idea/references/ReadWriteAccessChecker.kt | 10 ++- .../tests/analysis/api/analysisApi.kt | 5 ++ 21 files changed, 513 insertions(+), 3 deletions(-) create mode 100644 analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/readWriteAccess/Fe10IdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java create mode 100644 analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeDependentAnalysisScriptSourceModuleReadWriteAccessTestGenerated.java create mode 100644 analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeDependentAnalysisSourceModuleReadWriteAccessTestGenerated.java create mode 100644 analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeNormalAnalysisScriptSourceModuleReadWriteAccessTestGenerated.java create mode 100644 analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java create mode 100644 analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/readWriteAccess/AbstractReadWriteAccessTest.kt create mode 100644 analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/readWriteAccess/FirStandaloneNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.kt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.txt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.kt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.txt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.kt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.txt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.kt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.txt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.kt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.txt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.kt create mode 100644 analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/readWriteAccess/Fe10IdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/readWriteAccess/Fe10IdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java new file mode 100644 index 00000000000..620aa4b098c --- /dev/null +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/readWriteAccess/Fe10IdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010-2024 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.analysis.api.fe10.test.cases.generated.cases.components.readWriteAccess; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fe10.test.configurator.AnalysisApiFe10TestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.readWriteAccess.AbstractReadWriteAccessTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess") +@TestDataPath("$PROJECT_ROOT") +public class Fe10IdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated extends AbstractReadWriteAccessTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fe10, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInReadWriteAccess() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("assignment.kt") + public void testAssignment() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.kt"); + } + + @Test + @TestMetadata("assignmentPlusEq.kt") + public void testAssignmentPlusEq() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.kt"); + } + + @Test + @TestMetadata("namedArguments.kt") + public void testNamedArguments() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.kt"); + } + + @Test + @TestMetadata("readReference.kt") + public void testReadReference() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.kt"); + } + + @Test + @TestMetadata("readReferenceInParenthesis.kt") + public void testReadReferenceInParenthesis() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.kt"); + } + + @Test + @TestMetadata("unary.kt") + public void testUnary() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.kt"); + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeDependentAnalysisScriptSourceModuleReadWriteAccessTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeDependentAnalysisScriptSourceModuleReadWriteAccessTestGenerated.java new file mode 100644 index 00000000000..57fc4eed0af --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeDependentAnalysisScriptSourceModuleReadWriteAccessTestGenerated.java @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2024 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.analysis.api.fir.test.cases.generated.cases.components.readWriteAccess; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.readWriteAccess.AbstractReadWriteAccessTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeDependentAnalysisScriptSourceModuleReadWriteAccessTestGenerated extends AbstractReadWriteAccessTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.ScriptSource, + AnalysisSessionMode.Dependent, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInReadWriteAccess() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess"), Pattern.compile("^(.+)\\.kts$"), null, true); + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeDependentAnalysisSourceModuleReadWriteAccessTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeDependentAnalysisSourceModuleReadWriteAccessTestGenerated.java new file mode 100644 index 00000000000..f73a12c9b44 --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeDependentAnalysisSourceModuleReadWriteAccessTestGenerated.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010-2024 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.analysis.api.fir.test.cases.generated.cases.components.readWriteAccess; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.readWriteAccess.AbstractReadWriteAccessTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeDependentAnalysisSourceModuleReadWriteAccessTestGenerated extends AbstractReadWriteAccessTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Dependent, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInReadWriteAccess() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("assignment.kt") + public void testAssignment() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.kt"); + } + + @Test + @TestMetadata("assignmentPlusEq.kt") + public void testAssignmentPlusEq() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.kt"); + } + + @Test + @TestMetadata("namedArguments.kt") + public void testNamedArguments() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.kt"); + } + + @Test + @TestMetadata("readReference.kt") + public void testReadReference() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.kt"); + } + + @Test + @TestMetadata("readReferenceInParenthesis.kt") + public void testReadReferenceInParenthesis() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.kt"); + } + + @Test + @TestMetadata("unary.kt") + public void testUnary() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.kt"); + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeNormalAnalysisScriptSourceModuleReadWriteAccessTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeNormalAnalysisScriptSourceModuleReadWriteAccessTestGenerated.java new file mode 100644 index 00000000000..d7ff8b55d22 --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeNormalAnalysisScriptSourceModuleReadWriteAccessTestGenerated.java @@ -0,0 +1,47 @@ +/* + * Copyright 2010-2024 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.analysis.api.fir.test.cases.generated.cases.components.readWriteAccess; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.readWriteAccess.AbstractReadWriteAccessTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisScriptSourceModuleReadWriteAccessTestGenerated extends AbstractReadWriteAccessTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.ScriptSource, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInReadWriteAccess() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess"), Pattern.compile("^(.+)\\.kts$"), null, true); + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java new file mode 100644 index 00000000000..e641ff67952 --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/readWriteAccess/FirIdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010-2024 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.analysis.api.fir.test.cases.generated.cases.components.readWriteAccess; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.readWriteAccess.AbstractReadWriteAccessTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisSourceModuleReadWriteAccessTestGenerated extends AbstractReadWriteAccessTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInReadWriteAccess() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("assignment.kt") + public void testAssignment() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.kt"); + } + + @Test + @TestMetadata("assignmentPlusEq.kt") + public void testAssignmentPlusEq() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.kt"); + } + + @Test + @TestMetadata("namedArguments.kt") + public void testNamedArguments() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.kt"); + } + + @Test + @TestMetadata("readReference.kt") + public void testReadReference() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.kt"); + } + + @Test + @TestMetadata("readReferenceInParenthesis.kt") + public void testReadReferenceInParenthesis() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.kt"); + } + + @Test + @TestMetadata("unary.kt") + public void testUnary() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.kt"); + } +} diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/readWriteAccess/AbstractReadWriteAccessTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/readWriteAccess/AbstractReadWriteAccessTest.kt new file mode 100644 index 00000000000..a9ace987302 --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/readWriteAccess/AbstractReadWriteAccessTest.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2024 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.analysis.api.impl.base.test.cases.components.readWriteAccess + +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest +import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.idea.references.readWriteAccess +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.model.TestModule +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions + +abstract class AbstractReadWriteAccessTest : AbstractAnalysisApiBasedTest() { + override fun doTestByMainFile(mainFile: KtFile, mainModule: TestModule, testServices: TestServices) { + val expressionAtCaret = testServices.expressionMarkerProvider.getElementOfTypeAtCaret(mainFile) + + val readWriteAccess = expressionAtCaret.readWriteAccess(true) + + val actual = buildString { + appendLine("expression: ${expressionAtCaret.text}") + appendLine("access type: $readWriteAccess") + } + + testServices.assertions.assertEqualsToTestDataFileSibling(actual) + } +} diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/readWriteAccess/FirStandaloneNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/readWriteAccess/FirStandaloneNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java new file mode 100644 index 00000000000..f3c4a22c8f0 --- /dev/null +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/readWriteAccess/FirStandaloneNormalAnalysisSourceModuleReadWriteAccessTestGenerated.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010-2024 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.analysis.api.standalone.fir.test.cases.generated.cases.components.readWriteAccess; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.standalone.fir.test.configurators.AnalysisApiFirStandaloneModeTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.readWriteAccess.AbstractReadWriteAccessTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess") +@TestDataPath("$PROJECT_ROOT") +public class FirStandaloneNormalAnalysisSourceModuleReadWriteAccessTestGenerated extends AbstractReadWriteAccessTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Standalone + ) + ); + } + + @Test + public void testAllFilesPresentInReadWriteAccess() { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("assignment.kt") + public void testAssignment() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.kt"); + } + + @Test + @TestMetadata("assignmentPlusEq.kt") + public void testAssignmentPlusEq() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.kt"); + } + + @Test + @TestMetadata("namedArguments.kt") + public void testNamedArguments() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.kt"); + } + + @Test + @TestMetadata("readReference.kt") + public void testReadReference() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.kt"); + } + + @Test + @TestMetadata("readReferenceInParenthesis.kt") + public void testReadReferenceInParenthesis() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.kt"); + } + + @Test + @TestMetadata("unary.kt") + public void testUnary() { + runTest("analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.kt"); + } +} diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.kt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.kt new file mode 100644 index 00000000000..971a21034c8 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.kt @@ -0,0 +1,5 @@ +class A(var property: Int) + +fun foo(a: A) { + a.property = 10 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.txt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.txt new file mode 100644 index 00000000000..724130685d8 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignment.txt @@ -0,0 +1,2 @@ +expression: property +access type: WRITE diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.kt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.kt new file mode 100644 index 00000000000..583b2ccc47c --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.kt @@ -0,0 +1,5 @@ +class A(var property: Int) + +fun foo(a: A) { + a.property += 10 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.txt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.txt new file mode 100644 index 00000000000..18b9730f8b4 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/assignmentPlusEq.txt @@ -0,0 +1,2 @@ +expression: property +access type: READ_WRITE diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.kt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.kt new file mode 100644 index 00000000000..5f91581cfc8 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.kt @@ -0,0 +1,6 @@ +class A(val property: Int) + +fun foo() { + val a = A(property = 10) + println(a.property) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.txt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.txt new file mode 100644 index 00000000000..724130685d8 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/namedArguments.txt @@ -0,0 +1,2 @@ +expression: property +access type: WRITE diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.kt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.kt new file mode 100644 index 00000000000..3814619aa17 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.kt @@ -0,0 +1,6 @@ +class A(val property: Int) + +fun foo() { + val a = A(property = 10) + println(a.property) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.txt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.txt new file mode 100644 index 00000000000..f2ae1b1e499 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReference.txt @@ -0,0 +1,2 @@ +expression: property +access type: READ diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.kt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.kt new file mode 100644 index 00000000000..ea5d80c2842 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.kt @@ -0,0 +1,6 @@ +class A(val property: Int) + +fun foo() { + val a = A(property = 10) + println((a.property)) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.txt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.txt new file mode 100644 index 00000000000..f2ae1b1e499 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/readReferenceInParenthesis.txt @@ -0,0 +1,2 @@ +expression: property +access type: READ diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.kt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.kt new file mode 100644 index 00000000000..11c45ea75fe --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.kt @@ -0,0 +1,5 @@ +class A(var property: Int) + +fun foo(a: A) { + a.property++ +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.txt b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.txt new file mode 100644 index 00000000000..18b9730f8b4 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionInfoProvider/readWriteAccess/unary.txt @@ -0,0 +1,2 @@ +expression: property +access type: READ_WRITE diff --git a/analysis/kt-references/src/org/jetbrains/kotlin/idea/references/ReadWriteAccessChecker.kt b/analysis/kt-references/src/org/jetbrains/kotlin/idea/references/ReadWriteAccessChecker.kt index 526bfa9f91f..ab243d7e81b 100644 --- a/analysis/kt-references/src/org/jetbrains/kotlin/idea/references/ReadWriteAccessChecker.kt +++ b/analysis/kt-references/src/org/jetbrains/kotlin/idea/references/ReadWriteAccessChecker.kt @@ -40,9 +40,13 @@ interface ReadWriteAccessChecker { } } - val unaryExpression = expression.parent as? KtUnaryExpression - return if (unaryExpression != null && unaryExpression.operationToken in constant { setOf(KtTokens.PLUSPLUS, KtTokens.MINUSMINUS) }) - ReferenceAccess.READ_WRITE to unaryExpression + val parent = expression.parent + if (parent is KtValueArgumentName) { + return ReferenceAccess.WRITE to expression + } + + return if (parent is KtUnaryExpression && parent.operationToken in constant { setOf(KtTokens.PLUSPLUS, KtTokens.MINUSMINUS) }) + ReferenceAccess.READ_WRITE to parent else ReferenceAccess.READ to expression } diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt index 0b26071fd81..7ef4ad45319 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.multipl import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.psiTypeProvider.AbstractAnalysisApiExpressionPsiTypeProviderTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.psiTypeProvider.AbstractAnalysisApiKtTypeByPsiTypeProviderTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.psiTypeProvider.AbstractAnalysisApiPsiTypeProviderTest +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.readWriteAccess.AbstractReadWriteAccessTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.referenceResolveProvider.AbstractIsImplicitCompanionReferenceTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.resolveExtensionInfoProvider.AbstractResolveExtensionInfoProviderTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.scopeProvider.* @@ -294,6 +295,10 @@ private fun AnalysisApiTestGroup.generateAnalysisApiComponentsTests() { test { model(it, "isUsedAsExpression") } + + test { + model(it, "readWriteAccess") + } } component("referenceShortener", filter = frontendIs(FrontendKind.Fir) and analysisSessionModeIs(AnalysisSessionMode.Normal)) {