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