From 1a2d4dbfb857e8a5fc3b135b04cc8657fb72a3eb Mon Sep 17 00:00:00 2001 From: Richardas Kuchinskas Date: Tue, 19 Sep 2023 19:54:01 +0300 Subject: [PATCH 01/17] Added new cases for tests --- .../011_late_static_bindings.php | 9 +++++++ .../Logs011/BaseLog011.php | 12 +++++++++ .../Messages011/.modulite.yaml | 15 +++++++++++ .../Messages011/MessagesLogger011.php | 16 +++++++++++ ..._package_not_required_in_derived_class.php | 9 +++++++ .../BasePrinter012/BasePrinter012.php | 12 +++++++++ .../Printer012/.modulite.yaml | 18 +++++++++++++ .../Printer012/Printer012.php | 13 +++++++++ .../composer.json | 18 +++++++++++++ .../packages/vk-strings/composer.json | 10 +++++++ .../packages/vk-strings/src/SomeStr.php | 9 +++++++ ...nheritance_calling_class_inside_parent.php | 8 ++++++ .../BasePrinter013/AppendStr013.php | 9 +++++++ .../BasePrinter013/BasePrinter013.php | 10 +++++++ .../Printer013/.modulite.yaml | 18 +++++++++++++ .../Printer013/Printer013.php | 13 +++++++++ .../100_wrong_static_bindings.php | 12 +++++++++ .../Logs100/BaseLog100.php | 12 +++++++++ .../Messages100/.modulite.yaml | 13 +++++++++ .../Messages100/MessagesLogger100.php | 20 ++++++++++++++ .../com/vk/modulite/tests/KphpGoldenTests.kt | 27 ++++++++++++------- 21 files changed, 273 insertions(+), 10 deletions(-) create mode 100644 src/test/fixtures/kphp_golden/011_late_static_bindings/011_late_static_bindings.php create mode 100644 src/test/fixtures/kphp_golden/011_late_static_bindings/Logs011/BaseLog011.php create mode 100644 src/test/fixtures/kphp_golden/011_late_static_bindings/Messages011/.modulite.yaml create mode 100644 src/test/fixtures/kphp_golden/011_late_static_bindings/Messages011/MessagesLogger011.php create mode 100644 src/test/fixtures/kphp_golden/012_package_not_required_in_derived_class/012_package_not_required_in_derived_class.php create mode 100644 src/test/fixtures/kphp_golden/012_package_not_required_in_derived_class/BasePrinter012/BasePrinter012.php create mode 100644 src/test/fixtures/kphp_golden/012_package_not_required_in_derived_class/Printer012/.modulite.yaml create mode 100644 src/test/fixtures/kphp_golden/012_package_not_required_in_derived_class/Printer012/Printer012.php create mode 100644 src/test/fixtures/kphp_golden/012_package_not_required_in_derived_class/composer.json create mode 100644 src/test/fixtures/kphp_golden/012_package_not_required_in_derived_class/packages/vk-strings/composer.json create mode 100644 src/test/fixtures/kphp_golden/012_package_not_required_in_derived_class/packages/vk-strings/src/SomeStr.php create mode 100644 src/test/fixtures/kphp_golden/013_inheritance_calling_class_inside_parent/013_inheritance_calling_class_inside_parent.php create mode 100644 src/test/fixtures/kphp_golden/013_inheritance_calling_class_inside_parent/BasePrinter013/AppendStr013.php create mode 100644 src/test/fixtures/kphp_golden/013_inheritance_calling_class_inside_parent/BasePrinter013/BasePrinter013.php create mode 100644 src/test/fixtures/kphp_golden/013_inheritance_calling_class_inside_parent/Printer013/.modulite.yaml create mode 100644 src/test/fixtures/kphp_golden/013_inheritance_calling_class_inside_parent/Printer013/Printer013.php create mode 100644 src/test/fixtures/kphp_golden/100_wrong_static_bindings/100_wrong_static_bindings.php create mode 100644 src/test/fixtures/kphp_golden/100_wrong_static_bindings/Logs100/BaseLog100.php create mode 100644 src/test/fixtures/kphp_golden/100_wrong_static_bindings/Messages100/.modulite.yaml create mode 100644 src/test/fixtures/kphp_golden/100_wrong_static_bindings/Messages100/MessagesLogger100.php diff --git a/src/test/fixtures/kphp_golden/011_late_static_bindings/011_late_static_bindings.php b/src/test/fixtures/kphp_golden/011_late_static_bindings/011_late_static_bindings.php new file mode 100644 index 0000000..5e9e1f9 --- /dev/null +++ b/src/test/fixtures/kphp_golden/011_late_static_bindings/011_late_static_bindings.php @@ -0,0 +1,9 @@ +@ok +KPHP_ENABLE_MODULITE=1 + Date: Tue, 3 Oct 2023 19:49:47 +0300 Subject: [PATCH 02/17] added traits nesting handler --- .../services/ModuliteDependenciesCollector.kt | 86 ++++++++++++++----- 1 file changed, 65 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/com/vk/modulite/services/ModuliteDependenciesCollector.kt b/src/main/kotlin/com/vk/modulite/services/ModuliteDependenciesCollector.kt index 210fd63..0446781 100644 --- a/src/main/kotlin/com/vk/modulite/services/ModuliteDependenciesCollector.kt +++ b/src/main/kotlin/com/vk/modulite/services/ModuliteDependenciesCollector.kt @@ -11,20 +11,7 @@ import com.intellij.util.containers.TreeNodeProcessingResult import com.jetbrains.php.lang.PhpLangUtil import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocType import com.jetbrains.php.lang.psi.PhpFile -import com.jetbrains.php.lang.psi.elements.ClassConstantReference -import com.jetbrains.php.lang.psi.elements.ClassReference -import com.jetbrains.php.lang.psi.elements.ConstantReference -import com.jetbrains.php.lang.psi.elements.FieldReference -import com.jetbrains.php.lang.psi.elements.FunctionReference -import com.jetbrains.php.lang.psi.elements.Global -import com.jetbrains.php.lang.psi.elements.MethodReference -import com.jetbrains.php.lang.psi.elements.NewExpression -import com.jetbrains.php.lang.psi.elements.PhpNamedElement -import com.jetbrains.php.lang.psi.elements.PhpNamespace -import com.jetbrains.php.lang.psi.elements.PhpNamespaceReference -import com.jetbrains.php.lang.psi.elements.PhpReference -import com.jetbrains.php.lang.psi.elements.PhpUse -import com.jetbrains.php.lang.psi.elements.Variable +import com.jetbrains.php.lang.psi.elements.* import com.jetbrains.php.lang.psi.elements.impl.FieldImpl import com.jetbrains.php.lang.psi.elements.impl.FunctionImpl import com.jetbrains.php.lang.psi.elements.impl.MethodImpl @@ -40,6 +27,7 @@ import com.vk.modulite.psi.extensions.php.symbolName import com.vk.modulite.utils.fromKphpPolyfills import com.vk.modulite.utils.fromStubs import com.vk.modulite.utils.fromTests +import java.util.* class ModuliteDepsDiff( private val project: Project, @@ -200,6 +188,7 @@ class ModuliteDependenciesCollector(val project: Project) { ) } + // тут запускается наш сборщик fun collect( dir: VirtualFile, ownSymbols: List? = null, @@ -227,12 +216,16 @@ class ModuliteDependenciesCollector(val project: Project) { psiFile.accept(object : PhpRecursiveElementVisitor() { override fun visitPhpClassReference(reference: ClassReference) { when (reference.context) { - is PhpUse, is MethodReference, is ClassConstantReference -> { + is PhpUse -> { + handleTraitReference(reference) + } + + is MethodReference, is ClassConstantReference -> { return } } - handleReference(reference) + handleReference(reference) } override fun visitPhpFunctionCall(reference: FunctionReference) { @@ -292,15 +285,63 @@ class ModuliteDependenciesCollector(val project: Project) { } } - private fun handleReference(reference: PhpReference?, traverseFurther: Boolean = true) { - if (reference == null) return + private fun referenceValidator(reference: PhpReference?): MutableCollection? { + if (reference == null) return null val references = reference.resolveGlobal(false) if (references.isEmpty()) { - LOG.warn("Unknown reference '${reference.safeFqn()}'") - return + LOG.warn("Неизвестная ссылка '${reference.safeFqn()}'") + return null } + return references + } + + private fun handleTraitReference(reference: PhpReference?, traverseFurther: Boolean = true) { + val references = referenceValidator(reference) ?: return + + val stack = LinkedList() // Создаем стек для хранения вложенных instance + var traitsClasses: Array = arrayOf() + + references.forEach { elem -> + val instance = elem as PhpClass + stack.push(instance) // Добавляем текущий instance в стек + while (stack.isNotEmpty()) { + val currentInstance = stack.pop() // Получаем текущий instance из стека + + if (currentInstance.hasTraitUses()) { + val traitsUses = currentInstance.traits + traitsClasses += traitsUses + + traitsUses.forEach { it -> + val instanceNesting: Array? = it.traits + + instanceNesting?.forEach { nestedInstance -> + stack.push(nestedInstance) // Добавляем вложенный instance в стек + } + + if (instanceNesting != null) { + traitsClasses += instanceNesting + } + } + } + } + val traitsNames = traitsClasses.mapNotNull { processElement(it, reference) } + addSymbols(traitsNames) + val methodsNames = instance.methods.mapNotNull { processElement(it, reference) } + addSymbols(methodsNames) + } + + val names = references.mapNotNull { processElement(it, reference) } + addSymbols(names) + if (traverseFurther) { + super.visitPhpElement(reference) + } + } + + private fun handleReference(reference: PhpReference?, traverseFurther: Boolean = true) { + val references = referenceValidator(reference)?:return + val names = references.mapNotNull { processElement(it, reference) } addSymbols(names) @@ -349,7 +390,10 @@ class ModuliteDependenciesCollector(val project: Project) { private fun addSymbol(name: SymbolName) { // TODO: simplify? - if (name.kind != SymbolName.Kind.Modulite && (ownSymbolsSet.contains(name) || ownSymbolsSet.contains(name.className()))) { + if (name.kind != SymbolName.Kind.Modulite && (ownSymbolsSet.contains(name) || ownSymbolsSet.contains( + name.className() + )) + ) { return } From 9190dc7d09e5819e756fcd19b57b36daca087b8d Mon Sep 17 00:00:00 2001 From: Richardas Kuchinskas Date: Wed, 4 Oct 2023 19:08:11 +0300 Subject: [PATCH 03/17] added condition for situation where PhpUse is use as import (not trait) added support for trait import/required inspection --- .../inspections/InternalSymbolUsageInspection.kt | 8 ++++++++ .../modulite/services/ModuliteDependenciesCollector.kt | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/vk/modulite/inspections/InternalSymbolUsageInspection.kt b/src/main/kotlin/com/vk/modulite/inspections/InternalSymbolUsageInspection.kt index acafea4..23ed73f 100644 --- a/src/main/kotlin/com/vk/modulite/inspections/InternalSymbolUsageInspection.kt +++ b/src/main/kotlin/com/vk/modulite/inspections/InternalSymbolUsageInspection.kt @@ -7,6 +7,7 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocType import com.jetbrains.php.lang.psi.elements.* +import com.jetbrains.php.lang.psi.elements.impl.PhpUseImpl import com.jetbrains.php.lang.psi.visitors.PhpElementVisitor import com.vk.modulite.SymbolName import com.vk.modulite.composer.ComposerPackage @@ -122,6 +123,13 @@ class InternalSymbolUsageInspection : LocalInspectionTool() { checkReferenceUsage(type) } + override fun visitPhpUse(expression: PhpUse?) { + val instance = expression as PhpUseImpl + if (instance.isTraitImport) { + instance.targetReference?.let { checkReferenceUsage(it) } + } + } + private fun checkReferenceUsage(reference: PhpReference, problemElement: PsiElement? = reference) { val references = reference.resolveGlobal(false) if (references.isEmpty()) { diff --git a/src/main/kotlin/com/vk/modulite/services/ModuliteDependenciesCollector.kt b/src/main/kotlin/com/vk/modulite/services/ModuliteDependenciesCollector.kt index 0446781..dde1186 100644 --- a/src/main/kotlin/com/vk/modulite/services/ModuliteDependenciesCollector.kt +++ b/src/main/kotlin/com/vk/modulite/services/ModuliteDependenciesCollector.kt @@ -15,6 +15,7 @@ import com.jetbrains.php.lang.psi.elements.* import com.jetbrains.php.lang.psi.elements.impl.FieldImpl import com.jetbrains.php.lang.psi.elements.impl.FunctionImpl import com.jetbrains.php.lang.psi.elements.impl.MethodImpl +import com.jetbrains.php.lang.psi.elements.impl.PhpUseImpl import com.vk.modulite.Namespace import com.vk.modulite.SymbolName import com.vk.modulite.actions.dialogs.DepsRegenerationResultDialog @@ -217,7 +218,14 @@ class ModuliteDependenciesCollector(val project: Project) { override fun visitPhpClassReference(reference: ClassReference) { when (reference.context) { is PhpUse -> { - handleTraitReference(reference) + val useInstance = reference.context as PhpUseImpl + if(useInstance.isTraitImport){ + handleTraitReference(reference) + }else{ + return + } + + } is MethodReference, is ClassConstantReference -> { From 8dd121c2f78468f5a40235278d210f90a5cd7a73 Mon Sep 17 00:00:00 2001 From: Richardas Kuchinskas Date: Fri, 6 Oct 2023 19:42:04 +0300 Subject: [PATCH 04/17] added more logic for 'required' traits added new tests for inspections --- .run/Run Plugin.run.xml | 5 +- .../InternalSymbolUsageInspection.kt | 84 ++++++++++++++++++- .../Engines/FriendsEngineTrait.php | 14 ++++ .../Engines/LikesEngineTrait.php | 15 ++++ .../Engines/MusicEngineTrait.php | 13 +++ .../TraitsNesting/Engines/TestEngine.php | 10 +++ .../Engines/VideosEngineTrait.php | 13 +++ .../ExternalEngines/.modulite.yaml | 17 ++++ .../TraitsNesting/ExternalEngines/Tweets.php | 10 +++ .../TraitsNesting/Photos/.modulite.yaml | 32 +++++++ .../golden/TraitsNesting/Photos/Photo.php | 12 +++ .../Engines/FriendsEngineTrait.php | 14 ++++ .../Engines/LikesEngineTrait.php | 15 ++++ .../Engines/MusicEngineTrait.php | 13 +++ .../Engines/TestEngine.php | 10 +++ .../Engines/VideosEngineTrait.php | 13 +++ .../ExternalEngines/.modulite.yaml | 17 ++++ .../ExternalEngines/Tweets.php | 10 +++ .../Photos/.modulite.yaml | 21 +++++ .../RestrictedTraitRequire/Photos/Photo.php | 13 +++ .../ExternalEngines/.modulite.yaml | 17 ++++ .../UnknownPackage/ExternalEngines/Tweets.php | 10 +++ .../UnknownPackage/Photos/.modulite.yaml | 22 +++++ .../UnknownPackage/Photos/Photo.php | 10 +++ .../com/vk/modulite/tests/GoldenTests.kt | 1 + .../vk/modulite/tests/PhpInspectionsTest.kt | 6 ++ .../vk/modulite/tests/YamlInspectionsTest.kt | 5 ++ 27 files changed, 417 insertions(+), 5 deletions(-) create mode 100644 src/test/fixtures/golden/TraitsNesting/Engines/FriendsEngineTrait.php create mode 100644 src/test/fixtures/golden/TraitsNesting/Engines/LikesEngineTrait.php create mode 100644 src/test/fixtures/golden/TraitsNesting/Engines/MusicEngineTrait.php create mode 100644 src/test/fixtures/golden/TraitsNesting/Engines/TestEngine.php create mode 100644 src/test/fixtures/golden/TraitsNesting/Engines/VideosEngineTrait.php create mode 100644 src/test/fixtures/golden/TraitsNesting/ExternalEngines/.modulite.yaml create mode 100644 src/test/fixtures/golden/TraitsNesting/ExternalEngines/Tweets.php create mode 100644 src/test/fixtures/golden/TraitsNesting/Photos/.modulite.yaml create mode 100644 src/test/fixtures/golden/TraitsNesting/Photos/Photo.php create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/Engines/FriendsEngineTrait.php create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/Engines/LikesEngineTrait.php create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/Engines/MusicEngineTrait.php create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/Engines/TestEngine.php create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/Engines/VideosEngineTrait.php create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/ExternalEngines/.modulite.yaml create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/ExternalEngines/Tweets.php create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/Photos/.modulite.yaml create mode 100644 src/test/fixtures/inspections/RestrictedTraitRequire/Photos/Photo.php create mode 100644 src/test/fixtures/inspections/UnknownPackage/ExternalEngines/.modulite.yaml create mode 100644 src/test/fixtures/inspections/UnknownPackage/ExternalEngines/Tweets.php create mode 100644 src/test/fixtures/inspections/UnknownPackage/Photos/.modulite.yaml create mode 100644 src/test/fixtures/inspections/UnknownPackage/Photos/Photo.php diff --git a/.run/Run Plugin.run.xml b/.run/Run Plugin.run.xml index 20a70af..cc416fa 100644 --- a/.run/Run Plugin.run.xml +++ b/.run/Run Plugin.run.xml @@ -11,7 +11,7 @@