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 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.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.render 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.getOrBuildFir
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState 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.stubs.AbstractMultiModuleTest
import org.jetbrains.kotlin.idea.util.sourceRoots import org.jetbrains.kotlin.idea.util.sourceRoots
import org.jetbrains.kotlin.psi.KtFile 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/" "${KotlinTestUtils.getHomeDirectory()}/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/multiModuleLazyResolve/"
fun doTest(path: String) { 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 -> val modulesByNames = testStructure.modules.associate { moduleData ->
moduleData.name to module(moduleData.name) 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 org.jetbrains.kotlin.idea.jsonUtils.getString
import java.nio.file.Path import java.nio.file.Path
sealed class TestProjectStructure { internal data class TestProjectStructure(
abstract val modules: List<TestProjectModule> val modules: List<TestProjectModule>,
abstract val fileToResolve: FileToResolve val json: JsonObject,
abstract val fails: Boolean ) {
companion object { companion object {
fun parse(json: JsonElement): TestProjectStructure { fun parse(json: JsonElement): TestProjectStructure {
require(json is JsonObject) require(json is JsonObject)
val fails = if (json.has(FAILS_FIELD)) json.get(FAILS_FIELD).asBoolean else false
return MultiModuleTestProjectStructure( return TestProjectStructure(
json.getAsJsonArray("modules").map { TestProjectModule.parse(it) }, json.getAsJsonArray("modules").map(TestProjectModule::parse),
FileToResolve.parse(json.getAsJsonObject("fileToResolve")), json,
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")
) )
} }
} }
} }
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>) { data class TestProjectModule(val name: String, val dependsOnModules: List<String>) {
companion object { 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 { fun read(testDirectory: Path, jsonFileName: String = "structure.json"): TestProjectStructure {
val jsonFile = testDirectory.resolve(jsonFileName) val jsonFile = testDirectory.resolve(jsonFileName)