From 97aa53e294bffc6e8647df06b2ee23287c356a88 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 30 Aug 2026 15:54:36 +0000 Subject: [PATCH 01/13] Initial plan From 06e3ccb853ce46e0b9256c2213ace9d50150a6fd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 30 Aug 2026 15:57:51 +0000 Subject: [PATCH 02/13] feat: add option to ignore vendor class name collisions Co-authored-by: funivan <425208+funivan@users.noreply.github.com> --- .../ClassNameCollisionInspection.html | 1 + .../ClassNameCollisionInspection.kt | 22 +++++++++- .../ClassNameCollisionInspectionTest.kt | 42 +++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html index bf14027..498f8b5 100644 --- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html +++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html @@ -1,5 +1,6 @@ Classes with same name in different namespaces can be confused. (Disabled by default) +

Option: Ignore vendor classes.

 namespace App {
   class User {}; // <- Class name collision with \Cli\User
diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 6ab4793..c3e8bb8 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -2,14 +2,28 @@ package com.funivan.idea.phpClean.inspections.classNameCollision
 
 import com.funivan.idea.phpClean.spl.PhpCleanInspection
 import com.intellij.codeInspection.ProblemsHolder
+import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel
 import com.intellij.psi.PsiElement
 import com.intellij.psi.PsiElementVisitor
 import com.jetbrains.php.PhpIndex
 import com.jetbrains.php.lang.psi.elements.PhpClass
 import com.jetbrains.php.lang.psi.visitors.PhpElementVisitor
+import javax.swing.JComponent
 
 class ClassNameCollisionInspection : PhpCleanInspection() {
+    @JvmField
+    var ignoreVendorClasses = false
+
     override fun getShortName() = "ClassNameCollisionInspection"
+
+    override fun createOptionsPanel(): JComponent {
+        return SingleCheckboxOptionsPanel(
+            "Ignore vendor classes",
+            this,
+            "ignoreVendorClasses"
+        )
+    }
+
     override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
         return object : PhpElementVisitor() {
             override fun visitPhpClass(phpClass: PhpClass) {
@@ -30,5 +44,11 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
         name: PsiElement
     ) = PhpIndex.getInstance(origin.project)
         .getClassesByName(name.text)
-        .firstOrNull { it.fqn != origin.fqn }
+        .firstOrNull { it.fqn != origin.fqn && !(ignoreVendorClasses && isVendorClass(it)) }
+
+    private fun isVendorClass(phpClass: PhpClass): Boolean {
+        return phpClass.containingFile.virtualFile?.path
+            ?.replace('\\', '/')
+            ?.contains("/vendor/") == true
+    }
 }
diff --git a/src/test/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspectionTest.kt b/src/test/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspectionTest.kt
index 3612e69..b32060c 100644
--- a/src/test/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspectionTest.kt
+++ b/src/test/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspectionTest.kt
@@ -34,4 +34,46 @@ class ClassNameCollisionInspectionTest : BaseInspectionTest() {
                 """
         )
     }
+
+    @Test
+    fun testVendorCollisionIgnoredWhenOptionEnabled() {
+        myFixture.addFileToProject(
+            "vendor/lib/User.php",
+            """User {};
+                }
+            """
+        )
+    }
 }

From b0a994dab877426e481750a6b12504b62ae5939a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 15:58:36 +0000
Subject: [PATCH 03/13] fix: scope vendor collision detection to project vendor
 dir

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../ClassNameCollisionInspection.kt                  | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index c3e8bb8..8e99730 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -47,8 +47,16 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
         .firstOrNull { it.fqn != origin.fqn && !(ignoreVendorClasses && isVendorClass(it)) }
 
     private fun isVendorClass(phpClass: PhpClass): Boolean {
-        return phpClass.containingFile.virtualFile?.path
+        val filePath = phpClass.containingFile.virtualFile?.path
             ?.replace('\\', '/')
-            ?.contains("/vendor/") == true
+            ?: return false
+        val projectPath = phpClass.project.basePath
+            ?.replace('\\', '/')
+            ?: return Regex("(^|/)vendor/").containsMatchIn(filePath)
+
+        if (!filePath.startsWith("$projectPath/")) {
+            return false
+        }
+        return filePath.startsWith("$projectPath/vendor/")
     }
 }

From d24cff2e91e62d85141dc7966727a4d276bd9ec9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 15:59:08 +0000
Subject: [PATCH 04/13] refactor: remove imprecise vendor fallback path
 matching

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../classNameCollision/ClassNameCollisionInspection.kt          | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 8e99730..74f1d23 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -52,7 +52,7 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
             ?: return false
         val projectPath = phpClass.project.basePath
             ?.replace('\\', '/')
-            ?: return Regex("(^|/)vendor/").containsMatchIn(filePath)
+            ?: return false
 
         if (!filePath.startsWith("$projectPath/")) {
             return false

From 432948e66d85e335174c11e7a4cea6667f54fb5b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 15:59:27 +0000
Subject: [PATCH 05/13] refactor: simplify vendor path check

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../classNameCollision/ClassNameCollisionInspection.kt         | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 74f1d23..8f3b329 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -54,9 +54,6 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
             ?.replace('\\', '/')
             ?: return false
 
-        if (!filePath.startsWith("$projectPath/")) {
-            return false
-        }
         return filePath.startsWith("$projectPath/vendor/")
     }
 }

From 5e143cbfc66fea68f2d2ab5bd47e4d3bd39c050a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 15:59:53 +0000
Subject: [PATCH 06/13] refactor: apply vendor filtering before collision
 lookup

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../classNameCollision/ClassNameCollisionInspection.kt        | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 8f3b329..3186412 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -44,7 +44,9 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
         name: PsiElement
     ) = PhpIndex.getInstance(origin.project)
         .getClassesByName(name.text)
-        .firstOrNull { it.fqn != origin.fqn && !(ignoreVendorClasses && isVendorClass(it)) }
+        .filter { it.fqn != origin.fqn }
+        .filterNot { ignoreVendorClasses && isVendorClass(it) }
+        .firstOrNull()
 
     private fun isVendorClass(phpClass: PhpClass): Boolean {
         val filePath = phpClass.containingFile.virtualFile?.path

From ff25c1f7e70751ce061626b477f45992d85add06 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 16:00:21 +0000
Subject: [PATCH 07/13] fix: use VFS ancestry check for vendor class detection

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../ClassNameCollisionInspection.kt                   | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 3186412..17c3a9f 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -3,6 +3,8 @@ package com.funivan.idea.phpClean.inspections.classNameCollision
 import com.funivan.idea.phpClean.spl.PhpCleanInspection
 import com.intellij.codeInspection.ProblemsHolder
 import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel
+import com.intellij.openapi.vfs.LocalFileSystem
+import com.intellij.openapi.vfs.VfsUtilCore
 import com.intellij.psi.PsiElement
 import com.intellij.psi.PsiElementVisitor
 import com.jetbrains.php.PhpIndex
@@ -49,13 +51,14 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
         .firstOrNull()
 
     private fun isVendorClass(phpClass: PhpClass): Boolean {
-        val filePath = phpClass.containingFile.virtualFile?.path
-            ?.replace('\\', '/')
+        val file = phpClass.containingFile.virtualFile
             ?: return false
-        val projectPath = phpClass.project.basePath
+        val vendorPath = phpClass.project.basePath
             ?.replace('\\', '/')
             ?: return false
+        val vendorDir = LocalFileSystem.getInstance().findFileByPath("$vendorPath/vendor")
+            ?: return false
 
-        return filePath.startsWith("$projectPath/vendor/")
+        return VfsUtilCore.isAncestor(vendorDir, file, false)
     }
 }

From 20093f421c209ea6f60c6c3aad5088106298f5e7 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 16:00:47 +0000
Subject: [PATCH 08/13] refactor: resolve vendor dir from project virtual file

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../classNameCollision/ClassNameCollisionInspection.kt     | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 17c3a9f..1a5fa53 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -53,10 +53,11 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
     private fun isVendorClass(phpClass: PhpClass): Boolean {
         val file = phpClass.containingFile.virtualFile
             ?: return false
-        val vendorPath = phpClass.project.basePath
-            ?.replace('\\', '/')
+        val basePath = phpClass.project.basePath
             ?: return false
-        val vendorDir = LocalFileSystem.getInstance().findFileByPath("$vendorPath/vendor")
+        val projectDir = LocalFileSystem.getInstance().findFileByPath(basePath)
+            ?: return false
+        val vendorDir = projectDir.findChild("vendor")
             ?: return false
 
         return VfsUtilCore.isAncestor(vendorDir, file, false)

From e5d789e532d39ab21150f8b67389b888423bb650 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 16:01:23 +0000
Subject: [PATCH 09/13] perf: cache vendor dir during collision filtering

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../ClassNameCollisionInspection.kt           | 31 ++++++++++++-------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 1a5fa53..e96136f 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -5,6 +5,7 @@ import com.intellij.codeInspection.ProblemsHolder
 import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel
 import com.intellij.openapi.vfs.LocalFileSystem
 import com.intellij.openapi.vfs.VfsUtilCore
+import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.psi.PsiElement
 import com.intellij.psi.PsiElementVisitor
 import com.jetbrains.php.PhpIndex
@@ -44,21 +45,29 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
     private fun find(
         origin: PhpClass,
         name: PsiElement
-    ) = PhpIndex.getInstance(origin.project)
-        .getClassesByName(name.text)
-        .filter { it.fqn != origin.fqn }
-        .filterNot { ignoreVendorClasses && isVendorClass(it) }
-        .firstOrNull()
+    ): PhpClass? {
+        val vendorDir = if (ignoreVendorClasses) findVendorDir(origin) else null
+        return PhpIndex.getInstance(origin.project)
+            .getClassesByName(name.text)
+            .filter { it.fqn != origin.fqn }
+            .filterNot { ignoreVendorClasses && isVendorClass(it, vendorDir) }
+            .firstOrNull()
+    }
 
-    private fun isVendorClass(phpClass: PhpClass): Boolean {
-        val file = phpClass.containingFile.virtualFile
-            ?: return false
+    private fun findVendorDir(phpClass: PhpClass): VirtualFile? {
         val basePath = phpClass.project.basePath
-            ?: return false
+            ?: return null
         val projectDir = LocalFileSystem.getInstance().findFileByPath(basePath)
+            ?: return null
+        return projectDir.findChild("vendor")
+    }
+
+    private fun isVendorClass(phpClass: PhpClass, vendorDir: VirtualFile?): Boolean {
+        val file = phpClass.containingFile.virtualFile
             ?: return false
-        val vendorDir = projectDir.findChild("vendor")
-            ?: return false
+        if (vendorDir == null) {
+            return false
+        }
 
         return VfsUtilCore.isAncestor(vendorDir, file, false)
     }

From e2d3a5c15658521675c01d1b8850e0c770ebec95 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 16:02:28 +0000
Subject: [PATCH 10/13] refactor: make vendor filtering contract explicit

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../ClassNameCollisionInspection.kt           | 27 ++++++++++---------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index e96136f..3287794 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -3,6 +3,7 @@ package com.funivan.idea.phpClean.inspections.classNameCollision
 import com.funivan.idea.phpClean.spl.PhpCleanInspection
 import com.intellij.codeInspection.ProblemsHolder
 import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel
+import com.intellij.openapi.project.Project
 import com.intellij.openapi.vfs.LocalFileSystem
 import com.intellij.openapi.vfs.VfsUtilCore
 import com.intellij.openapi.vfs.VirtualFile
@@ -28,10 +29,11 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
     }
 
     override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor {
+        val vendorDir = if (ignoreVendorClasses) findVendorDir(holder.project) else null
         return object : PhpElementVisitor() {
             override fun visitPhpClass(phpClass: PhpClass) {
                 phpClass.nameIdentifier?.let { name ->
-                    find(phpClass, name)?.let { clazz ->
+                    find(phpClass, name, vendorDir)?.let { clazz ->
                         holder.registerProblem(
                             name,
                             "Class name collision with ${clazz.fqn}"
@@ -44,30 +46,31 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
 
     private fun find(
         origin: PhpClass,
-        name: PsiElement
+        name: PsiElement,
+        vendorDir: VirtualFile?
     ): PhpClass? {
-        val vendorDir = if (ignoreVendorClasses) findVendorDir(origin) else null
-        return PhpIndex.getInstance(origin.project)
+        val collisions = PhpIndex.getInstance(origin.project)
             .getClassesByName(name.text)
             .filter { it.fqn != origin.fqn }
-            .filterNot { ignoreVendorClasses && isVendorClass(it, vendorDir) }
-            .firstOrNull()
+        val filtered = if (vendorDir == null) {
+            collisions
+        } else {
+            collisions.filterNot { isVendorClass(it, vendorDir) }
+        }
+        return filtered.firstOrNull()
     }
 
-    private fun findVendorDir(phpClass: PhpClass): VirtualFile? {
-        val basePath = phpClass.project.basePath
+    private fun findVendorDir(project: Project): VirtualFile? {
+        val basePath = project.basePath
             ?: return null
         val projectDir = LocalFileSystem.getInstance().findFileByPath(basePath)
             ?: return null
         return projectDir.findChild("vendor")
     }
 
-    private fun isVendorClass(phpClass: PhpClass, vendorDir: VirtualFile?): Boolean {
+    private fun isVendorClass(phpClass: PhpClass, vendorDir: VirtualFile): Boolean {
         val file = phpClass.containingFile.virtualFile
             ?: return false
-        if (vendorDir == null) {
-            return false
-        }
 
         return VfsUtilCore.isAncestor(vendorDir, file, false)
     }

From 11eaefde303ca4034d8c28fd50a7cced8ee70cbe Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 16:02:52 +0000
Subject: [PATCH 11/13] fix: require strict vendor directory ancestry

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../classNameCollision/ClassNameCollisionInspection.kt          | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 3287794..0ba39cc 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -72,6 +72,6 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
         val file = phpClass.containingFile.virtualFile
             ?: return false
 
-        return VfsUtilCore.isAncestor(vendorDir, file, false)
+        return VfsUtilCore.isAncestor(vendorDir, file, true)
     }
 }

From b7cd5cbf97e83b058e49d52fc5a37837e45ba679 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 16:03:27 +0000
Subject: [PATCH 12/13] docs: clarify vendor collision option behavior

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../classNameCollision/ClassNameCollisionInspection.html    | 2 +-
 .../classNameCollision/ClassNameCollisionInspection.kt      | 6 +++++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html
index 498f8b5..73ada2e 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html
@@ -1,6 +1,6 @@
 Classes with same name in different namespaces can be confused.
 (Disabled by default)
-

Option: Ignore vendor classes.

+

Option: Ignore vendor classes. When enabled, class name collisions with classes defined in the project vendor directory are ignored.

 namespace App {
   class User {}; // <- Class name collision with \Cli\User
diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
index 0ba39cc..cb0454a 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.kt
@@ -15,6 +15,10 @@ import com.jetbrains.php.lang.psi.visitors.PhpElementVisitor
 import javax.swing.JComponent
 
 class ClassNameCollisionInspection : PhpCleanInspection() {
+    companion object {
+        private const val VENDOR_DIR_NAME = "vendor"
+    }
+
     @JvmField
     var ignoreVendorClasses = false
 
@@ -65,7 +69,7 @@ class ClassNameCollisionInspection : PhpCleanInspection() {
             ?: return null
         val projectDir = LocalFileSystem.getInstance().findFileByPath(basePath)
             ?: return null
-        return projectDir.findChild("vendor")
+        return projectDir.findChild(VENDOR_DIR_NAME)
     }
 
     private fun isVendorClass(phpClass: PhpClass, vendorDir: VirtualFile): Boolean {

From 594d53ef5b00f33cc843ce6c9a9c36bbfe759ce2 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 30 Aug 2026 16:03:53 +0000
Subject: [PATCH 13/13] docs: fix grammar in vendor option help text

Co-authored-by: funivan <425208+funivan@users.noreply.github.com>
---
 .../classNameCollision/ClassNameCollisionInspection.html        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html
index 73ada2e..90b6259 100644
--- a/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html
+++ b/src/main/kotlin/com/funivan/idea/phpClean/inspections/classNameCollision/ClassNameCollisionInspection.html
@@ -1,6 +1,6 @@
 Classes with same name in different namespaces can be confused.
 (Disabled by default)
-

Option: Ignore vendor classes. When enabled, class name collisions with classes defined in the project vendor directory are ignored.

+

Option: Ignore vendor classes. When enabled, class name collisions with classes defined in the project's vendor directory are ignored.

 namespace App {
   class User {}; // <- Class name collision with \Cli\User