diff --git a/app/src/main/java/com/tyron/code/ui/editor/impl/text/rosemoe/CodeEditorFragment.java b/app/src/main/java/com/tyron/code/ui/editor/impl/text/rosemoe/CodeEditorFragment.java index 2a77b5c0d..2ad94e7f6 100644 --- a/app/src/main/java/com/tyron/code/ui/editor/impl/text/rosemoe/CodeEditorFragment.java +++ b/app/src/main/java/com/tyron/code/ui/editor/impl/text/rosemoe/CodeEditorFragment.java @@ -330,9 +330,12 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat LogViewModel logViewModel = new ViewModelProvider(requireActivity()).get(LogViewModel.class); - mEditor.setDiagnosticsListener(diagnostics -> - ProgressManager.getInstance().runLater(() -> - logViewModel.updateLogs(LogViewModel.DEBUG, diagnostics))); + mEditor.setDiagnosticsListener(diagnostics -> { + for (DiagnosticWrapper diagnostic : diagnostics) { + DiagnosticUtil.setLineAndColumn(diagnostic, mEditor); + } + ProgressManager.getInstance().runLater(() -> logViewModel.updateLogs(LogViewModel.DEBUG, diagnostics)); + }); getChildFragmentManager().setFragmentResultListener(LayoutEditorFragment.KEY_SAVE, getViewLifecycleOwner(), ((requestKey, result) -> { diff --git a/app/src/main/java/com/tyron/code/ui/editor/language/AbstractCodeAnalyzer.java b/app/src/main/java/com/tyron/code/ui/editor/language/AbstractCodeAnalyzer.java index 66068651a..679a0630b 100644 --- a/app/src/main/java/com/tyron/code/ui/editor/language/AbstractCodeAnalyzer.java +++ b/app/src/main/java/com/tyron/code/ui/editor/language/AbstractCodeAnalyzer.java @@ -35,14 +35,14 @@ public abstract class AbstractCodeAnalyzer extends DiagnosticAnalyzeManager mDiagnostics = new ArrayList<>(); + protected List mDiagnostics = new ArrayList<>(); public AbstractCodeAnalyzer() { setup(); } @Override - public void setReceiver(@NonNull StyleReceiver receiver) { + public void setReceiver(@Nullable StyleReceiver receiver) { super.setReceiver(receiver); mReceiver = receiver; @@ -99,8 +99,7 @@ public void reset(@NonNull ContentReference content, @NonNull Bundle extraArgume @Override public void setDiagnostics(Editor editor, List diagnostics) { - mDiagnostics.clear(); - mDiagnostics.addAll(diagnostics); + mDiagnostics = diagnostics; } public void setup() { diff --git a/app/src/main/java/com/tyron/code/ui/editor/language/kotlin/KotlinAnalyzer.java b/app/src/main/java/com/tyron/code/ui/editor/language/kotlin/KotlinAnalyzer.java index 53a484a82..c11c4777a 100644 --- a/app/src/main/java/com/tyron/code/ui/editor/language/kotlin/KotlinAnalyzer.java +++ b/app/src/main/java/com/tyron/code/ui/editor/language/kotlin/KotlinAnalyzer.java @@ -5,6 +5,7 @@ import com.tyron.builder.project.api.Module; import com.tyron.code.ApplicationLoader; import com.tyron.code.ui.editor.language.AbstractCodeAnalyzer; +import com.tyron.code.ui.editor.language.HighlightUtil; import com.tyron.code.ui.project.ProjectManager; import com.tyron.common.SharedPreferenceKeys; import com.tyron.completion.progress.ProgressManager; @@ -18,6 +19,8 @@ import java.lang.ref.WeakReference; +import io.github.rosemoe.sora.lang.styling.MappedSpans; +import io.github.rosemoe.sora.lang.styling.Styles; import io.github.rosemoe.sora.widget.schemes.EditorColorScheme; public class KotlinAnalyzer extends AbstractCodeAnalyzer { @@ -94,6 +97,16 @@ public void analyzeInBackground(CharSequence content) { } } + @Override + protected void afterAnalyze(CharSequence content, Styles styles, MappedSpans.Builder colors) { + super.afterAnalyze(content, styles, colors); + + Editor editor = mEditorReference.get(); + if (editor != null) { + HighlightUtil.markDiagnostics(editor, mDiagnostics, styles); + } + } + private static class UnknownToken implements Token { public static UnknownToken INSTANCE = new UnknownToken(); diff --git a/java-completion/src/main/java/com/tyron/completion/java/util/DiagnosticUtil.java b/java-completion/src/main/java/com/tyron/completion/java/util/DiagnosticUtil.java index 83a4582ca..a77755502 100644 --- a/java-completion/src/main/java/com/tyron/completion/java/util/DiagnosticUtil.java +++ b/java-completion/src/main/java/com/tyron/completion/java/util/DiagnosticUtil.java @@ -6,6 +6,8 @@ import com.tyron.builder.model.DiagnosticWrapper; import com.tyron.completion.java.compiler.CompileTask; import com.tyron.completion.java.action.FindMethodDeclarationAt; +import com.tyron.editor.CharPosition; +import com.tyron.editor.Editor; import org.openjdk.javax.lang.model.element.ExecutableElement; import org.openjdk.javax.lang.model.element.TypeElement; @@ -30,6 +32,25 @@ public class DiagnosticUtil { private static final Pattern UNREPORTED_EXCEPTION = Pattern.compile("unreported exception (" + "(\\w+\\.)*\\w+)"); + public static void setLineAndColumn(DiagnosticWrapper diagnostic, Editor editor) { + try { + if (diagnostic.getStartLine() <= -1 && diagnostic.getStartPosition() > 0) { + CharPosition start = editor.getCharPosition(((int) diagnostic.getStartPosition())); + diagnostic.setStartLine(start.getLine() + 1); + diagnostic.setStartColumn(start.getColumn()); + diagnostic.setLineNumber(start.getLine() + 1); + diagnostic.setColumnNumber(start.getColumn()); + } + if (diagnostic.getEndLine() <= -1 && diagnostic.getEndPosition() > 0) { + CharPosition end = editor.getCharPosition(((int) diagnostic.getEndPosition())); + diagnostic.setEndLine(end.getLine() + 1); + diagnostic.setEndColumn(end.getColumn()); + } + } catch (IndexOutOfBoundsException ignored) { + // unknown index, dont display line number + } + } + public static class MethodPtr { public String className, methodName; public String[] erasedParameterTypes; diff --git a/kotlin-completion/src/main/java/com/tyron/kotlin_completion/diagnostic/ConvertDiagnostic.kt b/kotlin-completion/src/main/java/com/tyron/kotlin_completion/diagnostic/ConvertDiagnostic.kt index 44652f483..c8fb5070c 100644 --- a/kotlin-completion/src/main/java/com/tyron/kotlin_completion/diagnostic/ConvertDiagnostic.kt +++ b/kotlin-completion/src/main/java/com/tyron/kotlin_completion/diagnostic/ConvertDiagnostic.kt @@ -18,7 +18,11 @@ fun convertDiagnostic(diagnostic: KotlinDiagnostic): List { wrapper.kind = severity(diagnostic.severity) wrapper.source = File(diagnostic.psiFile.viewProvider.virtualFile .path) - wrapper.position = -1L + wrapper.startLine = -1 + wrapper.startColumn = -1 + wrapper.endLine = -1 + wrapper.endColumn = -1 + wrapper.position = it.startOffset.toLong() wrapper.startPosition = it.startOffset.toLong() wrapper.endPosition = it.endOffset.toLong() wrapper