fix(gui): scroll to first error on jadx script check/run

This commit is contained in:
Skylot
2024-01-18 18:16:28 +00:00
parent c0ff7572ac
commit fb703cd856
3 changed files with 19 additions and 30 deletions
@@ -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);
@@ -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<ScriptDiagnostic> issues) {
@@ -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<ScriptDiagnostic>()
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<ScriptDiagnostic>()
analyzerResult?.get(ReplAnalyzerResult.analysisDiagnostics)?.let(issues::addAll)
issues.addAll(result.reports)
return ScriptAnalyzeResult(
success = !result.isError(),
issues = issues,
renderType = analyzerResult?.get(ReplAnalyzerResult.renderedResultType),
)
}
}