Skip to content

Commit 92a1b54

Browse files
committed
Add Run gutter icon for ApplicationConfig files (#39)
Detect \Testo\Application\Config\ApplicationConfig class references and show a play button in the gutter. Clicking it creates a run configuration with --config=<file-path> using the existing Scope.ConfigurationFile mechanism. https://claude.ai/code/session_01TmFvjfMtoxTvddQRBzsbPN
1 parent 0425e04 commit 92a1b54

3 files changed

Lines changed: 18 additions & 0 deletions

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ object TestoClasses {
1212

1313
const val BENCH = "\\Testo\\Bench"
1414

15+
const val APPLICATION_CONFIG = "\\Testo\\Application\\Config\\ApplicationConfig"
16+
1517
const val ASSERT = "\\Testo\\Assert"
1618
const val ASSERTION_EXCEPTION = "\\Testo\\Assert\\State\\Assertion\\AssertionException"
1719
const val EXPECT = "\\Testo\\Expect"

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ class TestoTestRunLineMarkerProvider : RunLineMarkerContributor() {
4949
val element = leaf.parent as? PhpPsiElement ?: return null
5050

5151
return when {
52+
element is ClassReference && element.fqn == TestoClasses.APPLICATION_CONFIG -> {
53+
getLocationHint(element.containingFile)
54+
}
55+
5256
element is ClassReference && element.parent is PhpAttribute -> {
5357
val attribute = element.parent as PhpAttribute
5458
if (attribute.fqn !in RUNNABLE_ATTRIBUTES) return null

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.jetbrains.php.PhpBundle
3333
import com.jetbrains.php.PhpIndex
3434
import com.jetbrains.php.PhpIndexImpl
3535
import com.jetbrains.php.lang.psi.PhpFile
36+
import com.jetbrains.php.lang.psi.elements.ClassReference
3637
import com.jetbrains.php.lang.psi.elements.Function
3738
import com.jetbrains.php.lang.psi.elements.Method
3839
import com.jetbrains.php.lang.psi.elements.PhpAttribute
@@ -62,6 +63,12 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
6263
): PsiElement? {
6364
val testRunnerSettings = testRunnerSettings as TestoRunnerSettings
6465

66+
if (element is ClassReference && element.fqn == TestoClasses.APPLICATION_CONFIG) {
67+
testRunnerSettings.scope = PhpTestRunnerSettings.Scope.ConfigurationFile
68+
testRunnerSettings.isUseAlternativeConfigurationFile = true
69+
testRunnerSettings.configurationFilePath = virtualFile.path
70+
return element
71+
}
6572
if (element is PhpAttribute) {
6673
val function = element.owner as? Function ?: return null
6774
setupConfiguration(testRunnerSettings, function, element.containingFile.virtualFile) ?: return null
@@ -127,6 +134,10 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
127134
testRunnerSettings: PhpTestRunnerSettings,
128135
element: PsiElement
129136
): Boolean {
137+
if (element is ClassReference && element.fqn == TestoClasses.APPLICATION_CONFIG) {
138+
return testRunnerSettings.scope == PhpTestRunnerSettings.Scope.ConfigurationFile
139+
&& testRunnerSettings.configurationFilePath == element.containingFile.virtualFile.path
140+
}
130141
if (element is PhpClass) {
131142
return when {
132143
testRunnerSettings.scope != PhpTestRunnerSettings.Scope.File -> false
@@ -273,6 +284,7 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
273284
}
274285

275286
private fun findTestElement(target: PsiElement?): PsiElement? = when (target) {
287+
is ClassReference -> target.takeIf { it.fqn == TestoClasses.APPLICATION_CONFIG }
276288
is PhpAttribute -> target.takeIf { it.owner.isTestoExecutable() || it.owner.isTestoDataProviderLike() }
277289
is Function -> target.takeIf { it.isTestoExecutable() || it.isTestoDataProviderLike() }
278290
is PhpClass -> target.takeIf { it.isTestoClass() }

0 commit comments

Comments
 (0)