From c32a7dd852456e1e47b4bd7a6765ddfe2d6c3106 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Mon, 22 Jan 2018 11:13:12 +0300 Subject: [PATCH] Scratch: add logging --- .../idea/scratch/actions/RunScratchAction.kt | 4 +++- .../scratch/compile/KtCompilingExecutor.kt | 24 +++++++++++++++---- .../scratch/repl/KtScratchReplExecutor.kt | 8 +++++++ .../kotlin/idea/scratch/scratchUtils.kt | 6 +++++ 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/actions/RunScratchAction.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/actions/RunScratchAction.kt index 50e1eb79db3..73f71d0d8f1 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/actions/RunScratchAction.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/actions/RunScratchAction.kt @@ -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") diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/compile/KtCompilingExecutor.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/compile/KtCompilingExecutor.kt index 3eef50e6017..34818ef0ec4 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/compile/KtCompilingExecutor.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/compile/KtCompilingExecutor.kt @@ -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() var userOutput = arrayListOf() for (line in out.split("\n")) { + LOG.printDebugMessage("Compiling executor output: $line") + if (isOutputEnd(line)) { return } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/repl/KtScratchReplExecutor.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/repl/KtScratchReplExecutor.kt index d66b692b0cd..8c22afd1320 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/repl/KtScratchReplExecutor.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/repl/KtScratchReplExecutor.kt @@ -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, "

Broken execute stream

") 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() } diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/scratchUtils.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/scratchUtils.kt index e6e87295241..65f62e6fcbf 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/scratchUtils.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/scratch/scratchUtils.kt @@ -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) {