From fb703cd856f7fa0f0a49498521d4abdd86985b32 Mon Sep 17 00:00:00 2001 From: Skylot Date: Thu, 18 Jan 2024 18:16:28 +0000 Subject: [PATCH] fix(gui): scroll to first error on jadx script check/run --- .../plugins/script/ScriptContentPanel.java | 2 +- .../plugins/script/ScriptErrorService.java | 11 +++--- .../src/main/kotlin/ScriptServices.kt | 36 +++++++------------ 3 files changed, 19 insertions(+), 30 deletions(-) diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/script/ScriptContentPanel.java b/jadx-gui/src/main/java/jadx/gui/plugins/script/ScriptContentPanel.java index e9da82bc1..f9657afc7 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/script/ScriptContentPanel.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/script/ScriptContentPanel.java @@ -175,7 +175,6 @@ public class ScriptContentPanel extends AbstractCodeContentPanel { errorService.clearErrors(); errorService.addCompilerIssues(issues); errorService.addLintErrors(lintErrs); - errorService.apply(); if (!success) { resultLabel.setText("Compile issues: " + issues.size()); showScriptLog(); @@ -184,6 +183,7 @@ public class ScriptContentPanel extends AbstractCodeContentPanel { } else { resultLabel.setText("OK"); } + errorService.apply(); return success; } catch (Throwable e) { scriptLog.error("Failed to check code", e); diff --git a/jadx-gui/src/main/java/jadx/gui/plugins/script/ScriptErrorService.java b/jadx-gui/src/main/java/jadx/gui/plugins/script/ScriptErrorService.java index 1fff06a64..38c49f7be 100644 --- a/jadx-gui/src/main/java/jadx/gui/plugins/script/ScriptErrorService.java +++ b/jadx-gui/src/main/java/jadx/gui/plugins/script/ScriptErrorService.java @@ -15,8 +15,8 @@ import kotlin.script.experimental.api.ScriptDiagnostic; import kotlin.script.experimental.api.SourceCode; public class ScriptErrorService extends AbstractParser { - private static final Logger LOG = LoggerFactory.getLogger(ScriptErrorService.class); + private final DefaultParseResult result; private final ScriptCodeArea scriptArea; @@ -39,6 +39,7 @@ public class ScriptErrorService extends AbstractParser { scriptArea.removeParser(this); scriptArea.addParser(this); scriptArea.addNotify(); + scriptArea.requestFocus(); jumpCaretToFirstError(); } @@ -49,15 +50,15 @@ public class ScriptErrorService extends AbstractParser { } ParserNotice notice = parserNotices.get(0); int offset = notice.getOffset(); - if (offset != -1) { - scriptArea.setCaretPosition(offset); - } else { + if (offset == -1) { try { - scriptArea.setCaretPosition(scriptArea.getLineStartOffset(notice.getLine())); + offset = scriptArea.getLineStartOffset(notice.getLine()); } catch (Exception e) { LOG.error("Failed to jump to first error", e); + return; } } + scriptArea.scrollToPos(offset); } public void addCompilerIssues(List issues) { diff --git a/jadx-plugins/jadx-script/jadx-script-ide/src/main/kotlin/ScriptServices.kt b/jadx-plugins/jadx-script/jadx-script-ide/src/main/kotlin/ScriptServices.kt index 648932653..9dcc6f720 100644 --- a/jadx-plugins/jadx-script/jadx-script-ide/src/main/kotlin/ScriptServices.kt +++ b/jadx-plugins/jadx-script/jadx-script-ide/src/main/kotlin/ScriptServices.kt @@ -49,31 +49,19 @@ class ScriptServices { } fun analyze(scriptName: String, code: String): ScriptAnalyzeResult { - // TODO: temp solution: analyze do not work with dependencies, use compile instead val sourceCode = code.toScriptSource(scriptName) - if (code.contains("@file:DependsOn(")) { - val result = runBlocking { - ScriptEval().compile(sourceCode) - } - return ScriptAnalyzeResult( - success = !result.isError(), - issues = result.reports, - renderType = null, - ) - } else { - val result = runBlocking { - val cursor = SourceCode.Position(0, 0) // not used - replCompiler.analyze(sourceCode, cursor, compileConf) - } - val analyzerResult = result.valueOrNull() - val issues = mutableListOf() - analyzerResult?.get(ReplAnalyzerResult.analysisDiagnostics)?.let(issues::addAll) - issues.addAll(result.reports) - return ScriptAnalyzeResult( - success = !result.isError(), - issues = issues, - renderType = analyzerResult?.get(ReplAnalyzerResult.renderedResultType), - ) + val result = runBlocking { + val cursor = SourceCode.Position(0, 0) // not used + replCompiler.analyze(sourceCode, cursor, compileConf) } + val analyzerResult = result.valueOrNull() + val issues = mutableListOf() + analyzerResult?.get(ReplAnalyzerResult.analysisDiagnostics)?.let(issues::addAll) + issues.addAll(result.reports) + return ScriptAnalyzeResult( + success = !result.isError(), + issues = issues, + renderType = analyzerResult?.get(ReplAnalyzerResult.renderedResultType), + ) } }