FIR IDE: separate logic of TestProjectStructure from AbstractFirMultiModuleLazyResolveTest

This commit is contained in:
Ilya Kirillov
2020-11-27 14:53:37 +01:00
parent 3515cd546d
commit 519f1549f0
2 changed files with 49 additions and 34 deletions
@@ -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"
}
}
@@ -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)