11package com.github.xepozz.testo
22
33import com.github.xepozz.testo.tests.TestoTestDescriptor
4+ import com.intellij.openapi.diagnostic.Logger
5+ import com.intellij.openapi.progress.ProcessCanceledException
6+ import com.intellij.openapi.roots.ProjectFileIndex
47import com.intellij.psi.PsiElement
58import com.intellij.psi.PsiFile
69import com.intellij.psi.util.PsiTreeUtil
@@ -12,6 +15,8 @@ import com.jetbrains.php.lang.psi.elements.ClassReference
1215import com.jetbrains.php.lang.psi.elements.NewExpression
1316import com.jetbrains.php.lang.psi.elements.PhpClass
1417
18+ private val LOG = Logger .getInstance(" #com.github.xepozz.testo.mixin" )
19+
1520fun PsiElement.isTestoExecutable () = isTestoFunction() || isTestoMethod() || isTestoBench()
1621
1722fun PsiElement.isTestoBench () = when (this ) {
@@ -54,9 +59,28 @@ fun PsiElement.isTestoClass() = when (this) {
5459 else -> false
5560}
5661
57- fun PsiFile.isTestoFile () = when (this ) {
58- is PhpFile -> TestoTestDescriptor .isTestClassName(name.substringBeforeLast(" ." )) || isTestoClassFile() || isTestoFunctionFile() || isTestBenchFile() || isTestoConfigFile()
59- else -> false
62+ fun PsiFile.isTestoFile (): Boolean {
63+ if (this !is PhpFile ) return false
64+ val vFile = virtualFile ? : return false
65+ if (! vFile.isValid) return false
66+
67+ val fileIndex = ProjectFileIndex .getInstance(project)
68+ if (! fileIndex.isInContent(vFile)) return false
69+ if (fileIndex.isExcluded(vFile)) return false
70+ if (fileIndex.isUnderIgnored(vFile)) return false
71+
72+ return try {
73+ TestoTestDescriptor .isTestClassName(name.substringBeforeLast(" ." ))
74+ || isTestoClassFile()
75+ || isTestoFunctionFile()
76+ || isTestBenchFile()
77+ || isTestoConfigFile()
78+ } catch (e: ProcessCanceledException ) {
79+ throw e
80+ } catch (e: Throwable ) {
81+ LOG .warn(" Failed to determine whether ${vFile.path} is a Testo file" , e)
82+ false
83+ }
6084}
6185
6286fun PhpFile.isTestoConfigFile () = PsiTreeUtil .findChildrenOfType(this , ClassReference ::class .java)
0 commit comments