From dcd7e6d767f5445df0dfb5ba9ef4caec8b5ad383 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 5 May 2016 17:54:56 +0300 Subject: [PATCH] Move ReplState to frontend --- .../cli/jvm/repl/CliReplAnalyzerEngine.kt | 57 +------------- .../kotlin/resolve/repl/ReplState.kt | 77 +++++++++++++++++++ 2 files changed, 79 insertions(+), 55 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/repl/ReplState.kt diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/CliReplAnalyzerEngine.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/CliReplAnalyzerEngine.kt index 8f31239ff33..d916cd0d33b 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/CliReplAnalyzerEngine.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/CliReplAnalyzerEngine.kt @@ -32,15 +32,11 @@ import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfoFactory import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM -import org.jetbrains.kotlin.resolve.lazy.* +import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.data.KtClassLikeInfo import org.jetbrains.kotlin.resolve.lazy.declarations.* -import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor -import org.jetbrains.kotlin.resolve.scopes.ImportingScope -import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf -import org.jetbrains.kotlin.resolve.scopes.utils.replaceImportingScopes +import org.jetbrains.kotlin.resolve.repl.ReplState import org.jetbrains.kotlin.script.ScriptPriorities -import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance class CliReplAnalyzerEngine(private val environment: KotlinCoreEnvironment) { private val topDownAnalysisContext: TopDownAnalysisContext @@ -167,52 +163,3 @@ class CliReplAnalyzerEngine(private val environment: KotlinCoreEnvironment) { } } } - -class ReplState { - private val lines = hashMapOf() - private val successfulLines = arrayListOf() - - val successfulLinesCount: Int - get() = successfulLines.size - - fun submitLine(ktFile: KtFile) { - val line = SubmittedLine(ktFile, successfulLines.lastOrNull()) - lines[ktFile] = line - ktFile.fileScopesCustomizer = object : FileScopesCustomizer { - override fun createFileScopes(fileScopeFactory: FileScopeFactory): FileScopes { - return lineInfo(ktFile)?.computeFileScopes(fileScopeFactory) ?: fileScopeFactory.createScopesForFile(ktFile) - } - } - } - - fun lineSuccess(ktFile: KtFile, scriptDescriptor: LazyScriptDescriptor) { - val successfulLine = SuccessfulLine(ktFile, successfulLines.lastOrNull(), scriptDescriptor) - lines[ktFile] = successfulLine - successfulLines.add(successfulLine) - } - - fun lineFailure(ktFile: KtFile) { - lines[ktFile] = FailedLine(ktFile, successfulLines.lastOrNull()) - } - - fun lineInfo(ktFile: KtFile) = lines[ktFile] - - inner abstract class LineInfo { - abstract val linePsi: KtFile - abstract val parentLine: SuccessfulLine? - - fun computeFileScopes(fileScopeFactory: FileScopeFactory): FileScopes { - // create scope that wraps previous line lexical scope and adds imports from this line - val lexicalScopeAfterLastLine = parentLine?.lineDescriptor?.scopeForInitializerResolution - ?: return fileScopeFactory.createScopesForFile(linePsi) - val lastLineImports = lexicalScopeAfterLastLine.parentsWithSelf.firstIsInstance() - 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() - inner class SuccessfulLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?, val lineDescriptor: LazyScriptDescriptor) : LineInfo() - inner class FailedLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?) : LineInfo() -} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/repl/ReplState.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/repl/ReplState.kt new file mode 100644 index 00000000000..d0884f4e2ff --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/repl/ReplState.kt @@ -0,0 +1,77 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.resolve.repl + +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.resolve.lazy.FileScopeFactory +import org.jetbrains.kotlin.resolve.lazy.FileScopes +import org.jetbrains.kotlin.resolve.lazy.FileScopesCustomizer +import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor +import org.jetbrains.kotlin.resolve.lazy.fileScopesCustomizer +import org.jetbrains.kotlin.resolve.scopes.ImportingScope +import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf +import org.jetbrains.kotlin.resolve.scopes.utils.replaceImportingScopes +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance + +class ReplState { + private val lines = hashMapOf() + private val successfulLines = arrayListOf() + + val successfulLinesCount: Int + get() = successfulLines.size + + fun submitLine(ktFile: KtFile) { + val line = SubmittedLine(ktFile, successfulLines.lastOrNull()) + lines[ktFile] = line + ktFile.fileScopesCustomizer = object : FileScopesCustomizer { + override fun createFileScopes(fileScopeFactory: FileScopeFactory): FileScopes { + return lineInfo(ktFile)?.computeFileScopes(fileScopeFactory) ?: fileScopeFactory.createScopesForFile(ktFile) + } + } + } + + fun lineSuccess(ktFile: KtFile, scriptDescriptor: LazyScriptDescriptor) { + val successfulLine = SuccessfulLine(ktFile, successfulLines.lastOrNull(), scriptDescriptor) + lines[ktFile] = successfulLine + successfulLines.add(successfulLine) + } + + fun lineFailure(ktFile: KtFile) { + lines[ktFile] = FailedLine(ktFile, successfulLines.lastOrNull()) + } + + fun lineInfo(ktFile: KtFile) = lines[ktFile] + + inner abstract class LineInfo { + abstract val linePsi: KtFile + abstract val parentLine: SuccessfulLine? + + fun computeFileScopes(fileScopeFactory: FileScopeFactory): FileScopes { + // create scope that wraps previous line lexical scope and adds imports from this line + val lexicalScopeAfterLastLine = parentLine?.lineDescriptor?.scopeForInitializerResolution + ?: return fileScopeFactory.createScopesForFile(linePsi) + val lastLineImports = lexicalScopeAfterLastLine.parentsWithSelf.firstIsInstance() + 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() + inner class SuccessfulLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?, val lineDescriptor: LazyScriptDescriptor) : LineInfo() + inner class FailedLine(override val linePsi: KtFile, override val parentLine: SuccessfulLine?) : LineInfo() +}