FIR IDE: run incremental analysis in file structure tests multiple times
This commit is contained in:
+49
-10
@@ -9,7 +9,6 @@ import com.intellij.openapi.util.io.FileUtil
|
|||||||
import com.intellij.psi.PsiDocumentManager
|
import com.intellij.psi.PsiDocumentManager
|
||||||
import com.intellij.psi.PsiWhiteSpace
|
import com.intellij.psi.PsiWhiteSpace
|
||||||
import com.intellij.psi.util.parentOfType
|
import com.intellij.psi.util.parentOfType
|
||||||
import junit.framework.Assert
|
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl
|
import org.jetbrains.kotlin.idea.fir.low.level.api.FirModuleResolveStateImpl
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getResolveState
|
||||||
@@ -33,24 +32,54 @@ abstract class AbstractFileStructureAndOutOfBlockModificationTrackerConsistencyT
|
|||||||
?: error("Please, specify should out of block change happen or not by `// OUT_OF_BLOCK:` directive")
|
?: error("Please, specify should out of block change happen or not by `// OUT_OF_BLOCK:` directive")
|
||||||
|
|
||||||
val elementAtCaret = ktFile.findElementAtCaret()
|
val elementAtCaret = ktFile.findElementAtCaret()
|
||||||
val (initialStructureElement, initialFileStructure, initialModuleResolveState) = getStructureElementForKtElement(elementAtCaret)
|
|
||||||
|
|
||||||
|
var fileStructureWithResolveState = getStructureElementForKtElement(elementAtCaret)
|
||||||
|
for (i in 0..REPETITIONS_COUNT) {
|
||||||
|
fileStructureWithResolveState = typeAndCheck(ktFile, fileStructureWithResolveState, textToType, outOfBlock)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun typeAndCheck(
|
||||||
|
ktFile: KtFile,
|
||||||
|
fileStructureWithResolveStateBeforeTyping: FileStructureWithResolveState,
|
||||||
|
textToType: String,
|
||||||
|
outOfBlock: Boolean,
|
||||||
|
): FileStructureWithResolveState {
|
||||||
|
val newFileStructureWithResolveState = getStateAfterTyping(textToType, ktFile)
|
||||||
|
checkIsCorrect(newFileStructureWithResolveState, fileStructureWithResolveStateBeforeTyping, outOfBlock)
|
||||||
|
return newFileStructureWithResolveState
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getStateAfterTyping(
|
||||||
|
textToType: String,
|
||||||
|
ktFile: KtFile
|
||||||
|
): FileStructureWithResolveState {
|
||||||
myFixture.type(textToType)
|
myFixture.type(textToType)
|
||||||
PsiDocumentManager.getInstance(project).commitAllDocuments()
|
PsiDocumentManager.getInstance(project).commitAllDocuments()
|
||||||
|
|
||||||
val newElementAtCaret = ktFile.findElementAtCaret()
|
val newElementAtCaret = ktFile.findElementAtCaret()
|
||||||
val (newStructureElement, newFileStructure, newModuleResolveState) = getStructureElementForKtElement(newElementAtCaret)
|
return getStructureElementForKtElement(newElementAtCaret)
|
||||||
Assert.assertTrue("Structure elements should be different after typing", newStructureElement !== initialStructureElement)
|
}
|
||||||
|
|
||||||
Assert.assertEquals(
|
private fun checkIsCorrect(
|
||||||
|
newFileStructureWithResolveState: FileStructureWithResolveState,
|
||||||
|
fileStructureWithResolveStateBeforeTyping: FileStructureWithResolveState,
|
||||||
|
outOfBlock: Boolean
|
||||||
|
) {
|
||||||
|
assertTrue(
|
||||||
|
"Structure elements should be different after typing",
|
||||||
|
newFileStructureWithResolveState.element !== fileStructureWithResolveStateBeforeTyping.element
|
||||||
|
)
|
||||||
|
|
||||||
|
assertEquals(
|
||||||
"FirModuleResolveState should change only on out of block modification",
|
"FirModuleResolveState should change only on out of block modification",
|
||||||
outOfBlock,
|
outOfBlock,
|
||||||
newModuleResolveState !== initialModuleResolveState
|
newFileStructureWithResolveState.resolveState !== fileStructureWithResolveStateBeforeTyping.resolveState
|
||||||
)
|
)
|
||||||
Assert.assertEquals(
|
assertEquals(
|
||||||
"FileStructure state should change only on out of block modification",
|
"FileStructure state should change only on out of block modification",
|
||||||
outOfBlock,
|
outOfBlock,
|
||||||
initialFileStructure !== newFileStructure
|
newFileStructureWithResolveState.fileStructure !== fileStructureWithResolveStateBeforeTyping.fileStructure
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,11 +91,21 @@ abstract class AbstractFileStructureAndOutOfBlockModificationTrackerConsistencyT
|
|||||||
return element!!.parentOfType()!!
|
return element!!.parentOfType()!!
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getStructureElementForKtElement(element: KtElement): Triple<FileStructureElement, FileStructure, FirModuleResolveState> {
|
private fun getStructureElementForKtElement(element: KtElement): FileStructureWithResolveState {
|
||||||
val moduleResolveState = element.getResolveState() as FirModuleResolveStateImpl
|
val moduleResolveState = element.getResolveState() as FirModuleResolveStateImpl
|
||||||
val fileStructure =
|
val fileStructure =
|
||||||
moduleResolveState.fileStructureCache.getFileStructure(element.containingKtFile, moduleResolveState.rootModuleSession.cache)
|
moduleResolveState.fileStructureCache.getFileStructure(element.containingKtFile, moduleResolveState.rootModuleSession.cache)
|
||||||
val fileStructureElement = fileStructure.getStructureElementFor(element)
|
val fileStructureElement = fileStructure.getStructureElementFor(element)
|
||||||
return Triple(fileStructureElement, fileStructure, moduleResolveState)
|
return FileStructureWithResolveState(fileStructureElement, fileStructure, moduleResolveState)
|
||||||
|
}
|
||||||
|
|
||||||
|
private data class FileStructureWithResolveState(
|
||||||
|
val element: FileStructureElement,
|
||||||
|
val fileStructure: FileStructure,
|
||||||
|
val resolveState: FirModuleResolveState
|
||||||
|
)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val REPETITIONS_COUNT = 3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user