From e89a3242ab37021630853b799565d3fe11e2bd80 Mon Sep 17 00:00:00 2001 From: Richardas Kuchinskas Date: Tue, 24 Oct 2023 17:52:46 +0300 Subject: [PATCH] fixed duplicate bug in trait inspection apply added new test from kphp moved --- .../InternalSymbolUsageInspection.kt | 19 +++++++++++++------ .../TraitsNesting/Photos/.modulite.yaml | 11 +---------- .../006_known_bugs.php} | 10 ++++------ .../Feed006}/.modulite.yaml | 3 ++- .../Feed006}/PrivClass.php | 2 +- .../Feed006}/PrivTrait.php | 2 +- .../Feed006}/PubFeed.php | 2 +- .../101_trait_not_required.php | 7 +++++++ .../Engines101/LikesEngineTrait101.php | 14 ++++++++++++++ .../ExternalEngines101/Tweets101.php | 9 +++++++++ .../Photos101/.modulite.yaml | 17 +++++++++++++++++ .../Photos101/Photo101.php | 12 ++++++++++++ .../com/vk/modulite/tests/KphpGoldenTests.kt | 4 +++- 13 files changed, 85 insertions(+), 27 deletions(-) rename src/test/fixtures/kphp_golden/{101_trait_in_module_internal/101_known_bugs.php => 006_known_bugs/006_known_bugs.php} (64%) rename src/test/fixtures/kphp_golden/{101_trait_in_module_internal/Feed101 => 006_known_bugs/Feed006}/.modulite.yaml (62%) rename src/test/fixtures/kphp_golden/{101_trait_in_module_internal/Feed101 => 006_known_bugs/Feed006}/PrivClass.php (84%) rename src/test/fixtures/kphp_golden/{101_trait_in_module_internal/Feed101 => 006_known_bugs/Feed006}/PrivTrait.php (84%) rename src/test/fixtures/kphp_golden/{101_trait_in_module_internal/Feed101 => 006_known_bugs/Feed006}/PubFeed.php (91%) create mode 100644 src/test/fixtures/kphp_golden/101_trait_not_required/101_trait_not_required.php create mode 100644 src/test/fixtures/kphp_golden/101_trait_not_required/Engines101/LikesEngineTrait101.php create mode 100644 src/test/fixtures/kphp_golden/101_trait_not_required/ExternalEngines101/Tweets101.php create mode 100644 src/test/fixtures/kphp_golden/101_trait_not_required/Photos101/.modulite.yaml create mode 100644 src/test/fixtures/kphp_golden/101_trait_not_required/Photos101/Photo101.php diff --git a/src/main/kotlin/com/vk/modulite/inspections/InternalSymbolUsageInspection.kt b/src/main/kotlin/com/vk/modulite/inspections/InternalSymbolUsageInspection.kt index 7778d1b..e700dc2 100644 --- a/src/main/kotlin/com/vk/modulite/inspections/InternalSymbolUsageInspection.kt +++ b/src/main/kotlin/com/vk/modulite/inspections/InternalSymbolUsageInspection.kt @@ -15,6 +15,7 @@ import com.jetbrains.php.lang.psi.visitors.PhpElementVisitor import com.vk.modulite.SymbolName import com.vk.modulite.composer.ComposerPackage import com.vk.modulite.modulite.Modulite +import com.vk.modulite.modulite.ModuliteRequires import com.vk.modulite.modulite.ModuliteRestrictionChecker import com.vk.modulite.psi.extensions.files.containingComposerPackage import com.vk.modulite.psi.extensions.files.containingModulite @@ -240,7 +241,7 @@ class InternalSymbolUsageInspection : LocalInspectionTool() { restricted to $readableName, $refModulite is not required by ${context.modulite} """.trimIndent() } else if(symbolElement is PhpClass && symbolElement.isTrait){ - val (classes,methods) = collectTraitReferenceUsage(reference) + val (classes,methods) = collectTraitReferenceUsage(reference,context.modulite?.requires ) quickFixes.add(AddSymbolToRequiresQuickFix(context.modulite!!, classes+methods)) """ @@ -265,7 +266,7 @@ class InternalSymbolUsageInspection : LocalInspectionTool() { """.trimIndent() } } - +context.modulite?.requires registerModuliteProblem( problemElement, text, @@ -314,7 +315,7 @@ class InternalSymbolUsageInspection : LocalInspectionTool() { return Pair(classesToRequire, methodsToRequire) } - private fun collectTraitReferenceUsage(reference: PhpReference) + private fun collectTraitReferenceUsage(reference: PhpReference, moduliteRequires : ModuliteRequires? = null) : Pair, List> { val traitsClasses: MutableList = arrayListOf() val methodsNames: MutableCollection = arrayListOf() @@ -361,9 +362,15 @@ class InternalSymbolUsageInspection : LocalInspectionTool() { requireMethods.addAll(methods) } - val traitsSymbolsName = traitsClasses.distinct().mapNotNull { processElement(it, reference) } - val traitsSymbolName = requireMethods.distinct().mapNotNull { processElement(it, reference) } + val traitsClassName = traitsClasses.distinct().mapNotNull { processElement(it, reference) } + val traitsMethodsName = requireMethods.distinct().mapNotNull { processElement(it, reference) } + + moduliteRequires?.symbols?.let { currentModuleSymbols -> + val filteredMethods = traitsMethodsName.filterNot { it in currentModuleSymbols } + val filteredClasses = traitsClassName.filterNot { it in currentModuleSymbols } + return Pair(filteredClasses, filteredMethods) + } - return Pair(traitsSymbolsName, traitsSymbolName) + return Pair(traitsClassName, traitsMethodsName) } } diff --git a/src/test/fixtures/golden/TraitsNesting/Photos/.modulite.yaml b/src/test/fixtures/golden/TraitsNesting/Photos/.modulite.yaml index beaf5ad..859bbe6 100644 --- a/src/test/fixtures/golden/TraitsNesting/Photos/.modulite.yaml +++ b/src/test/fixtures/golden/TraitsNesting/Photos/.modulite.yaml @@ -16,17 +16,8 @@ require: - "\\Engines\\LikesEngineTrait" - "\\Engines\\MusicEngineTrait" - "\\Engines\\VideosEngineTrait" - - "\\Engines\\FriendsEngineTrait::friendList()" - - "\\Engines\\FriendsEngineTrait::printFriendList()" - - "\\Engines\\LikesEngineTrait::print()" - - "\\Engines\\LikesEngineTrait::printTweetsLikes()" - - "\\Engines\\MusicEngineTrait::musicList()" - - "\\Engines\\MusicEngineTrait::musicListPrint()" + - "\\ExternalEngines\\Tweets::printTweetsLikesCountByUser()" - "\\Engines\\TestEngine::tester()" - - "\\Engines\\VideosEngineTrait::printVideosList()" - - "\\Engines\\VideosEngineTrait::videosList()" - - # Granting partial access to internal symbols, "as an exception". allow-internal-access: diff --git a/src/test/fixtures/kphp_golden/101_trait_in_module_internal/101_known_bugs.php b/src/test/fixtures/kphp_golden/006_known_bugs/006_known_bugs.php similarity index 64% rename from src/test/fixtures/kphp_golden/101_trait_in_module_internal/101_known_bugs.php rename to src/test/fixtures/kphp_golden/006_known_bugs/006_known_bugs.php index 481dcdd..15f6c07 100644 --- a/src/test/fixtures/kphp_golden/101_trait_in_module_internal/101_known_bugs.php +++ b/src/test/fixtures/kphp_golden/006_known_bugs/006_known_bugs.php @@ -5,16 +5,14 @@ require_once 'kphp_tester_include.php'; #endif -class MMM101 { - use Feed101\PrivTrait; -// ^^^^^^^^^^^^^^^^^ -// error: restricted to use Feed101\PrivTrait, it's internal in @feed +class MMM006 { + use Feed006\PrivTrait; } -(new MMM101)->showThisClass(); +(new MMM006)->showThisClass(); // here $impl is auto-deduced as PrivClass because of typed callable // so, we can call its instance methods, since we don't analyze instance methods // but we can't write a type hint or extract this callback into another var, as we can't use that internal class in phpdoc -Feed101\PubFeed::accessToPrivClass(function($impl) { // function(PrivClass $impl) is erroneous +Feed006\PubFeed::accessToPrivClass(function($impl) { // function(PrivClass $impl) is erroneous $impl->myMethod(); }); diff --git a/src/test/fixtures/kphp_golden/101_trait_in_module_internal/Feed101/.modulite.yaml b/src/test/fixtures/kphp_golden/006_known_bugs/Feed006/.modulite.yaml similarity index 62% rename from src/test/fixtures/kphp_golden/101_trait_in_module_internal/Feed101/.modulite.yaml rename to src/test/fixtures/kphp_golden/006_known_bugs/Feed006/.modulite.yaml index 1185b57..9301cba 100644 --- a/src/test/fixtures/kphp_golden/101_trait_in_module_internal/Feed101/.modulite.yaml +++ b/src/test/fixtures/kphp_golden/006_known_bugs/Feed006/.modulite.yaml @@ -1,8 +1,9 @@ name: "@feed" -namespace: "\\Feed101" +namespace: "\\Feed006" export: - "PubFeed" + - "PrivTrait" force-internal: diff --git a/src/test/fixtures/kphp_golden/101_trait_in_module_internal/Feed101/PrivClass.php b/src/test/fixtures/kphp_golden/006_known_bugs/Feed006/PrivClass.php similarity index 84% rename from src/test/fixtures/kphp_golden/101_trait_in_module_internal/Feed101/PrivClass.php rename to src/test/fixtures/kphp_golden/006_known_bugs/Feed006/PrivClass.php index 015e603..cf5f4a9 100644 --- a/src/test/fixtures/kphp_golden/101_trait_in_module_internal/Feed101/PrivClass.php +++ b/src/test/fixtures/kphp_golden/006_known_bugs/Feed006/PrivClass.php @@ -1,6 +1,6 @@