Skip to content

Commit 809910f

Browse files
committed
Fix: gutter icon only on new ApplicationConfig, not use statement
- Restrict line marker and producer to ClassReference inside NewExpression (not use/import statements) - Add isTestoConfigFile() to mixin.kt for detecting config files - Include config files in isTestoFile() so right-click Run works - Handle PhpFile config in setupConfiguration with --config flag https://claude.ai/code/session_01TmFvjfMtoxTvddQRBzsbPN
1 parent 92a1b54 commit 809910f

3 files changed

Lines changed: 19 additions & 5 deletions

File tree

src/main/kotlin/com/github/xepozz/testo/mixin.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import com.jetbrains.php.lang.psi.PhpFile
88
import com.jetbrains.php.lang.psi.elements.Method
99
import com.jetbrains.php.lang.psi.elements.Function
1010
import com.jetbrains.php.lang.psi.elements.PhpAttributesOwner
11+
import com.jetbrains.php.lang.psi.elements.ClassReference
12+
import com.jetbrains.php.lang.psi.elements.NewExpression
1113
import com.jetbrains.php.lang.psi.elements.PhpClass
1214

1315
fun PsiElement.isTestoExecutable() = isTestoFunction() || isTestoMethod() || isTestoBench()
@@ -42,10 +44,13 @@ fun PsiElement.isTestoClass() = when (this) {
4244
}
4345

4446
fun PsiFile.isTestoFile() = when (this) {
45-
is PhpFile -> TestoTestDescriptor.isTestClassName(name.substringBeforeLast(".")) || (isTestoClassFile() || isTestoFunctionFile() || isTestBenchFile())
47+
is PhpFile -> TestoTestDescriptor.isTestClassName(name.substringBeforeLast(".")) || isTestoClassFile() || isTestoFunctionFile() || isTestBenchFile() || isTestoConfigFile()
4648
else -> false
4749
}
4850

51+
fun PhpFile.isTestoConfigFile() = PsiTreeUtil.findChildrenOfType(this, ClassReference::class.java)
52+
.any { it.parent is NewExpression && it.fqn == TestoClasses.APPLICATION_CONFIG }
53+
4954
fun PhpFile.isTestoClassFile() = PsiTreeUtil.findChildrenOfType(this, PhpClass::class.java)
5055
.any { it.isTestoClass() }
5156

src/main/kotlin/com/github/xepozz/testo/tests/TestoTestRunLineMarkerProvider.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.jetbrains.php.lang.lexer.PhpTokenTypes
2020
import com.jetbrains.php.lang.psi.PhpPsiUtil
2121
import com.jetbrains.php.lang.psi.elements.ClassReference
2222
import com.jetbrains.php.lang.psi.elements.Method
23+
import com.jetbrains.php.lang.psi.elements.NewExpression
2324
import com.jetbrains.php.lang.psi.elements.Function
2425
import com.jetbrains.php.lang.psi.elements.PhpAttribute
2526
import com.jetbrains.php.lang.psi.elements.PhpAttributesOwner
@@ -49,7 +50,7 @@ class TestoTestRunLineMarkerProvider : RunLineMarkerContributor() {
4950
val element = leaf.parent as? PhpPsiElement ?: return null
5051

5152
return when {
52-
element is ClassReference && element.fqn == TestoClasses.APPLICATION_CONFIG -> {
53+
element is ClassReference && element.parent is NewExpression && element.fqn == TestoClasses.APPLICATION_CONFIG -> {
5354
getLocationHint(element.containingFile)
5455
}
5556

src/main/kotlin/com/github/xepozz/testo/tests/run/TestoRunConfigurationProducer.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.github.xepozz.testo.isTestoBench
88
import com.github.xepozz.testo.isTestoClass
99
import com.github.xepozz.testo.isTestoDataProviderLike
1010
import com.github.xepozz.testo.isTestoExecutable
11+
import com.github.xepozz.testo.isTestoConfigFile
1112
import com.github.xepozz.testo.isTestoFile
1213
import com.github.xepozz.testo.isTestoFunction
1314
import com.github.xepozz.testo.isTestoMethod
@@ -36,6 +37,7 @@ import com.jetbrains.php.lang.psi.PhpFile
3637
import com.jetbrains.php.lang.psi.elements.ClassReference
3738
import com.jetbrains.php.lang.psi.elements.Function
3839
import com.jetbrains.php.lang.psi.elements.Method
40+
import com.jetbrains.php.lang.psi.elements.NewExpression
3941
import com.jetbrains.php.lang.psi.elements.PhpAttribute
4042
import com.jetbrains.php.lang.psi.elements.PhpClass
4143
import com.jetbrains.php.lang.psi.elements.PhpNamedElement
@@ -63,7 +65,7 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
6365
): PsiElement? {
6466
val testRunnerSettings = testRunnerSettings as TestoRunnerSettings
6567

66-
if (element is ClassReference && element.fqn == TestoClasses.APPLICATION_CONFIG) {
68+
if (element is ClassReference && element.parent is NewExpression && element.fqn == TestoClasses.APPLICATION_CONFIG) {
6769
testRunnerSettings.scope = PhpTestRunnerSettings.Scope.ConfigurationFile
6870
testRunnerSettings.isUseAlternativeConfigurationFile = true
6971
testRunnerSettings.configurationFilePath = virtualFile.path
@@ -126,6 +128,12 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
126128
}
127129
}
128130
}
131+
if (element is PhpFile && element.isTestoConfigFile()) {
132+
testRunnerSettings.scope = PhpTestRunnerSettings.Scope.ConfigurationFile
133+
testRunnerSettings.isUseAlternativeConfigurationFile = true
134+
testRunnerSettings.configurationFilePath = virtualFile.path
135+
return element
136+
}
129137
val result = super.setupConfiguration(testRunnerSettings, element, virtualFile)
130138
return result
131139
}
@@ -134,7 +142,7 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
134142
testRunnerSettings: PhpTestRunnerSettings,
135143
element: PsiElement
136144
): Boolean {
137-
if (element is ClassReference && element.fqn == TestoClasses.APPLICATION_CONFIG) {
145+
if (element is ClassReference && element.parent is NewExpression && element.fqn == TestoClasses.APPLICATION_CONFIG) {
138146
return testRunnerSettings.scope == PhpTestRunnerSettings.Scope.ConfigurationFile
139147
&& testRunnerSettings.configurationFilePath == element.containingFile.virtualFile.path
140148
}
@@ -284,7 +292,7 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
284292
}
285293

286294
private fun findTestElement(target: PsiElement?): PsiElement? = when (target) {
287-
is ClassReference -> target.takeIf { it.fqn == TestoClasses.APPLICATION_CONFIG }
295+
is ClassReference -> target.takeIf { it.parent is NewExpression && it.fqn == TestoClasses.APPLICATION_CONFIG }
288296
is PhpAttribute -> target.takeIf { it.owner.isTestoExecutable() || it.owner.isTestoDataProviderLike() }
289297
is Function -> target.takeIf { it.isTestoExecutable() || it.isTestoDataProviderLike() }
290298
is PhpClass -> target.takeIf { it.isTestoClass() }

0 commit comments

Comments
 (0)