[analysis api] simplify dependent analysis mode tests
This commit is contained in:
+2
-1
@@ -20,7 +20,8 @@ import java.nio.file.Path
|
||||
|
||||
interface AnalysisApiTestConfiguratorService {
|
||||
val testPrefix: String? get() = null
|
||||
val allowDependedAnalysisSession: Boolean get() = true
|
||||
|
||||
val analyseInDependentSession: Boolean
|
||||
|
||||
fun TestConfigurationBuilder.configureTest(disposable: Disposable)
|
||||
fun processTestFiles(files: List<KtFile>): List<KtFile> = files
|
||||
|
||||
-15
@@ -35,19 +35,4 @@ abstract class AbstractAnalysisApiBasedSingleModuleTest : AbstractAnalysisApiBas
|
||||
|
||||
protected inline fun <R> executeOnPooledThreadInReadAction(crossinline action: () -> R): R =
|
||||
ApplicationManager.getApplication().executeOnPooledThread<R> { runReadAction(action) }.get()
|
||||
|
||||
protected fun <R> analyseForTest(contextElement: KtElement, action: KtAnalysisSession.() -> R): R {
|
||||
return if (useDependedAnalysisSession) {
|
||||
// Depended mode does not support analysing a KtFile.
|
||||
// See org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir#getResolveStateForDependentCopy
|
||||
if (contextElement is KtFile) {
|
||||
throw SkipDependedModeException()
|
||||
}
|
||||
|
||||
require(!contextElement.isPhysical)
|
||||
analyseInDependedAnalysisSession(configurator.getOriginalFile(contextElement.containingKtFile), contextElement, action)
|
||||
} else {
|
||||
analyse(contextElement, action)
|
||||
}
|
||||
}
|
||||
}
|
||||
+13
-23
@@ -11,6 +11,9 @@ import com.intellij.openapi.application.ApplicationManager
|
||||
import com.intellij.openapi.util.Disposer
|
||||
import com.intellij.testFramework.TestDataFile
|
||||
import junit.framework.ComparisonFailure
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.analyse
|
||||
import org.jetbrains.kotlin.analysis.api.analyseInDependedAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.test.framework.AnalysisApiTestConfiguratorService
|
||||
import org.jetbrains.kotlin.analysis.test.framework.TestWithDisposable
|
||||
import org.jetbrains.kotlin.analysis.test.framework.project.structure.KotlinProjectStructureProviderTestImpl
|
||||
@@ -22,6 +25,7 @@ import org.jetbrains.kotlin.analysis.test.framework.project.structure.getKtFiles
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoots
|
||||
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.test.ExecutionListenerBasedDisposableProvider
|
||||
import org.jetbrains.kotlin.test.InTextDirectivesUtils
|
||||
@@ -42,21 +46,15 @@ import org.junit.jupiter.api.TestInfo
|
||||
import java.io.File
|
||||
import java.nio.file.Path
|
||||
import java.nio.file.Paths
|
||||
import java.util.concurrent.ExecutionException
|
||||
import kotlin.io.path.exists
|
||||
import kotlin.io.path.nameWithoutExtension
|
||||
|
||||
abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() {
|
||||
abstract val configurator: AnalysisApiTestConfiguratorService
|
||||
|
||||
protected open val enableTestInDependedMode: Boolean
|
||||
get() = configurator.allowDependedAnalysisSession
|
||||
|
||||
protected lateinit var testInfo: KotlinTestInfo
|
||||
private set
|
||||
|
||||
protected var useDependedAnalysisSession: Boolean = false
|
||||
|
||||
protected lateinit var testDataPath: Path
|
||||
private set
|
||||
|
||||
@@ -192,21 +190,15 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() {
|
||||
|
||||
configurator.prepareTestFiles(ktFiles, singleModule, testServices)
|
||||
doTestByFileStructure(ktFiles, moduleStructure, testServices)
|
||||
if (!enableTestInDependedMode || ktFiles.any {
|
||||
InTextDirectivesUtils.isDirectiveDefined(it.text, DISABLE_DEPENDED_MODE_DIRECTIVE)
|
||||
}) {
|
||||
return
|
||||
}
|
||||
try {
|
||||
useDependedAnalysisSession = true
|
||||
doTestByFileStructure(configurator.processTestFiles(ktFiles), moduleStructure, testServices)
|
||||
} catch (e: SkipDependedModeException) {
|
||||
// Skip the test if needed
|
||||
} catch (e: ExecutionException) {
|
||||
if (e.cause !is SkipDependedModeException)
|
||||
throw Exception("Test succeeded in normal analysis mode but failed in depended analysis mode.", e)
|
||||
} catch (e: Exception) {
|
||||
throw Exception("Test succeeded in normal analysis mode but failed in depended analysis mode.", e)
|
||||
}
|
||||
|
||||
protected fun <R> analyseForTest(contextElement: KtElement, action: KtAnalysisSession.() -> R): R {
|
||||
return if (configurator.analyseInDependentSession) {
|
||||
require(!contextElement.isPhysical)
|
||||
val originalFile = configurator.getOriginalFile(contextElement.containingKtFile)
|
||||
analyseInDependedAnalysisSession(originalFile, contextElement, action)
|
||||
} else {
|
||||
analyse(contextElement, action)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,8 +218,6 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() {
|
||||
)
|
||||
}
|
||||
|
||||
protected class SkipDependedModeException : Exception()
|
||||
|
||||
companion object {
|
||||
val DISABLE_DEPENDED_MODE_DIRECTIVE = "DISABLE_DEPENDED_MODE"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user