Scratch: add logging

This commit is contained in:
Natalia Selezneva
2018-01-22 11:13:12 +03:00
parent 2140b9457d
commit c32a7dd852
4 changed files with 36 additions and 6 deletions
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.idea.scratch.ScratchFile
import org.jetbrains.kotlin.idea.scratch.ScratchFileLanguageProvider
import org.jetbrains.kotlin.idea.scratch.getScratchPanelFromSelectedEditor
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutputHandlerAdapter
import org.jetbrains.kotlin.idea.scratch.ui.scratchTopPanel
import org.jetbrains.kotlin.idea.scratch.printDebugMessage
class RunScratchAction : AnAction(
KotlinBundle.message("scratch.run.button"),
@@ -45,6 +45,8 @@ class RunScratchAction : AnAction(
val handler = provider.getOutputHandler()
org.jetbrains.kotlin.idea.scratch.LOG.printDebugMessage("Run Action: isMakeBeforeRun = $isMakeBeforeRun, isRepl = $isRepl")
val module = scratchTopPanel.getModule()
if (module == null) {
handler.error(scratchFile, "Module should be selected")
@@ -21,7 +21,6 @@ import com.intellij.execution.process.CapturingProcessHandler
import com.intellij.execution.process.ProcessOutput
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.compiler.ex.CompilerPathsEx
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.module.Module
import com.intellij.openapi.roots.OrderEnumerator
import com.intellij.openapi.util.io.FileUtil
@@ -38,12 +37,14 @@ import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.debugger.DebuggerUtils
import org.jetbrains.kotlin.idea.debugger.evaluate.LOG
import org.jetbrains.kotlin.idea.refactoring.getLineNumber
import org.jetbrains.kotlin.idea.scratch.ScratchExecutor
import org.jetbrains.kotlin.idea.scratch.ScratchExpression
import org.jetbrains.kotlin.idea.scratch.ScratchFile
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutput
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutputType
import org.jetbrains.kotlin.idea.scratch.printDebugMessage
import org.jetbrains.kotlin.idea.scratch.ui.scratchTopPanel
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -54,8 +55,6 @@ import org.jetbrains.kotlin.resolve.AnalyzingUtils
import java.io.File
class KtCompilingExecutor(file: ScratchFile) : ScratchExecutor(file) {
private val log = Logger.getInstance(this.javaClass)
override fun execute() {
handlers.forEach { it.onStart(file) }
@@ -70,6 +69,8 @@ class KtCompilingExecutor(file: ScratchFile) : ScratchExecutor(file) {
is KtScratchSourceFileProcessor.Result.Error -> return error(result.message)
is KtScratchSourceFileProcessor.Result.OK -> {
ApplicationManager.getApplication().invokeLater {
LOG.printDebugMessage("After processing by KtScratchSourceFileProcessor:\n ${result.code}")
val modifiedScratchSourceFile =
KtPsiFactory(file.psiFile.project).createFileWithLightClassSupport("tmp.kt", result.code, file.psiFile)
@@ -77,13 +78,17 @@ class KtCompilingExecutor(file: ScratchFile) : ScratchExecutor(file) {
val tempDir = compileFileToTempDir(modifiedScratchSourceFile) ?: return@invokeLater
try {
val handler = CapturingProcessHandler(createCommandLine(module, result.mainClassName, tempDir.path))
val commandLine = createCommandLine(module, result.mainClassName, tempDir.path)
LOG.printDebugMessage(commandLine.commandLineString)
val handler = CapturingProcessHandler(commandLine)
ProcessOutputParser().parse(handler.runProcess())
} finally {
tempDir.delete()
}
} catch (e: Throwable) {
log.info(result.code, e)
LOG.info(result.code, e)
handlers.forEach { it.error(file, e.message ?: "Couldn't compile ${file.psiFile.name}") }
} finally {
handlers.forEach { it.onFinish(file) }
@@ -99,6 +104,8 @@ class KtCompilingExecutor(file: ScratchFile) : ScratchExecutor(file) {
val resolutionFacade = psiFile.getResolutionFacade()
val (bindingContext, files) = DebuggerUtils.analyzeInlinedFunctions(resolutionFacade, psiFile, false)
LOG.printDebugMessage("Analyzed files: \n${files.joinToString("\n") { it.virtualFilePath }}")
val generateClassFilter = object : GenerationState.GenerateClassFilter() {
override fun shouldGeneratePackagePart(ktFile: KtFile) = ktFile == psiFile
override fun shouldAnnotateClass(processingClassOrObject: KtClassOrObject) = true
@@ -124,11 +131,16 @@ class KtCompilingExecutor(file: ScratchFile) : ScratchExecutor(file) {
val classFiles = state.factory.asList().filterClassFiles()
val dir = FileUtil.createTempDirectory("compile", "scratch")
LOG.printDebugMessage("Temp output dir: ${dir.path}")
for (classFile in classFiles) {
val tmpOutFile = File(dir, classFile.relativePath)
tmpOutFile.parentFile.mkdirs()
tmpOutFile.createNewFile()
tmpOutFile.writeBytes(classFile.asByteArray())
LOG.printDebugMessage("Generated class file: ${classFile.relativePath}")
}
return dir
}
@@ -216,6 +228,8 @@ class KtCompilingExecutor(file: ScratchFile) : ScratchExecutor(file) {
var results = arrayListOf<String>()
var userOutput = arrayListOf<String>()
for (line in out.split("\n")) {
LOG.printDebugMessage("Compiling executor output: $line")
if (isOutputEnd(line)) {
return
}
@@ -25,11 +25,13 @@ import org.jetbrains.kotlin.console.KotlinConsoleKeeper
import org.jetbrains.kotlin.console.SOURCE_CHARS
import org.jetbrains.kotlin.console.XML_REPLACEMENTS
import org.jetbrains.kotlin.console.actions.logError
import org.jetbrains.kotlin.idea.debugger.evaluate.LOG
import org.jetbrains.kotlin.idea.scratch.ScratchExecutor
import org.jetbrains.kotlin.idea.scratch.ScratchExpression
import org.jetbrains.kotlin.idea.scratch.ScratchFile
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutput
import org.jetbrains.kotlin.idea.scratch.output.ScratchOutputType
import org.jetbrains.kotlin.idea.scratch.printDebugMessage
import org.jetbrains.kotlin.idea.scratch.ui.scratchTopPanel
import org.w3c.dom.Element
import org.xml.sax.InputSource
@@ -49,6 +51,8 @@ class KtScratchReplExecutor(file: ScratchFile) : ScratchExecutor(file) {
val module = file.scratchTopPanel?.getModule() ?: return error(file, "Module should be selected")
val cmdLine = KotlinConsoleKeeper.createCommandLine(module)
LOG.printDebugMessage("Execute REPL: ${cmdLine.commandLineString}")
osProcessHandler = ReplOSProcessHandler(cmdLine)
osProcessHandler.startNotify()
@@ -61,6 +65,8 @@ class KtScratchReplExecutor(file: ScratchFile) : ScratchExecutor(file) {
}
private fun sendCommandToProcess(command: String) {
LOG.printDebugMessage("Send to REPL: ${command}")
val processInputOS = osProcessHandler.processInput ?: return logError(this::class.java, "<p>Broken execute stream</p>")
val charset = osProcessHandler.charset ?: Charsets.UTF_8
@@ -133,6 +139,8 @@ class KtScratchReplExecutor(file: ScratchFile) : ScratchExecutor(file) {
val outputType = root.getAttribute("type")
val content = StringUtil.replace(root.textContent, XML_REPLACEMENTS, SOURCE_CHARS)
LOG.printDebugMessage("REPL output: $outputType $content")
if (outputType in setOf("SUCCESS", "COMPILE_ERROR", "INTERNAL_ERROR", "RUNTIME_ERROR", "READLINE_END")) {
history.entryProcessed()
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea.scratch
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.TextEditor
import com.intellij.openapi.project.Project
@@ -14,6 +15,11 @@ import com.intellij.psi.PsiFile
import org.jetbrains.kotlin.idea.scratch.ui.ScratchTopPanel
import org.jetbrains.kotlin.psi.UserDataProperty
internal val LOG = Logger.getInstance("#org.jetbrains.kotlin.idea.scratch")
internal fun Logger.printDebugMessage(str: String) {
if (isDebugEnabled) debug("SCRATCH: $str")
}
fun getEditorWithoutScratchPanel(project: Project, virtualFile: VirtualFile): TextEditor? {
val allTextEditors = getAllTextEditors(project, virtualFile)
for (editor in allTextEditors) {