FIR IDE: separate logic of TestProjectStructure from AbstractFirMultiModuleLazyResolveTest
This commit is contained in:
+41
-2
@@ -5,12 +5,14 @@
|
||||
|
||||
package org.jetbrains.kotlin.idea.fir.low.level.api
|
||||
|
||||
import com.google.gson.JsonElement
|
||||
import com.google.gson.JsonObject
|
||||
import com.intellij.openapi.vfs.VirtualFileManager
|
||||
import com.intellij.psi.PsiManager
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
|
||||
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
||||
import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest
|
||||
import org.jetbrains.kotlin.idea.util.sourceRoots
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
@@ -23,7 +25,7 @@ abstract class AbstractFirMultiModuleLazyResolveTest : AbstractMultiModuleTest()
|
||||
"${KotlinTestUtils.getHomeDirectory()}/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/multiModuleLazyResolve/"
|
||||
|
||||
fun doTest(path: String) {
|
||||
val testStructure = TestProjectStructureReader.read(Paths.get(path))
|
||||
val testStructure = MultiModuleTestProjectStructure.fromTestProjectStructure(TestProjectStructureReader.read(Paths.get(path)))
|
||||
val modulesByNames = testStructure.modules.associate { moduleData ->
|
||||
moduleData.name to module(moduleData.name)
|
||||
}
|
||||
@@ -55,3 +57,40 @@ abstract class AbstractFirMultiModuleLazyResolveTest : AbstractMultiModuleTest()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private data class FileToResolve(val moduleName: String, val relativeFilePath: String) {
|
||||
val filePath get() = "$moduleName/$relativeFilePath"
|
||||
|
||||
companion object {
|
||||
fun parse(json: JsonElement): FileToResolve {
|
||||
require(json is JsonObject)
|
||||
return FileToResolve(
|
||||
moduleName = json.getString("module"),
|
||||
relativeFilePath = json.getString("file")
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private data class MultiModuleTestProjectStructure(
|
||||
val modules: List<TestProjectModule>,
|
||||
val fileToResolve: FileToResolve,
|
||||
val fails: Boolean
|
||||
) {
|
||||
companion object {
|
||||
fun fromTestProjectStructure(testProjectStructure: TestProjectStructure): MultiModuleTestProjectStructure {
|
||||
val json = testProjectStructure.json
|
||||
|
||||
val fails = if (json.has(FAILS_FIELD)) json.get(FAILS_FIELD).asBoolean else false
|
||||
val fileToResolve = FileToResolve.parse(json.getAsJsonObject("fileToResolve"))
|
||||
|
||||
return MultiModuleTestProjectStructure(
|
||||
testProjectStructure.modules,
|
||||
fileToResolve,
|
||||
fails
|
||||
)
|
||||
}
|
||||
|
||||
private const val FAILS_FIELD = "fails"
|
||||
}
|
||||
}
|
||||
|
||||
+8
-32
@@ -13,46 +13,22 @@ import com.intellij.openapi.util.io.FileUtil
|
||||
import org.jetbrains.kotlin.idea.jsonUtils.getString
|
||||
import java.nio.file.Path
|
||||
|
||||
sealed class TestProjectStructure {
|
||||
abstract val modules: List<TestProjectModule>
|
||||
abstract val fileToResolve: FileToResolve
|
||||
abstract val fails: Boolean
|
||||
|
||||
internal data class TestProjectStructure(
|
||||
val modules: List<TestProjectModule>,
|
||||
val json: JsonObject,
|
||||
) {
|
||||
companion object {
|
||||
fun parse(json: JsonElement): TestProjectStructure {
|
||||
require(json is JsonObject)
|
||||
val fails = if (json.has(FAILS_FIELD)) json.get(FAILS_FIELD).asBoolean else false
|
||||
|
||||
return MultiModuleTestProjectStructure(
|
||||
json.getAsJsonArray("modules").map { TestProjectModule.parse(it) },
|
||||
FileToResolve.parse(json.getAsJsonObject("fileToResolve")),
|
||||
fails
|
||||
)
|
||||
}
|
||||
|
||||
private const val FAILS_FIELD = "fails"
|
||||
}
|
||||
}
|
||||
|
||||
data class FileToResolve(val moduleName: String, val relativeFilePath: String) {
|
||||
val filePath get() = "$moduleName/$relativeFilePath"
|
||||
|
||||
companion object {
|
||||
fun parse(json: JsonElement): FileToResolve {
|
||||
require(json is JsonObject)
|
||||
return FileToResolve(
|
||||
moduleName = json.getString("module"),
|
||||
relativeFilePath = json.getString("file")
|
||||
return TestProjectStructure(
|
||||
json.getAsJsonArray("modules").map(TestProjectModule::parse),
|
||||
json,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class MultiModuleTestProjectStructure(
|
||||
override val modules: List<TestProjectModule>,
|
||||
override val fileToResolve: FileToResolve,
|
||||
override val fails: Boolean
|
||||
) : TestProjectStructure()
|
||||
|
||||
data class TestProjectModule(val name: String, val dependsOnModules: List<String>) {
|
||||
companion object {
|
||||
@@ -71,7 +47,7 @@ data class TestProjectModule(val name: String, val dependsOnModules: List<String
|
||||
}
|
||||
}
|
||||
|
||||
object TestProjectStructureReader {
|
||||
internal object TestProjectStructureReader {
|
||||
fun read(testDirectory: Path, jsonFileName: String = "structure.json"): TestProjectStructure {
|
||||
val jsonFile = testDirectory.resolve(jsonFileName)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user