Minor: prettify ReplState

This commit is contained in:
Pavel V. Talanov
2016-05-16 19:30:21 +03:00
parent 9cff590366
commit f59638d60f
@@ -29,49 +29,49 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
class ReplState { class ReplState {
private val lines = hashMapOf<KtFile, LineInfo>() private val lines = hashMapOf<KtFile, LineInfo>()
private val successfulLines = arrayListOf<SuccessfulLine>() private val successfulLines = arrayListOf<LineInfo.SuccessfulLine>()
val successfulLinesCount: Int val successfulLinesCount: Int
get() = successfulLines.size get() = successfulLines.size
fun submitLine(ktFile: KtFile) { fun submitLine(ktFile: KtFile) {
val line = SubmittedLine(ktFile, successfulLines.lastOrNull()) val line = LineInfo.SubmittedLine(ktFile, successfulLines.lastOrNull())
lines[ktFile] = line lines[ktFile] = line
ktFile.fileScopesCustomizer = object : FileScopesCustomizer { ktFile.fileScopesCustomizer = object : FileScopesCustomizer {
override fun createFileScopes(fileScopeFactory: FileScopeFactory): FileScopes { override fun createFileScopes(fileScopeFactory: FileScopeFactory): FileScopes {
return lineInfo(ktFile)?.computeFileScopes(fileScopeFactory) ?: fileScopeFactory.createScopesForFile(ktFile) return lineInfo(ktFile)?.let { computeFileScopes(it, fileScopeFactory) } ?: fileScopeFactory.createScopesForFile(ktFile)
} }
} }
} }
fun lineSuccess(ktFile: KtFile, scriptDescriptor: LazyScriptDescriptor) { fun lineSuccess(ktFile: KtFile, scriptDescriptor: LazyScriptDescriptor) {
val successfulLine = SuccessfulLine(ktFile, successfulLines.lastOrNull(), scriptDescriptor) val successfulLine = LineInfo.SuccessfulLine(ktFile, successfulLines.lastOrNull(), scriptDescriptor)
lines[ktFile] = successfulLine lines[ktFile] = successfulLine
successfulLines.add(successfulLine) successfulLines.add(successfulLine)
} }
fun lineFailure(ktFile: KtFile) { fun lineFailure(ktFile: KtFile) {
lines[ktFile] = FailedLine(ktFile, successfulLines.lastOrNull()) lines[ktFile] = LineInfo.FailedLine(ktFile, successfulLines.lastOrNull())
} }
fun lineInfo(ktFile: KtFile) = lines[ktFile] private fun lineInfo(ktFile: KtFile) = lines[ktFile]
inner abstract class LineInfo { // use sealed?
private sealed class LineInfo {
abstract val linePsi: KtFile abstract val linePsi: KtFile
abstract val parentLine: SuccessfulLine? abstract val parentLine: SuccessfulLine?
fun computeFileScopes(fileScopeFactory: FileScopeFactory): FileScopes { class SubmittedLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?) : LineInfo()
// create scope that wraps previous line lexical scope and adds imports from this line class SuccessfulLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?, val lineDescriptor: LazyScriptDescriptor) : LineInfo()
val lexicalScopeAfterLastLine = parentLine?.lineDescriptor?.scopeForInitializerResolution class FailedLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?) : LineInfo()
?: return fileScopeFactory.createScopesForFile(linePsi)
val lastLineImports = lexicalScopeAfterLastLine.parentsWithSelf.firstIsInstance<ImportingScope>()
val scopesForThisLine = fileScopeFactory.createScopesForFile(linePsi, lastLineImports)
val combinedLexicalScopes = lexicalScopeAfterLastLine.replaceImportingScopes(scopesForThisLine.importingScope)
return FileScopes(combinedLexicalScopes, scopesForThisLine.importingScope, scopesForThisLine.importResolver)
}
} }
inner class SubmittedLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?) : LineInfo() private fun computeFileScopes(lineInfo: LineInfo, fileScopeFactory: FileScopeFactory): FileScopes? {
inner class SuccessfulLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?, val lineDescriptor: LazyScriptDescriptor) : LineInfo() // create scope that wraps previous line lexical scope and adds imports from this line
inner class FailedLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?) : LineInfo() val lexicalScopeAfterLastLine = lineInfo.parentLine?.lineDescriptor?.scopeForInitializerResolution ?: return null
val lastLineImports = lexicalScopeAfterLastLine.parentsWithSelf.firstIsInstance<ImportingScope>()
val scopesForThisLine = fileScopeFactory.createScopesForFile(lineInfo.linePsi, lastLineImports)
val combinedLexicalScopes = lexicalScopeAfterLastLine.replaceImportingScopes(scopesForThisLine.importingScope)
return FileScopes(combinedLexicalScopes, scopesForThisLine.importingScope, scopesForThisLine.importResolver)
}
} }