diff --git a/app/src/main/java/com/itsaky/androidide/preferences/javaPrefs.kt b/app/src/main/java/com/itsaky/androidide/preferences/javaPrefs.kt index c1ab7e24a..2c2bdb702 100644 --- a/app/src/main/java/com/itsaky/androidide/preferences/javaPrefs.kt +++ b/app/src/main/java/com/itsaky/androidide/preferences/javaPrefs.kt @@ -17,12 +17,13 @@ package com.itsaky.androidide.preferences -import android.content.Context -import androidx.preference.Preference +import com.itsaky.androidide.R +import com.itsaky.androidide.preferences.internal.GOOGLE_CODE_STYLE +import com.itsaky.androidide.preferences.internal.JAVA_DIAGNOSTICS_ENABLED +import com.itsaky.androidide.preferences.internal.googleCodeStyle +import com.itsaky.androidide.preferences.internal.isJavaDiagnosticsEnabled import com.itsaky.androidide.resources.R.drawable import com.itsaky.androidide.resources.R.string -import com.itsaky.androidide.preferences.internal.GOOGLE_CODE_STYLE -import com.itsaky.androidide.preferences.internal.googleCodeStyle import kotlinx.parcelize.Parcelize @Parcelize @@ -33,28 +34,27 @@ internal class JavaCodeConfigurations( ) : IPreferenceGroup() { init { addPreference(GoogleCodeStyle()) + addPreference(JavaDiagnosticsEnabled()) } } -/** - * @author Akash Yadav - */ +/** @author Akash Yadav */ @Parcelize private class GoogleCodeStyle( override val key: String = GOOGLE_CODE_STYLE, override val title: Int = string.idepref_java_useGoogleStyle_title, override val summary: Int? = string.idepref_java_useGoogleStyle_summary, override val icon: Int? = drawable.ic_format_code, -) : SwitchPreference() { - - override fun onCreatePreference(context: Context): Preference { - val preference = super.onCreatePreference(context) as androidx.preference.SwitchPreference - preference.isChecked = googleCodeStyle - return preference - } - - override fun onPreferenceChanged(preferece: Preference, newValue: Any?): Boolean { - googleCodeStyle = newValue as Boolean? ?: googleCodeStyle - return true - } -} \ No newline at end of file +) : SwitchPreference(getValue = ::googleCodeStyle::get, setValue = ::googleCodeStyle::set) + +@Parcelize +private class JavaDiagnosticsEnabled( + override val key: String = JAVA_DIAGNOSTICS_ENABLED, + override val title: Int = R.string.idepref_java_diagnosticEnabled_title, + override val summary: Int? = R.string.idepref_java_diagnosticsEnabled_summary, + override val icon: Int? = drawable.ic_compilation_error +) : + SwitchPreference( + getValue = ::isJavaDiagnosticsEnabled::get, + setValue = ::isJavaDiagnosticsEnabled::set + ) diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/IServerSettings.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/IServerSettings.java index 9703df541..4aa002d33 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/IServerSettings.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/IServerSettings.java @@ -38,6 +38,14 @@ public interface IServerSettings { * @return {@code true} if enabled, {@code false} otherwise. */ boolean completionsEnabled(); + + /** + * Called by the language server to check if the source code analysis is enabled or not. + * @return {@code true} if enabled, {@code false} otherwise. + */ + default boolean diagnosticsEnabled() { + return true; + } /** * Called by the language server to check if the code actions are enabled. diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaLanguageServer.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaLanguageServer.java index b81b25e6e..62260026f 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaLanguageServer.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaLanguageServer.java @@ -180,6 +180,10 @@ public class JavaLanguageServer implements ILanguageServer { || !this.completionProvider.canComplete(params.getFile())) { return CompletionResult.EMPTY; } + + if (diagnosticProvider.isAnalyzing()) { + diagnosticProvider.cancel(); + } this.completionProvider.reset( compiler, this.settings, this.cachedCompletion, this::updateCachedCompletion); @@ -233,7 +237,7 @@ public class JavaLanguageServer implements ILanguageServer { @NonNull @Override public DiagnosticResult analyze(@NonNull Path file) { - if (!DocumentUtils.isJavaFile(file)) { + if (!settings.diagnosticsEnabled() || !DocumentUtils.isJavaFile(file)) { return DiagnosticResult.NO_UPDATE; } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/JavaServerSettings.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/JavaServerSettings.java index c212c2ebc..1e3bbc6a1 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/JavaServerSettings.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/JavaServerSettings.java @@ -16,7 +16,8 @@ */ package com.itsaky.androidide.lsp.java.models; -import static com.itsaky.androidide.preferences.internal.EditorPreferencesKt.GOOGLE_CODE_STYLE; +import static com.itsaky.androidide.preferences.internal.JavaPreferencesKt.GOOGLE_CODE_STYLE; +import static com.itsaky.androidide.preferences.internal.JavaPreferencesKt.isJavaDiagnosticsEnabled; import androidx.annotation.NonNull; @@ -44,7 +45,12 @@ public class JavaServerSettings extends PrefBasedServerSettings { return instance; } - + + @Override + public boolean diagnosticsEnabled() { + return isJavaDiagnosticsEnabled(); + } + public JavaFormatterOptions getFormatterOptions() { return JavaFormatterOptions.builder().formatJavadoc(true).style(getStyle()).build(); } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/JavaDiagnosticProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/JavaDiagnosticProvider.kt index 1f4a3381a..e1be27889 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/JavaDiagnosticProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/JavaDiagnosticProvider.kt @@ -78,6 +78,14 @@ class JavaDiagnosticProvider { return result } + + fun isAnalyzing(): Boolean { + return this.analyzing.get() + } + + fun cancel() { + this.analyzingThread?.cancel() + } fun clearTimestamp(file: Path) { analyzeTimestamps.remove(file) @@ -104,6 +112,10 @@ class JavaDiagnosticProvider { inner class AnalyzingThread(val compiler: JavaCompilerService, val file: Path) : Thread("JavaAnalyzerThread") { lateinit var result: DiagnosticResult + + fun cancel() { + ProgressManager.instance.cancel(this) + } override fun run() { result = diff --git a/preferences/src/main/java/com/itsaky/androidide/preferences/internal/editorPreferences.kt b/preferences/src/main/java/com/itsaky/androidide/preferences/internal/editorPreferences.kt index c25fd637a..df58a1a59 100644 --- a/preferences/src/main/java/com/itsaky/androidide/preferences/internal/editorPreferences.kt +++ b/preferences/src/main/java/com/itsaky/androidide/preferences/internal/editorPreferences.kt @@ -18,7 +18,6 @@ package com.itsaky.androidide.preferences.internal const val COMPLETIONS_MATCH_LOWER = "idepref_editor_completions_matchLower" -const val GOOGLE_CODE_STYLE = "idepref_editor_java_googleCodeStyle" const val FLAG_WS_LEADING = "idepref_editor_wsLeading" const val FLAG_WS_TRAILING = "idepref_editor_wsTrailing" diff --git a/preferences/src/main/java/com/itsaky/androidide/preferences/internal/javaPreferences.kt b/preferences/src/main/java/com/itsaky/androidide/preferences/internal/javaPreferences.kt index 31a29af8e..ce61b8a02 100644 --- a/preferences/src/main/java/com/itsaky/androidide/preferences/internal/javaPreferences.kt +++ b/preferences/src/main/java/com/itsaky/androidide/preferences/internal/javaPreferences.kt @@ -17,8 +17,18 @@ package com.itsaky.androidide.preferences.internal +const val GOOGLE_CODE_STYLE = "idepref_editor_java_googleCodeStyle" +const val JAVA_DIAGNOSTICS_ENABLED = "idepref_editor_java_diagnosticsEnabled" + var googleCodeStyle: Boolean get() = prefManager.getBoolean(GOOGLE_CODE_STYLE, false) set(value) { prefManager.putBoolean(GOOGLE_CODE_STYLE, value) - } \ No newline at end of file + } + +/** Whether diagnostics are enabled for the Java source files. */ +var isJavaDiagnosticsEnabled: Boolean + get() = prefManager.getBoolean(JAVA_DIAGNOSTICS_ENABLED, true) + set(value) { + prefManager.putBoolean(JAVA_DIAGNOSTICS_ENABLED, value) + } diff --git a/resources/src/main/res/values/strings.xml b/resources/src/main/res/values/strings.xml index bbc160f6a..555b09c22 100644 --- a/resources/src/main/res/values/strings.xml +++ b/resources/src/main/res/values/strings.xml @@ -538,4 +538,6 @@ Enjoy an experience closer to your device (requires restart). Project configuration Failed to launch application. See IDE logs for more info. + Diagnostics enabled + (EXPERIMENTAL) Whether the Java source files should be analyzed for errors or not.