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