diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index c68354edd..21e45881f 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,11 +1,16 @@ \ No newline at end of file diff --git a/actions/src/main/java/com/itsaky/androidide/actions/internal/DefaultActionsRegistry.kt b/actions/src/main/java/com/itsaky/androidide/actions/internal/DefaultActionsRegistry.kt index 05e3d9a9e..924e79992 100644 --- a/actions/src/main/java/com/itsaky/androidide/actions/internal/DefaultActionsRegistry.kt +++ b/actions/src/main/java/com/itsaky/androidide/actions/internal/DefaultActionsRegistry.kt @@ -26,7 +26,6 @@ import com.itsaky.androidide.actions.ActionsRegistry import com.itsaky.androidide.actions.FillMenuParams import com.itsaky.androidide.actions.OnActionClickListener import com.itsaky.androidide.actions.locations.CodeActionsMenu -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.withStopWatch import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope @@ -35,6 +34,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.plus import kotlinx.coroutines.withContext +import org.slf4j.LoggerFactory import java.util.concurrent.ConcurrentHashMap /** @@ -45,13 +45,16 @@ import java.util.concurrent.ConcurrentHashMap @AutoService(ActionsRegistry::class) class DefaultActionsRegistry : ActionsRegistry() { - private val log = ILogger.newInstance("DefaultActionsRegistry") private val actions = ConcurrentHashMap>() private val listeners = HashSet() private val actionsCoroutineScope = CoroutineScope(Dispatchers.Default) + CoroutineName("DefaultActionsRegistry") + companion object { + private val log = LoggerFactory.getLogger(DefaultActionsRegistry::class.java) + } + init { registerAction(CodeActionsMenu) } @@ -217,7 +220,7 @@ class DefaultActionsRegistry : ActionsRegistry() { }.also { job -> job.invokeOnCompletion { error -> if (error != null) { - log.error("An error occurred when performing action '${action.id}'", error) + log.error("An error occurred when performing action '{}'", action.id, error) } } } diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f6e091477..d48e7c271 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,8 +1,11 @@ @file:Suppress("UnstableApiUsage") +import ch.qos.logback.core.util.EnvUtil import com.itsaky.androidide.build.config.BuildConfig +import com.itsaky.androidide.desugaring.ch.qos.logback.core.util.DesugarEnvUtil import com.itsaky.androidide.desugaring.utils.JavaIOReplacements.applyJavaIOReplacements import com.itsaky.androidide.plugins.AndroidIDEAssetsPlugin +import kotlin.reflect.jvm.javaMethod plugins { id("com.android.application") @@ -17,6 +20,13 @@ apply { plugin(AndroidIDEAssetsPlugin::class.java) } +buildscript { + dependencies { + classpath(libs.logging.logback.core) + classpath(libs.composite.desugaringCore) + } +} + android { namespace = BuildConfig.packageName @@ -45,9 +55,20 @@ kapt { arguments { arg("eventBusIndex", "${BuildConfig.packageName}.events.AppEv desugaring { replacements { - includePackage("org.eclipse.jgit") + includePackage( + "org.eclipse.jgit", + "ch.qos.logback.classic.util", + ) applyJavaIOReplacements() + + // EnvUtil.logbackVersion() uses newer Java APIs like Class.getModule() which is not available + // on Android. We replace the method usage with DesugarEnvUtil.logbackVersion() which + // always returns null + replaceMethod( + EnvUtil::logbackVersion.javaMethod!!, + DesugarEnvUtil::logbackVersion.javaMethod!! + ) } } diff --git a/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt b/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt index 0dc30063e..5df852cd8 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/BaseBuildAction.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.actions import com.itsaky.androidide.lookup.Lookup import com.itsaky.androidide.projects.builder.BuildService -import com.itsaky.androidide.utils.ILogger /** * Marker class for actions that execute build related tasks. @@ -28,7 +27,6 @@ import com.itsaky.androidide.utils.ILogger */ abstract class BaseBuildAction : EditorActivityAction() { - protected val log: ILogger = ILogger.newInstance(javaClass.simpleName) protected val buildService: BuildService? get() = Lookup.getDefault().lookup(BuildService.KEY_BUILD_SERVICE) diff --git a/app/src/main/java/com/itsaky/androidide/actions/build/QuickRunWithCancellationAction.kt b/app/src/main/java/com/itsaky/androidide/actions/build/QuickRunWithCancellationAction.kt index a016adc8c..437a05bfc 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/build/QuickRunWithCancellationAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/build/QuickRunWithCancellationAction.kt @@ -42,6 +42,7 @@ import com.itsaky.androidide.utils.resolveAttr import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.slf4j.LoggerFactory import java.io.File /** @@ -55,6 +56,11 @@ import java.io.File class QuickRunWithCancellationAction(context: Context, override val order: Int) : BaseBuildAction() { + companion object { + + private val log = LoggerFactory.getLogger(QuickRunWithCancellationAction::class.java) + } + init { label = context.getString(R.string.quick_run_debug) icon = ContextCompat.getDrawable(context, R.drawable.ic_run_outline) @@ -130,7 +136,7 @@ class QuickRunWithCancellationAction(context: Context, override val order: Int) ) { val buildService = this.buildService ?: run { - log.error("Cannot execute task '$taskName'. BuildService not found.") + log.error("Cannot execute task '{}'. BuildService not found.", taskName) return } @@ -143,7 +149,7 @@ class QuickRunWithCancellationAction(context: Context, override val order: Int) data.getActivity() ?: run { log.error( - "Cannot execute task '$taskName'. Activity instance not provided in ActionData.") + "Cannot execute task '{}'. Activity instance not provided in ActionData.", taskName) return } @@ -154,17 +160,17 @@ class QuickRunWithCancellationAction(context: Context, override val order: Int) buildService.executeTasks(taskName).get() } - log.debug("Task execution result:", result) + log.debug("Task execution result: {}", result) if (result?.isSuccessful != true) { - log.error("Tasks failed to execute: '$taskName'") + log.error("Tasks failed to execute: '{}'", taskName) return@launch } handleResult(data, result, module, variant) }.invokeOnCompletion { error -> if (error != null) { - log.error("Failed to run '$taskName'", error) + log.error("Failed to run '{}'", taskName, error) } } } @@ -186,7 +192,7 @@ class QuickRunWithCancellationAction(context: Context, override val order: Int) if (!result.wasEnqueued) { log.warn( - "Unable to enqueue cancellation request", + "Unable to enqueue cancellation request reason={} reason.message={}", result.failureReason, result.failureReason!!.message ) @@ -210,7 +216,7 @@ class QuickRunWithCancellationAction(context: Context, override val order: Int) return } - log.debug("Installing APK(s) for project: '${module.path}' variant: '${variant.name}'") + log.debug("Installing APK(s) for project: '{}' variant: '{}'", module.path, variant.name) val main = variant.mainArtifact val outputListingFile = main.assembleTaskOutputListingFile @@ -219,15 +225,15 @@ class QuickRunWithCancellationAction(context: Context, override val order: Int) return } - log.verbose("Parsing metadata") + log.trace("Parsing metadata") val apkFile = ApkMetadata.findApkFile(outputListingFile) if (apkFile == null) { - log.error("No apk file specified in output listing file:", outputListingFile) + log.error("No apk file specified in output listing file: {}", outputListingFile) return } if (!apkFile.exists()) { - log.error("APK file specified in output listing file does not exist!", apkFile) + log.error("APK file specified in output listing file does not exist! {}", apkFile) return } @@ -243,7 +249,7 @@ class QuickRunWithCancellationAction(context: Context, override val order: Int) } activity.runOnUiThread { - log.debug("Installing APK:", apk) + log.debug("Installing APK: {}", apk) if (!apk.exists()) { log.error("APK file does not exist!") diff --git a/app/src/main/java/com/itsaky/androidide/actions/editor/CopyAction.kt b/app/src/main/java/com/itsaky/androidide/actions/editor/CopyAction.kt index 036af2618..ba46b98b7 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/editor/CopyAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/editor/CopyAction.kt @@ -18,9 +18,9 @@ package com.itsaky.androidide.actions.editor import android.content.Context -import com.itsaky.androidide.resources.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.BaseEditorAction +import com.itsaky.androidide.resources.R /** @author Akash Yadav */ class CopyAction(context: Context, override val order: Int) : BaseEditorAction() { diff --git a/app/src/main/java/com/itsaky/androidide/actions/editor/ExpandSelectionAction.kt b/app/src/main/java/com/itsaky/androidide/actions/editor/ExpandSelectionAction.kt index a20cf76fd..ba0c0cd78 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/editor/ExpandSelectionAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/editor/ExpandSelectionAction.kt @@ -19,10 +19,10 @@ package com.itsaky.androidide.actions.editor import android.content.Context import androidx.core.content.ContextCompat -import com.itsaky.androidide.resources.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.ActionItem import com.itsaky.androidide.actions.EditorRelatedAction +import com.itsaky.androidide.resources.R /** * Expands the current selection using the language server set in editor. diff --git a/app/src/main/java/com/itsaky/androidide/actions/etc/FindInFileAction.kt b/app/src/main/java/com/itsaky/androidide/actions/etc/FindInFileAction.kt index daa869075..54739a122 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/etc/FindInFileAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/etc/FindInFileAction.kt @@ -19,9 +19,9 @@ package com.itsaky.androidide.actions.etc import android.content.Context import androidx.core.content.ContextCompat -import com.itsaky.androidide.resources.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.EditorRelatedAction +import com.itsaky.androidide.resources.R /** @author Akash Yadav */ class FindInFileAction() : EditorRelatedAction() { diff --git a/app/src/main/java/com/itsaky/androidide/actions/etc/FindInProjectAction.kt b/app/src/main/java/com/itsaky/androidide/actions/etc/FindInProjectAction.kt index 2af6d864d..03bb49c80 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/etc/FindInProjectAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/etc/FindInProjectAction.kt @@ -19,11 +19,11 @@ package com.itsaky.androidide.actions.etc import android.content.Context import androidx.core.content.ContextCompat -import com.itsaky.androidide.resources.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.EditorActivityAction import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.projects.IProjectManager +import com.itsaky.androidide.resources.R /** @author Akash Yadav */ class FindInProjectAction() : EditorActivityAction() { diff --git a/app/src/main/java/com/itsaky/androidide/actions/etc/LaunchAppAction.kt b/app/src/main/java/com/itsaky/androidide/actions/etc/LaunchAppAction.kt index 9cafe6c0a..6757f3c39 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/etc/LaunchAppAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/etc/LaunchAppAction.kt @@ -25,11 +25,10 @@ import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.EditorActivityAction import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.openApplicationModuleChooser -import com.itsaky.androidide.builder.model.UNKNOWN_PACKAGE import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.IntentUtils import com.itsaky.androidide.utils.flashError +import org.slf4j.LoggerFactory /** * An action to launch the already installed application on the device. @@ -47,7 +46,7 @@ class LaunchAppAction(context: Context, override val order: Int) : EditorActivit } companion object { - private val log = ILogger.newInstance("LaunchAppAction") + private val log = LoggerFactory.getLogger(LaunchAppAction::class.java) } override fun prepare(data: ActionData) { @@ -67,7 +66,7 @@ class LaunchAppAction(context: Context, override val order: Int) : EditorActivit openApplicationModuleChooser(data) { app -> val variant = app.getSelectedVariant() - log.debug("Selected variant: ${variant?.name}") + log.debug("Selected variant: {}", variant?.name) if (variant == null) { flashError(R.string.err_selected_variant_not_found) @@ -81,7 +80,7 @@ class LaunchAppAction(context: Context, override val order: Int) : EditorActivit return@openApplicationModuleChooser } - log.info("Launching application: $applicationId") + log.info("Launching application: {}", applicationId) val activity = data.requireActivity() IntentUtils.launchApp(activity, applicationId, logError = false) diff --git a/app/src/main/java/com/itsaky/androidide/actions/etc/ReloadColorSchemesAction.kt b/app/src/main/java/com/itsaky/androidide/actions/etc/ReloadColorSchemesAction.kt index 5118c2b28..457ceb802 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/etc/ReloadColorSchemesAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/etc/ReloadColorSchemesAction.kt @@ -20,15 +20,11 @@ package com.itsaky.androidide.actions.etc import android.content.Context import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope -import com.blankj.utilcode.util.ThreadUtils import com.itsaky.androidide.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.EditorActivityAction import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider -import com.itsaky.androidide.tasks.executeAsyncProvideError -import com.itsaky.androidide.tasks.executeWithProgress import com.itsaky.androidide.tasks.launchAsyncWithProgress -import com.itsaky.androidide.utils.ILogger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -46,8 +42,6 @@ class ReloadColorSchemesAction(context: Context, override val order: Int) : Edit // the UI thread override var requiresUIThread: Boolean = true - private val log = ILogger.newInstance("ReloadColorSchemesAction") - init { label = context.getString(R.string.title_reload_color_schemes) icon = ContextCompat.getDrawable(context, R.drawable.ic_reload) diff --git a/app/src/main/java/com/itsaky/androidide/actions/file/CloseAllFilesAction.kt b/app/src/main/java/com/itsaky/androidide/actions/file/CloseAllFilesAction.kt index 4aa16b045..c4bc1311f 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/file/CloseAllFilesAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/file/CloseAllFilesAction.kt @@ -19,9 +19,9 @@ package com.itsaky.androidide.actions.file import android.content.Context import androidx.core.content.ContextCompat -import com.itsaky.androidide.activities.editor.EditorHandlerActivity import com.itsaky.androidide.R import com.itsaky.androidide.actions.ActionData +import com.itsaky.androidide.activities.editor.EditorHandlerActivity /** * Closes all opened files. diff --git a/app/src/main/java/com/itsaky/androidide/actions/file/CloseFileAction.kt b/app/src/main/java/com/itsaky/androidide/actions/file/CloseFileAction.kt index 20da37854..af142fecb 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/file/CloseFileAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/file/CloseFileAction.kt @@ -19,9 +19,9 @@ package com.itsaky.androidide.actions.file import android.content.Context import androidx.core.content.ContextCompat -import com.itsaky.androidide.activities.editor.EditorHandlerActivity import com.itsaky.androidide.R import com.itsaky.androidide.actions.ActionData +import com.itsaky.androidide.activities.editor.EditorHandlerActivity /** * Closes the current file. diff --git a/app/src/main/java/com/itsaky/androidide/actions/file/CloseOtherFilesAction.kt b/app/src/main/java/com/itsaky/androidide/actions/file/CloseOtherFilesAction.kt index 30a2d0d29..cb0e5f884 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/file/CloseOtherFilesAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/file/CloseOtherFilesAction.kt @@ -19,9 +19,9 @@ package com.itsaky.androidide.actions.file import android.content.Context import androidx.core.content.ContextCompat -import com.itsaky.androidide.activities.editor.EditorHandlerActivity import com.itsaky.androidide.R import com.itsaky.androidide.actions.ActionData +import com.itsaky.androidide.activities.editor.EditorHandlerActivity /** * Closes all opened files except the selected one. diff --git a/app/src/main/java/com/itsaky/androidide/actions/file/FileTabAction.kt b/app/src/main/java/com/itsaky/androidide/actions/file/FileTabAction.kt index 4ea67607c..d863a082c 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/file/FileTabAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/file/FileTabAction.kt @@ -17,12 +17,12 @@ package com.itsaky.androidide.actions.file -import com.itsaky.androidide.activities.editor.EditorHandlerActivity import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.ActionItem.Location import com.itsaky.androidide.actions.ActionItem.Location.EDITOR_FILE_TABS import com.itsaky.androidide.actions.EditorActivityAction import com.itsaky.androidide.actions.markInvisible +import com.itsaky.androidide.activities.editor.EditorHandlerActivity /** * Action related to file tabs. Shown only when there is at least one file opened. diff --git a/app/src/main/java/com/itsaky/androidide/actions/file/FormatCodeAction.kt b/app/src/main/java/com/itsaky/androidide/actions/file/FormatCodeAction.kt index d2235493b..cd0c45288 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/file/FormatCodeAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/file/FormatCodeAction.kt @@ -19,10 +19,10 @@ package com.itsaky.androidide.actions.file import android.content.Context import androidx.core.content.ContextCompat -import com.itsaky.androidide.resources.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.ActionItem import com.itsaky.androidide.actions.EditorRelatedAction +import com.itsaky.androidide.resources.R /** * Action that formats the code in the editor. diff --git a/app/src/main/java/com/itsaky/androidide/actions/file/SaveFileAction.kt b/app/src/main/java/com/itsaky/androidide/actions/file/SaveFileAction.kt index a506bf0d0..5b9900c79 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/file/SaveFileAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/file/SaveFileAction.kt @@ -24,19 +24,20 @@ import com.itsaky.androidide.actions.EditorRelatedAction import com.itsaky.androidide.models.SaveResult import com.itsaky.androidide.projects.ProjectManagerImpl import com.itsaky.androidide.resources.R -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import com.itsaky.androidide.utils.flashSuccess +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class SaveFileAction(context: Context, override val order: Int) : EditorRelatedAction() { - private val log = ILogger.newInstance("SaveFileAction") - override val id: String = "ide.editor.files.saveAll" - override var requiresUIThread: Boolean = false + companion object { + private val log = LoggerFactory.getLogger(SaveFileAction::class.java) + } + init { label = context.getString(R.string.save) icon = ContextCompat.getDrawable(context, R.drawable.ic_save) diff --git a/app/src/main/java/com/itsaky/androidide/actions/filetree/DeleteAction.kt b/app/src/main/java/com/itsaky/androidide/actions/filetree/DeleteAction.kt index 82b8b9f8d..72576dcb8 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/filetree/DeleteAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/filetree/DeleteAction.kt @@ -29,8 +29,8 @@ import com.itsaky.androidide.tasks.executeAsync import com.itsaky.androidide.utils.DialogUtils import com.itsaky.androidide.utils.FlashType import com.itsaky.androidide.utils.flashMessage -import java.io.File import org.greenrobot.eventbus.EventBus +import java.io.File /** * File tree action to delete files. diff --git a/app/src/main/java/com/itsaky/androidide/actions/filetree/NewFileAction.kt b/app/src/main/java/com/itsaky/androidide/actions/filetree/NewFileAction.kt index 6179e4325..7dc5c773a 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/filetree/NewFileAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/filetree/NewFileAction.kt @@ -31,7 +31,6 @@ import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R import com.itsaky.androidide.utils.DialogUtils import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.ProjectWriter import com.itsaky.androidide.utils.SingleTextWatcher import com.itsaky.androidide.utils.flashError @@ -39,6 +38,7 @@ import com.itsaky.androidide.utils.flashSuccess import com.unnamed.b.atv.model.TreeNode import jdkx.lang.model.SourceVersion import org.greenrobot.eventbus.EventBus +import org.slf4j.LoggerFactory import java.io.File import java.util.Objects import java.util.regex.Pattern @@ -58,13 +58,14 @@ class NewFileAction(context: Context, override val order: Int) : override val id: String = "ide.editor.fileTree.newFile" companion object { + const val RES_PATH_REGEX = "/.*/src/.*/res" const val LAYOUT_RES_PATH_REGEX = "/.*/src/.*/res/layout" const val MENU_RES_PATH_REGEX = "/.*/src/.*/res/menu" const val DRAWABLE_RES_PATH_REGEX = "/.*/src/.*/res/drawable" const val JAVA_PATH_REGEX = "/.*/src/.*/java" - private val log = ILogger.newInstance("NewFileAction") + private val log = LoggerFactory.getLogger(NewFileAction::class.java) } override suspend fun execAction(data: ActionData) { @@ -74,7 +75,7 @@ class NewFileAction(context: Context, override val order: Int) : try { createNewFile(context, node, file, false) } catch (e: Exception) { - log.error(e) + log.error("Failed to create new file", e) flashError(e.cause?.message ?: e.message) } } @@ -163,7 +164,7 @@ class NewFileAction(context: Context, override val order: Int) : try { doCreateJavaFile(binding, file, context, node) } catch (e: Exception) { - log.error(e) + log.error("Failed to create Java file", e) flashError(e.cause?.message ?: e.message) } } @@ -350,8 +351,8 @@ class NewFileAction(context: Context, override val order: Int) : builder.setTitle(R.string.new_file) builder.setMessage( context.getString(R.string.msg_can_contain_slashes) + - "\n\n" + - context.getString(R.string.msg_newfile_dest, folder.absolutePath) + "\n\n" + + context.getString(R.string.msg_newfile_dest, folder.absolutePath) ) builder.setView(binding.root) builder.setCancelable(false) @@ -370,7 +371,7 @@ class NewFileAction(context: Context, override val order: Int) : try { createFile(context, node, folder, name, content) } catch (e: Exception) { - log.error(e) + log.error("Failed to create file", e) flashError(e.cause?.message ?: e.message) } } diff --git a/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt b/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt index 6cf7c9b16..462bb0f96 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt @@ -32,10 +32,10 @@ import com.itsaky.androidide.utils.DialogUtils import com.itsaky.androidide.utils.FlashType import com.itsaky.androidide.utils.flashMessage import com.unnamed.b.atv.model.TreeNode -import java.io.File import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus +import java.io.File /** * Action to rename the selected file. diff --git a/app/src/main/java/com/itsaky/androidide/actions/internalActionUtils.kt b/app/src/main/java/com/itsaky/androidide/actions/internalActionUtils.kt index 61565cf1d..ff7b40ee4 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/internalActionUtils.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/internalActionUtils.kt @@ -28,7 +28,8 @@ import com.itsaky.androidide.utils.flashError /** * @see openApplicationModuleChooser */ -inline fun openApplicationModuleChooser(data: ActionData, crossinline callback: (AndroidModule) -> Unit) = +inline fun openApplicationModuleChooser(data: ActionData, + crossinline callback: (AndroidModule) -> Unit) = openApplicationModuleChooser(data.requireContext(), callback) /** @@ -38,13 +39,13 @@ inline fun openApplicationModuleChooser(data: ActionData, crossinline callback: * * @param */ -inline fun openApplicationModuleChooser(context: Context, crossinline callback: (AndroidModule) -> Unit) { - val log = ILogger.newInstance("ActionUtils") +inline fun openApplicationModuleChooser(context: Context, + crossinline callback: (AndroidModule) -> Unit) { val projectManager = IProjectManager.getInstance() val applications = projectManager.getAndroidAppModules() if (applications.isEmpty()) { flashError(R.string.msg_launch_failure_no_app_module) - log.error("Cannot run application. No application modules found in project.") + ILogger.ROOT.error("Cannot run application. No application modules found in project.") return } @@ -62,7 +63,7 @@ inline fun openApplicationModuleChooser(context: Context, crossinline callback: applications.map { it.path }.toTypedArray(), 0) { selection -> val app = applications[selection] - log.info("Selected application: '${app.path}'") + ILogger.ROOT.info("Selected application: '{}'", app.path) callback(app) } diff --git a/app/src/main/java/com/itsaky/androidide/actions/sidebar/CloseProjectSidebarAction.kt b/app/src/main/java/com/itsaky/androidide/actions/sidebar/CloseProjectSidebarAction.kt index f89983135..8165d9153 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/sidebar/CloseProjectSidebarAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/sidebar/CloseProjectSidebarAction.kt @@ -20,10 +20,10 @@ package com.itsaky.androidide.actions.sidebar import android.content.Context import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment -import com.itsaky.androidide.resources.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.requireContext import com.itsaky.androidide.activities.editor.BaseEditorActivity +import com.itsaky.androidide.resources.R import kotlin.reflect.KClass /** diff --git a/app/src/main/java/com/itsaky/androidide/actions/text/RedoAction.kt b/app/src/main/java/com/itsaky/androidide/actions/text/RedoAction.kt index f4d206eed..f60f8b6e5 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/text/RedoAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/text/RedoAction.kt @@ -22,10 +22,10 @@ import android.content.Context import android.view.MenuItem import androidx.core.content.ContextCompat import com.blankj.utilcode.util.KeyboardUtils -import com.itsaky.androidide.resources.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.EditorRelatedAction import com.itsaky.androidide.actions.markInvisible +import com.itsaky.androidide.resources.R /** @author Akash Yadav */ class RedoAction(context: Context, override val order: Int) : EditorRelatedAction() { diff --git a/app/src/main/java/com/itsaky/androidide/actions/text/UndoAction.kt b/app/src/main/java/com/itsaky/androidide/actions/text/UndoAction.kt index 964a591fb..2233ae9dc 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/text/UndoAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/text/UndoAction.kt @@ -19,9 +19,9 @@ package com.itsaky.androidide.actions.text import android.content.Context import androidx.core.content.ContextCompat -import com.itsaky.androidide.resources.R import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.EditorRelatedAction +import com.itsaky.androidide.resources.R /** @author Akash Yadav */ class UndoAction(context: Context, override val order: Int) : EditorRelatedAction() { diff --git a/app/src/main/java/com/itsaky/androidide/activities/AboutActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/AboutActivity.kt index cc3de9d93..259a34b94 100755 --- a/app/src/main/java/com/itsaky/androidide/activities/AboutActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/AboutActivity.kt @@ -23,7 +23,6 @@ import android.os.Bundle import android.text.SpannableStringBuilder import android.text.style.ForegroundColorSpan import android.view.View -import android.widget.TextView import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.annotation.StringRes diff --git a/app/src/main/java/com/itsaky/androidide/activities/ContributorsActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/ContributorsActivity.kt index 2a899e3d8..59ad4eb64 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/ContributorsActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/ContributorsActivity.kt @@ -26,7 +26,6 @@ import com.itsaky.androidide.R import com.itsaky.androidide.adapters.ContributorsGridAdapter import com.itsaky.androidide.app.LimitlessIDEActivity import com.itsaky.androidide.databinding.ActivityContributorsBinding -import com.itsaky.androidide.utils.flashError import com.itsaky.androidide.utils.getConnectionInfo import com.itsaky.androidide.viewmodel.ContributorsViewModel diff --git a/app/src/main/java/com/itsaky/androidide/activities/CrashHandlerActivity.java b/app/src/main/java/com/itsaky/androidide/activities/CrashHandlerActivity.java index 9ee958684..15ecf9db3 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/CrashHandlerActivity.java +++ b/app/src/main/java/com/itsaky/androidide/activities/CrashHandlerActivity.java @@ -19,7 +19,6 @@ package com.itsaky.androidide.activities; import android.os.Bundle; import android.view.View; - import com.itsaky.androidide.app.IDEActivity; import com.itsaky.androidide.databinding.ActivityCrashHandlerBinding; import com.itsaky.androidide.fragments.CrashReportFragment; diff --git a/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt index edb6d1334..eb7f2376f 100755 --- a/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/MainActivity.kt @@ -30,18 +30,15 @@ import androidx.transition.doOnEnd import com.google.android.material.transition.MaterialSharedAxis import com.itsaky.androidide.activities.editor.EditorActivityKt import com.itsaky.androidide.app.LimitlessIDEActivity -import com.itsaky.androidide.app.configuration.IDEBuildConfigProvider import com.itsaky.androidide.databinding.ActivityMainBinding import com.itsaky.androidide.preferences.internal.NO_OPENED_PROJECT import com.itsaky.androidide.preferences.internal.autoOpenProjects import com.itsaky.androidide.preferences.internal.confirmProjectOpen import com.itsaky.androidide.preferences.internal.lastOpenedProject -import com.itsaky.androidide.preferences.internal.statConsentDialogShown import com.itsaky.androidide.projects.ProjectManagerImpl import com.itsaky.androidide.resources.R.string import com.itsaky.androidide.templates.ITemplateProvider import com.itsaky.androidide.utils.DialogUtils -import com.itsaky.androidide.utils.Environment import com.itsaky.androidide.utils.flashInfo import com.itsaky.androidide.viewmodel.MainViewModel import com.itsaky.androidide.viewmodel.MainViewModel.Companion.SCREEN_MAIN diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt index 746f2fabc..5bfc69fb6 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt @@ -75,7 +75,6 @@ import com.itsaky.androidide.uidesigner.UIDesignerActivity import com.itsaky.androidide.utils.ActionMenuUtils.createMenu import com.itsaky.androidide.utils.ApkInstallationSessionCallback import com.itsaky.androidide.utils.DialogUtils.newMaterialDialogBuilder -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.InstallationResultHandler.onResult import com.itsaky.androidide.utils.IntentUtils import com.itsaky.androidide.utils.flashError @@ -87,6 +86,8 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode.MAIN +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.io.File /** @@ -95,9 +96,7 @@ import java.io.File * @author Akash Yadav */ @Suppress("MemberVisibilityCanBePrivate") -abstract class BaseEditorActivity : - IDEActivity(), - TabLayout.OnTabSelectedListener, +abstract class BaseEditorActivity : IDEActivity(), TabLayout.OnTabSelectedListener, DiagnosticClickListener { protected val mLifecycleObserver = EditorActivityLifecyclerObserver() @@ -108,8 +107,6 @@ abstract class BaseEditorActivity : var isDestroying = false protected set - protected val log: ILogger = ILogger.newInstance("EditorActivity") - /** * Editor activity's [CoroutineScope] for executing tasks in the background. */ @@ -127,23 +124,25 @@ abstract class BaseEditorActivity : override val subscribeToEvents: Boolean get() = true - private val onBackPressedCallback: OnBackPressedCallback = - object : OnBackPressedCallback(true) { - override fun handleOnBackPressed() { - if (binding.root.isDrawerOpen(GravityCompat.START)) { - binding.root.closeDrawer(GravityCompat.START) - } else if (editorBottomSheet?.state != BottomSheetBehavior.STATE_COLLAPSED) { - editorBottomSheet?.setState(BottomSheetBehavior.STATE_COLLAPSED) - } else { - doConfirmProjectClose() - } + private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (binding.root.isDrawerOpen(GravityCompat.START)) { + binding.root.closeDrawer(GravityCompat.START) + } else if (editorBottomSheet?.state != BottomSheetBehavior.STATE_COLLAPSED) { + editorBottomSheet?.setState(BottomSheetBehavior.STATE_COLLAPSED) + } else { + doConfirmProjectClose() } } + } private var optionsMenuInvalidator: Runnable? = null companion object { + @JvmStatic + protected val log: Logger = LoggerFactory.getLogger(BaseEditorActivity::class.java) + private const val OPTIONS_MENU_INVALIDATION_DELAY = 150L const val EDITOR_CONTAINER_SCALE_FACTOR = 0.87f @@ -210,8 +209,7 @@ abstract class BaseEditorActivity : } Snackbar.make(binding.realContainer, string.msg_action_open_application, Snackbar.LENGTH_LONG) - .setAction(string.yes) { IntentUtils.launchApp(this, packageName) } - .show() + .setAction(string.yes) { IntentUtils.launchApp(this, packageName) }.show() } override fun onCreate(savedInstanceState: Bundle?) { @@ -240,8 +238,8 @@ abstract class BaseEditorActivity : setupContainers() setupDiagnosticInfo() - uiDesignerResultLauncher = - registerForActivityResult(StartActivityForResult(), this::handleUiDesignerResult) + uiDesignerResultLauncher = registerForActivityResult(StartActivityForResult(), + this::handleUiDesignerResult) } override fun onPause() { @@ -320,18 +318,13 @@ abstract class BaseEditorActivity : open fun handleSearchResults(map: Map>?) { val results = map ?: emptyMap() - setSearchResultAdapter( - SearchListAdapter( - results, - { file -> - doOpenFile(file, null) - hideBottomSheet() - } - ) { match -> - doOpenFile(match.file, match) - hideBottomSheet() - } - ) + setSearchResultAdapter(SearchListAdapter(results, { file -> + doOpenFile(file, null) + hideBottomSheet() + }) { match -> + doOpenFile(match.file, match) + hideBottomSheet() + }) showSearchResults() doDismissSearchProgress() @@ -356,8 +349,8 @@ abstract class BaseEditorActivity : editorBottomSheet?.state = BottomSheetBehavior.STATE_EXPANDED } - val index = - binding.bottomSheet.pagerAdapter.findIndexOfFragmentByClass(SearchResultFragment::class.java) + val index = binding.bottomSheet.pagerAdapter.findIndexOfFragmentByClass( + SearchResultFragment::class.java) if (index >= 0 && index < binding.bottomSheet.binding.tabs.tabCount) { binding.bottomSheet.binding.tabs.getTabAt(index)?.select() @@ -373,19 +366,15 @@ abstract class BaseEditorActivity : } open fun showFirstBuildNotice() { - newMaterialDialogBuilder(this) - .setPositiveButton(android.R.string.ok, null) - .setTitle(string.title_first_build) - .setMessage(string.msg_first_build) - .setCancelable(false) - .create() - .show() + newMaterialDialogBuilder(this).setPositiveButton(android.R.string.ok, null) + .setTitle(string.title_first_build).setMessage(string.msg_first_build).setCancelable(false) + .create().show() } open fun getFileTreeFragment(): FileTreeFragment? { if (filesTreeFragment == null) { - filesTreeFragment = - supportFragmentManager.findFragmentByTag(FileTreeFragment.TAG) as FileTreeFragment? + filesTreeFragment = supportFragmentManager.findFragmentByTag( + FileTreeFragment.TAG) as FileTreeFragment? } return filesTreeFragment } @@ -411,7 +400,7 @@ abstract class BaseEditorActivity : private fun handleUiDesignerResult(result: ActivityResult) { if (result.resultCode != RESULT_OK || result.data == null) { - log.warn("UI Designer returned invalid result", result.resultCode, result.data) + log.warn("UI Designer returned invalid result: resultCode={}, data={}", result.resultCode, result.data) return } val generated = result.data!!.getStringExtra(UIDesignerActivity.RESULT_GENERATED_XML) @@ -429,14 +418,8 @@ abstract class BaseEditorActivity : } private fun setupDrawers() { - val toggle = - ActionBarDrawerToggle( - this, - binding.editorDrawerLayout, - binding.editorToolbar, - string.app_name, - string.app_name - ) + val toggle = ActionBarDrawerToggle(this, binding.editorDrawerLayout, binding.editorToolbar, + string.app_name, string.app_name) binding.editorDrawerLayout.addDrawerListener(toggle) toggle.syncState() @@ -480,35 +463,29 @@ abstract class BaseEditorActivity : setupNoEditorView() setupBottomSheet() - if ( - !app.prefManager.getBoolean(KEY_BOTTOM_SHEET_SHOWN) && - editorBottomSheet?.state != BottomSheetBehavior.STATE_EXPANDED + if (!app.prefManager.getBoolean( + KEY_BOTTOM_SHEET_SHOWN) && editorBottomSheet?.state != BottomSheetBehavior.STATE_EXPANDED ) { editorBottomSheet?.state = BottomSheetBehavior.STATE_EXPANDED - ThreadUtils.runOnUiThreadDelayed( - { - editorBottomSheet?.state = BottomSheetBehavior.STATE_COLLAPSED - app.prefManager.putBoolean(KEY_BOTTOM_SHEET_SHOWN, true) - }, - 1500 - ) + ThreadUtils.runOnUiThreadDelayed({ + editorBottomSheet?.state = BottomSheetBehavior.STATE_COLLAPSED + app.prefManager.putBoolean(KEY_BOTTOM_SHEET_SHOWN, true) + }, 1500) } } private fun setupNoEditorView() { binding.noEditorSummary.movementMethod = LinkMovementMethod() - val filesSpan: ClickableSpan = - object : ClickableSpan() { - override fun onClick(widget: View) { - binding.root.openDrawer(GravityCompat.START) - } + val filesSpan: ClickableSpan = object : ClickableSpan() { + override fun onClick(widget: View) { + binding.root.openDrawer(GravityCompat.START) } - val bottomSheetSpan: ClickableSpan = - object : ClickableSpan() { - override fun onClick(widget: View) { - editorBottomSheet?.state = BottomSheetBehavior.STATE_EXPANDED - } + } + val bottomSheetSpan: ClickableSpan = object : ClickableSpan() { + override fun onClick(widget: View) { + editorBottomSheet?.state = BottomSheetBehavior.STATE_EXPANDED } + } val sb = SpannableStringBuilder() appendClickableSpan(sb, string.msg_drawer_for_files, filesSpan) appendClickableSpan(sb, string.msg_swipe_for_output, bottomSheetSpan) @@ -536,36 +513,33 @@ abstract class BaseEditorActivity : private fun setupBottomSheet() { editorBottomSheet = BottomSheetBehavior.from(binding.bottomSheet) - editorBottomSheet?.addBottomSheetCallback( - object : BottomSheetCallback() { - override fun onStateChanged(bottomSheet: View, newState: Int) { - if (newState == BottomSheetBehavior.STATE_EXPANDED) { - val editor = provideCurrentEditor() - editor?.editor?.ensureWindowsDismissed() - } - } - - override fun onSlide(bottomSheet: View, slideOffset: Float) { - binding.apply { - val editorScale = 1 - slideOffset * (1 - EDITOR_CONTAINER_SCALE_FACTOR) - this.bottomSheet.onSlide(slideOffset) - this.viewContainer.scaleX = editorScale - this.viewContainer.scaleY = editorScale - } + editorBottomSheet?.addBottomSheetCallback(object : BottomSheetCallback() { + override fun onStateChanged(bottomSheet: View, newState: Int) { + if (newState == BottomSheetBehavior.STATE_EXPANDED) { + val editor = provideCurrentEditor() + editor?.editor?.ensureWindowsDismissed() } } - ) - val observer: OnGlobalLayoutListener = - object : OnGlobalLayoutListener { - override fun onGlobalLayout() { - binding.let { - it.viewContainer.pivotY = 0f - it.viewContainer.pivotX = it.viewContainer.width / 2f - it.viewContainer.viewTreeObserver.removeOnGlobalLayoutListener(this) - } + override fun onSlide(bottomSheet: View, slideOffset: Float) { + binding.apply { + val editorScale = 1 - slideOffset * (1 - EDITOR_CONTAINER_SCALE_FACTOR) + this.bottomSheet.onSlide(slideOffset) + this.viewContainer.scaleX = editorScale + this.viewContainer.scaleY = editorScale } } + }) + + val observer: OnGlobalLayoutListener = object : OnGlobalLayoutListener { + override fun onGlobalLayout() { + binding.let { + it.viewContainer.pivotY = 0f + it.viewContainer.pivotX = it.viewContainer.width / 2f + it.viewContainer.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + } + } binding.apply { viewContainer.viewTreeObserver.addOnGlobalLayoutListener(observer) diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt index 3089ab3d3..51e7d0989 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt @@ -163,7 +163,7 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler { if (selectedFile == null || openedFiles.isEmpty()) { editorViewModel.writeOpenedFiles(null) editorViewModel.openedFilesCache = null - log.debug("[onPause]", "No opened files.", "Opened files cache reset to null.") + log.debug("[onPause] No opened files. Opened files cache reset to null.") isOpenedFilesSaved.set(true) return } @@ -172,7 +172,7 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler { editorViewModel.writeOpenedFiles(cache) editorViewModel.openedFilesCache = if (!isDestroying) cache else null - log.debug("[onPause]", "Opened files cache reset to ${editorViewModel.openedFilesCache}") + log.debug("[onPause] Opened files cache reset to {}", editorViewModel.openedFilesCache) isOpenedFilesSaved.set(true) } @@ -307,8 +307,7 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler { return try { getEditorAtIndex(index) } catch (th: Throwable) { - log.error("Unable to get editor fragment at opened file index", index) - log.error(th) + log.error("Unable to get editor fragment at opened file index {}", index, th) null } } @@ -325,7 +324,7 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler { val position = editorViewModel.getOpenedFileCount() - log.info("Opening file at index:", position, "file: ", file) + log.info("Opening file at index {} file:{}", position, file) val editor = CodeEditorView(this, file, selection!!) editor.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) @@ -504,11 +503,11 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler { } val opened = editorViewModel.getOpenedFile(index) - log.info("Closing file:", opened) + log.info("Closing file: {}", opened) val editor = getEditorAtIndex(index) if (editor?.isModified == true) { - log.info("File has been modified:", opened) + log.info("File has been modified: {}", opened) notifyFilesUnsaved(listOf(editor)) { closeFile(index, runAfter) } @@ -554,7 +553,7 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler { val editor = getEditorAtIndex(index) if (editor == null) { - log.error("Unable to save file at index:", index) + log.error("Unable to save file at index {}", index) continue } @@ -583,7 +582,7 @@ open class EditorHandlerActivity : ProjectHandlerActivity(), IEditorHandler { // Files were already saved, close all files one by one for (i in 0 until count) { getEditorAtIndex(i)?.close() ?: run { - log.error("Unable to close file at index:", i) + log.error("Unable to close file at index {}", i) } } diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/IDELogcatReader.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/IDELogcatReader.kt index def6c5fae..0013e0002 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/IDELogcatReader.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/IDELogcatReader.kt @@ -18,13 +18,13 @@ package com.itsaky.androidide.activities.editor import android.os.Process import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.transferToStream import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancel import kotlinx.coroutines.launch +import org.slf4j.LoggerFactory import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -37,10 +37,14 @@ import java.util.Locale */ class IDELogcatReader { - private val log = ILogger.newInstance("IDELogcatReader") private var job: Job? = null private var shouldRun = false + companion object { + + private val log = LoggerFactory.getLogger(IDELogcatReader::class.java) + } + /** * Start reading the logs. */ @@ -71,7 +75,7 @@ class IDELogcatReader { val outputFile = File(Environment.ANDROIDIDE_HOME, "logs/AndroidIDE-LOG-${dateFormat.format(date)}.txt") - log.debug("Creating output file: $outputFile") + log.debug("Creating output file: {}", outputFile) outputFile.parentFile!!.mkdirs() try { @@ -96,7 +100,7 @@ class IDELogcatReader { process.inputStream.transferToStream(writer) writer.flush() - log.info("Process ended with exit code :", process.waitFor()) + log.info("Process ended with exit code: {}", process.waitFor()) } catch (err: Throwable) { log.error("Failed to read logs", err) } diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt index 5e5d1fb63..9cc9b4bba 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/ProjectHandlerActivity.kt @@ -334,7 +334,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() { newSelections.putAll(buildVariantsViewModel.updatedBuildVariants) initializeProject { newSelections.mapToSelectedVariants().also { - log.debug("Initializing project with new build variant selections: $it") + log.debug("Initializing project with new build variant selections: {}", it) } } return @@ -363,7 +363,7 @@ abstract class ProjectHandlerActivity : BaseEditorActivity() { } val initialized = manager.projectInitialized && manager.cachedInitResult != null - log.debug("Is project initialized: $initialized") + log.debug("Is project initialized: {}", initialized) // When returning after a configuration change between the initialization process, // we do not want to start another project initialization if (isFromSavedInstance && initialized && !shouldInitialize) { diff --git a/app/src/main/java/com/itsaky/androidide/adapters/BuildVariantsAdapter.kt b/app/src/main/java/com/itsaky/androidide/adapters/BuildVariantsAdapter.kt index e37237607..7aa7b67a0 100644 --- a/app/src/main/java/com/itsaky/androidide/adapters/BuildVariantsAdapter.kt +++ b/app/src/main/java/com/itsaky/androidide/adapters/BuildVariantsAdapter.kt @@ -21,7 +21,6 @@ import android.view.LayoutInflater import android.view.ViewGroup import android.widget.ArrayAdapter import androidx.core.widget.addTextChangedListener -import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.itsaky.androidide.R import com.itsaky.androidide.databinding.LayoutBuildVariantItemBinding diff --git a/app/src/main/java/com/itsaky/androidide/adapters/ContributorsGridAdapter.kt b/app/src/main/java/com/itsaky/androidide/adapters/ContributorsGridAdapter.kt index 41c489439..2a82ff81c 100644 --- a/app/src/main/java/com/itsaky/androidide/adapters/ContributorsGridAdapter.kt +++ b/app/src/main/java/com/itsaky/androidide/adapters/ContributorsGridAdapter.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.adapters -import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -29,7 +28,6 @@ import com.itsaky.androidide.R import com.itsaky.androidide.app.IDEApplication import com.itsaky.androidide.contributors.Contributor import com.itsaky.androidide.databinding.LayoutContributorsItemBinding -import com.itsaky.androidide.templates.Template /** * @author Akash Yadav diff --git a/app/src/main/java/com/itsaky/androidide/adapters/DiagnosticItemAdapter.java b/app/src/main/java/com/itsaky/androidide/adapters/DiagnosticItemAdapter.java index 61d42333c..22c5de3ea 100644 --- a/app/src/main/java/com/itsaky/androidide/adapters/DiagnosticItemAdapter.java +++ b/app/src/main/java/com/itsaky/androidide/adapters/DiagnosticItemAdapter.java @@ -20,17 +20,14 @@ package com.itsaky.androidide.adapters; import android.graphics.PorterDuff; import android.view.LayoutInflater; import android.view.ViewGroup; - import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; - -import com.itsaky.androidide.resources.R; import com.itsaky.androidide.databinding.LayoutDiagnosticItemBinding; import com.itsaky.androidide.interfaces.DiagnosticClickListener; import com.itsaky.androidide.lsp.models.DiagnosticItem; import com.itsaky.androidide.lsp.models.DiagnosticSeverity; - +import com.itsaky.androidide.resources.R; import java.io.File; import java.util.List; import java.util.Objects; diff --git a/app/src/main/java/com/itsaky/androidide/adapters/DiagnosticsAdapter.java b/app/src/main/java/com/itsaky/androidide/adapters/DiagnosticsAdapter.java index 6afd66abf..8581065eb 100755 --- a/app/src/main/java/com/itsaky/androidide/adapters/DiagnosticsAdapter.java +++ b/app/src/main/java/com/itsaky/androidide/adapters/DiagnosticsAdapter.java @@ -20,15 +20,12 @@ package com.itsaky.androidide.adapters; import android.view.LayoutInflater; import android.view.ViewGroup; - import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; - import com.itsaky.androidide.databinding.LayoutDiagnosticGroupBinding; import com.itsaky.androidide.interfaces.DiagnosticClickListener; import com.itsaky.androidide.models.DiagnosticGroup; - import java.util.List; import java.util.Objects; diff --git a/app/src/main/java/com/itsaky/androidide/adapters/EditorBottomSheetTabAdapter.java b/app/src/main/java/com/itsaky/androidide/adapters/EditorBottomSheetTabAdapter.java index a9faea0e2..4f16d0d54 100644 --- a/app/src/main/java/com/itsaky/androidide/adapters/EditorBottomSheetTabAdapter.java +++ b/app/src/main/java/com/itsaky/androidide/adapters/EditorBottomSheetTabAdapter.java @@ -23,21 +23,20 @@ import androidx.collection.LongSparseArray; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.viewpager2.adapter.FragmentStateAdapter; - -import com.itsaky.androidide.resources.R; -import com.itsaky.androidide.fragments.output.AppLogFragment; import com.itsaky.androidide.fragments.DiagnosticsListFragment; -import com.itsaky.androidide.fragments.output.IDELogFragment; import com.itsaky.androidide.fragments.SearchResultFragment; +import com.itsaky.androidide.fragments.output.AppLogFragment; import com.itsaky.androidide.fragments.output.BuildOutputFragment; -import com.itsaky.androidide.utils.ILogger; - +import com.itsaky.androidide.fragments.output.IDELogFragment; +import com.itsaky.androidide.resources.R; import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class EditorBottomSheetTabAdapter extends FragmentStateAdapter { - private static final ILogger LOG = ILogger.newInstance("EditorBottomSheetTabAdapter"); + private static final Logger LOG = LoggerFactory.getLogger(EditorBottomSheetTabAdapter.class); private final List fragments; public EditorBottomSheetTabAdapter(@NonNull FragmentActivity fragmentActivity) { diff --git a/app/src/main/java/com/itsaky/androidide/adapters/OptionsSheetAdapter.java b/app/src/main/java/com/itsaky/androidide/adapters/OptionsSheetAdapter.java index 0cc25f874..83022b4b3 100755 --- a/app/src/main/java/com/itsaky/androidide/adapters/OptionsSheetAdapter.java +++ b/app/src/main/java/com/itsaky/androidide/adapters/OptionsSheetAdapter.java @@ -22,12 +22,9 @@ package com.itsaky.androidide.adapters; import android.view.LayoutInflater; import android.view.ViewGroup; - import androidx.recyclerview.widget.RecyclerView; - import com.itsaky.androidide.databinding.LayoutOptionssheetItemBinding; import com.itsaky.androidide.models.SheetOption; - import java.util.List; public class OptionsSheetAdapter extends RecyclerView.Adapter { diff --git a/app/src/main/java/com/itsaky/androidide/adapters/SymbolInputAdapter.java b/app/src/main/java/com/itsaky/androidide/adapters/SymbolInputAdapter.java index c66be9b11..48f6a5e19 100755 --- a/app/src/main/java/com/itsaky/androidide/adapters/SymbolInputAdapter.java +++ b/app/src/main/java/com/itsaky/androidide/adapters/SymbolInputAdapter.java @@ -17,14 +17,12 @@ */ package com.itsaky.androidide.adapters; -import static com.itsaky.androidide.preferences.utils.EditorUtilKt.getIndentationString; import static com.itsaky.androidide.utils.ResourceUtilsKt.resolveAttr; import android.annotation.SuppressLint; import android.view.LayoutInflater; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.itsaky.androidide.R; import com.itsaky.androidide.databinding.LayoutSymbolItemBinding; @@ -32,7 +30,6 @@ import com.itsaky.androidide.editor.ui.IDEEditor; import com.itsaky.androidide.models.Symbol; import io.github.rosemoe.sora.widget.SelectionMovement; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Objects; diff --git a/app/src/main/java/com/itsaky/androidide/adapters/onboarding/DefaultOnboardingItemAdapter.kt b/app/src/main/java/com/itsaky/androidide/adapters/onboarding/DefaultOnboardingItemAdapter.kt index 755416ba1..c4a54daa3 100644 --- a/app/src/main/java/com/itsaky/androidide/adapters/onboarding/DefaultOnboardingItemAdapter.kt +++ b/app/src/main/java/com/itsaky/androidide/adapters/onboarding/DefaultOnboardingItemAdapter.kt @@ -21,12 +21,9 @@ import android.content.res.ColorStateList import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView -import com.itsaky.androidide.R import com.itsaky.androidide.databinding.LayoutOnboardingItemBinding import com.itsaky.androidide.models.OnboardingItem -import com.itsaky.androidide.utils.resolveAttr /** * Default implmentation of [RecyclerView.Adapter] for showing [OnboardingItem]s. diff --git a/app/src/main/java/com/itsaky/androidide/adapters/onboarding/OnboardingPermissionsAdapter.kt b/app/src/main/java/com/itsaky/androidide/adapters/onboarding/OnboardingPermissionsAdapter.kt index 6c991ed31..7affdf8b8 100644 --- a/app/src/main/java/com/itsaky/androidide/adapters/onboarding/OnboardingPermissionsAdapter.kt +++ b/app/src/main/java/com/itsaky/androidide/adapters/onboarding/OnboardingPermissionsAdapter.kt @@ -27,7 +27,6 @@ import com.google.android.material.button.MaterialButton import com.itsaky.androidide.R import com.itsaky.androidide.databinding.LayoutOnboardingPermissionItemBinding import com.itsaky.androidide.models.OnboardingPermissionItem -import com.itsaky.androidide.utils.ILogger /** * @author Akash Yadav @@ -72,8 +71,6 @@ class OnboardingPermissionsAdapter(private val permissions: List { diff --git a/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt b/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt index ae0c3bd90..b8c54e965 100755 --- a/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt +++ b/app/src/main/java/com/itsaky/androidide/app/IDEApplication.kt @@ -58,7 +58,6 @@ import com.itsaky.androidide.tasks.executeAsync import com.itsaky.androidide.treesitter.TreeSitter import com.itsaky.androidide.ui.themes.IDETheme import com.itsaky.androidide.ui.themes.IThemeManager -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.RecyclableObjectPool import com.itsaky.androidide.utils.VMUtils import com.itsaky.androidide.utils.flashError @@ -67,6 +66,7 @@ import io.github.rosemoe.sora.widget.schemes.EditorColorScheme import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.slf4j.LoggerFactory import java.lang.Thread.UncaughtExceptionHandler import java.time.Duration import kotlin.system.exitProcess @@ -75,7 +75,6 @@ class IDEApplication : TermuxApplication() { private var uncaughtExceptionHandler: UncaughtExceptionHandler? = null private var ideLogcatReader: IDELogcatReader? = null - private val log = ILogger.newInstance("IDEApplication") init { if (!VMUtils.isJvm()) { @@ -94,21 +93,16 @@ class IDEApplication : TermuxApplication() { if (BuildConfig.DEBUG) { StrictMode.setVmPolicy( - StrictMode.VmPolicy.Builder(StrictMode.getVmPolicy()).penaltyLog().detectAll().build() - ) + StrictMode.VmPolicy.Builder(StrictMode.getVmPolicy()).penaltyLog().detectAll().build()) if (dumpLogs) { startLogcatReader() } } - EventBus.builder() - .addIndex(AppEventsIndex()) - .addIndex(EditorEventsIndex()) - .addIndex(ProjectsApiEventsIndex()) - .addIndex(LspApiEventsIndex()) - .addIndex(LspJavaEventsIndex()) - .installDefaultEventBus(true) + EventBus.builder().addIndex(AppEventsIndex()).addIndex(EditorEventsIndex()) + .addIndex(ProjectsApiEventsIndex()).addIndex(LspApiEventsIndex()) + .addIndex(LspJavaEventsIndex()).installDefaultEventBus(true) EventBus.getDefault().register(this) @@ -139,7 +133,7 @@ class IDEApplication : TermuxApplication() { exitProcess(1) } catch (error: Throwable) { - LOG.error("Unable to show crash handler activity", error) + log.error("Unable to show crash handler activity", error) } } @@ -154,7 +148,7 @@ class IDEApplication : TermuxApplication() { try { startActivity(intent) } catch (th: Throwable) { - LOG.error("Unable to start activity to show changelog", th) + log.error("Unable to start activity to show changelog", th) flashError("Unable to start activity") } } @@ -167,23 +161,20 @@ class IDEApplication : TermuxApplication() { } val constraints = Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build() - val request = PeriodicWorkRequestBuilder(Duration.ofHours(24)) - .setInputData(AndroidIDEStats.statData.toInputData()) - .setConstraints(constraints) - .addTag(StatUploadWorker.WORKER_WORK_NAME) - .build() + val request = PeriodicWorkRequestBuilder(Duration.ofHours(24)).setInputData( + AndroidIDEStats.statData.toInputData()).setConstraints(constraints) + .addTag(StatUploadWorker.WORKER_WORK_NAME).build() val workManager = WorkManager.getInstance(this) log.info("reportStatsIfNecessary: Enqueuing StatUploadWorker...") - val operation = workManager - .enqueueUniquePeriodicWork(StatUploadWorker.WORKER_WORK_NAME, + val operation = workManager.enqueueUniquePeriodicWork(StatUploadWorker.WORKER_WORK_NAME, ExistingPeriodicWorkPolicy.UPDATE, request) operation.state.observeForever(object : Observer { - override fun onChanged(t: Operation.State) { + override fun onChanged(value: Operation.State) { operation.state.removeObserver(this) - log.debug("reportStatsIfNecessary: WorkManager enqueue result: $t") + log.debug("reportStatsIfNecessary: WorkManager enqueue result: {}", value) } }) } @@ -238,16 +229,16 @@ class IDEApplication : TermuxApplication() { val operation = WorkManager.getInstance(this) .cancelUniqueWork(StatUploadWorker.WORKER_WORK_NAME) operation.state.observeForever(object : Observer { - override fun onChanged(t: Operation.State) { + override fun onChanged(value: Operation.State) { operation.state.removeObserver(this) - log.info("StatUploadWorker: Cancellation result state: $t") + log.info("StatUploadWorker: Cancellation result state: {}", value) } }) } companion object { - private val LOG = ILogger.newInstance("IDEApplication") + private val log = LoggerFactory.getLogger(IDEApplication::class.java) @JvmStatic lateinit var instance: IDEApplication diff --git a/app/src/main/java/com/itsaky/androidide/app/configuration/JdkDistributionProviderImpl.kt b/app/src/main/java/com/itsaky/androidide/app/configuration/JdkDistributionProviderImpl.kt index 90aef32c5..98ff5b2a7 100644 --- a/app/src/main/java/com/itsaky/androidide/app/configuration/JdkDistributionProviderImpl.kt +++ b/app/src/main/java/com/itsaky/androidide/app/configuration/JdkDistributionProviderImpl.kt @@ -21,8 +21,8 @@ import com.google.auto.service.AutoService import com.itsaky.androidide.models.JdkDistribution import com.itsaky.androidide.preferences.internal.javaHome import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.JdkUtils +import org.slf4j.LoggerFactory import java.io.File /** @@ -33,7 +33,7 @@ class JdkDistributionProviderImpl : IJdkDistributionProvider { companion object { - private val log = ILogger.newInstance("JdkDistributionProviderImpl") + private val log = LoggerFactory.getLogger(JdkDistributionProviderImpl::class.java) } private var _installedDistributions: List? = null @@ -79,7 +79,7 @@ class JdkDistributionProviderImpl : IJdkDistributionProvider { java.setExecutable(true) } - log.debug("Setting Environment.JAVA_HOME to $javaHome") + log.debug("Setting Environment.JAVA_HOME to {}", javaHome) Environment.JAVA_HOME = File(javaHome) Environment.JAVA = Environment.JAVA_HOME.resolve("bin/java") diff --git a/app/src/main/java/com/itsaky/androidide/contributors/Contributors.kt b/app/src/main/java/com/itsaky/androidide/contributors/Contributors.kt index ef97d7d04..abb2e293f 100644 --- a/app/src/main/java/com/itsaky/androidide/contributors/Contributors.kt +++ b/app/src/main/java/com/itsaky/androidide/contributors/Contributors.kt @@ -17,9 +17,9 @@ package com.itsaky.androidide.contributors -import com.itsaky.androidide.utils.ILogger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import org.slf4j.LoggerFactory import retrofit2.Call import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @@ -29,7 +29,7 @@ import retrofit2.converter.gson.GsonConverterFactory */ internal object Contributors { - val log: ILogger = ILogger.newInstance("Contributors") + private val log = LoggerFactory.getLogger(Contributors::class.java) @JvmStatic suspend inline fun getAllContributors( diff --git a/app/src/main/java/com/itsaky/androidide/fragments/IDEPreferencesFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/IDEPreferencesFragment.kt index 7a75cf49e..9866b0908 100755 --- a/app/src/main/java/com/itsaky/androidide/fragments/IDEPreferencesFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/IDEPreferencesFragment.kt @@ -24,7 +24,6 @@ import android.view.ViewGroup import androidx.preference.PreferenceCategory import androidx.preference.PreferenceGroup import com.google.android.material.transition.MaterialSharedAxis -import com.itsaky.androidide.R import com.itsaky.androidide.preferences.IPreference import com.itsaky.androidide.preferences.IPreferenceGroup import com.itsaky.androidide.preferences.IPreferenceScreen diff --git a/app/src/main/java/com/itsaky/androidide/fragments/MainFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/MainFragment.kt index 97fdd62fe..e61045284 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/MainFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/MainFragment.kt @@ -1,6 +1,5 @@ package com.itsaky.androidide.fragments -import android.content.DialogInterface import android.content.Intent import android.os.Bundle import android.view.LayoutInflater @@ -9,7 +8,6 @@ import android.view.ViewGroup import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.fragment.app.viewModels -import com.blankj.utilcode.util.ThreadUtils import com.google.android.material.progressindicator.LinearProgressIndicator import com.itsaky.androidide.activities.MainActivity import com.itsaky.androidide.activities.PreferencesActivity @@ -19,15 +17,12 @@ import com.itsaky.androidide.app.BaseApplication import com.itsaky.androidide.app.BaseIDEActivity import com.itsaky.androidide.common.databinding.LayoutDialogProgressBinding import com.itsaky.androidide.databinding.FragmentMainBinding -import com.itsaky.androidide.lsp.java.utils.CancelChecker import com.itsaky.androidide.models.MainScreenAction import com.itsaky.androidide.preferences.databinding.LayoutDialogTextInputBinding import com.itsaky.androidide.resources.R.string -import com.itsaky.androidide.tasks.executeAsyncProvideError import com.itsaky.androidide.tasks.runOnUiThread import com.itsaky.androidide.utils.DialogUtils import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import com.itsaky.androidide.utils.flashSuccess import com.itsaky.androidide.viewmodel.MainViewModel @@ -37,6 +32,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.ProgressMonitor +import org.slf4j.LoggerFactory import java.io.File import java.util.concurrent.CancellationException @@ -46,7 +42,10 @@ class MainFragment : BaseFragment() { ownerProducer = { requireActivity() }) private var binding: FragmentMainBinding? = null - private val log = ILogger.newInstance("MainFragment") + companion object { + + private val log = LoggerFactory.getLogger(MainFragment::class.java) + } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -127,7 +126,7 @@ class MainFragment : BaseFragment() { private fun doClone(repo: String?) { if (repo.isNullOrBlank()) { - log.warn("Unable to clone repo. Invalid repo URL : '$repo'") + log.warn("Unable to clone repo. Invalid repo URL : {}'", repo) return } diff --git a/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt index 54ca105b3..86f6d55df 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/RunTasksDialogFragment.kt @@ -51,13 +51,13 @@ import com.itsaky.androidide.projects.builder.BuildService import com.itsaky.androidide.resources.R import com.itsaky.androidide.tasks.executeAsync import com.itsaky.androidide.tooling.api.models.GradleTask -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.SingleTextWatcher import com.itsaky.androidide.utils.doOnApplyWindowInsets import com.itsaky.androidide.utils.flashError import com.itsaky.androidide.utils.flashInfo import com.itsaky.androidide.utils.updateSystemBarColors import com.itsaky.androidide.viewmodel.RunTasksViewModel +import org.slf4j.LoggerFactory /** * A bottom sheet dialog fragment to show UI which allows the users to select and execute Gradle @@ -71,9 +71,9 @@ class RunTasksDialogFragment : BottomSheetDialogFragment() { private lateinit var run: LayoutRunTaskBinding private val viewModel: RunTasksViewModel by viewModels() - private val log = ILogger.newInstance("RunTasksDialogFragment") - companion object { + private val log = LoggerFactory.getLogger(RunTasksDialogFragment::class.java) + private const val CHILD_LOADING = 0 private const val CHILD_TASKS = 1 private const val CHILD_CONFIRMATION = 2 diff --git a/app/src/main/java/com/itsaky/androidide/fragments/TemplateDetailsFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/TemplateDetailsFragment.kt index eb8cc8bb8..a9f721975 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/TemplateDetailsFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/TemplateDetailsFragment.kt @@ -33,11 +33,11 @@ import com.itsaky.androidide.templates.ProjectTemplateRecipeResult import com.itsaky.androidide.templates.StringParameter import com.itsaky.androidide.templates.Template import com.itsaky.androidide.templates.impl.ConstraintVerifier -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.TemplateRecipeExecutor import com.itsaky.androidide.utils.flashError import com.itsaky.androidide.utils.flashSuccess import com.itsaky.androidide.viewmodel.MainViewModel +import org.slf4j.LoggerFactory /** * A fragment which shows a wizard-like interface for creating templates. @@ -48,10 +48,14 @@ class TemplateDetailsFragment : FragmentWithBinding( R.layout.fragment_template_details, FragmentTemplateDetailsBinding::bind) { - private val log = ILogger.newInstance("TemplateDetailsFragment") private val viewModel by viewModels( ownerProducer = { requireActivity() }) + companion object { + + private val log = LoggerFactory.getLogger(TemplateDetailsFragment::class.java) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -99,8 +103,7 @@ class TemplateDetailsFragment : viewModel.creatingProject.value = false if (result == null || err != null || result !is ProjectTemplateRecipeResult) { err?.printStackTrace() - log.error( - "Failed to create project. result=$result, err=${err?.message}") + log.error("Failed to create project. result={}, err={}", result, err?.message) if (err != null) { flashError(err.cause?.message ?: err.message) } else { diff --git a/app/src/main/java/com/itsaky/androidide/fragments/TemplateListFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/TemplateListFragment.kt index 375238788..0fa818c1f 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/TemplateListFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/TemplateListFragment.kt @@ -30,8 +30,8 @@ import com.itsaky.androidide.databinding.FragmentTemplateListBinding import com.itsaky.androidide.templates.ITemplateProvider import com.itsaky.androidide.templates.ProjectTemplate import com.itsaky.androidide.utils.FlexboxUtils -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.viewmodel.MainViewModel +import org.slf4j.LoggerFactory /** * A fragment to show the list of available templates. @@ -49,6 +49,11 @@ class TemplateListFragment : private val viewModel by viewModels(ownerProducer = { requireActivity() }) + companion object { + + private val log = LoggerFactory.getLogger(TemplateListFragment::class.java) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -84,8 +89,6 @@ class TemplateListFragment : super.onDestroyView() } - private val log = ILogger.newInstance("TemplateListFragment") - private fun reloadTemplates() { _binding ?: return diff --git a/app/src/main/java/com/itsaky/androidide/fragments/onboarding/IdeSetupConfigurationFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/onboarding/IdeSetupConfigurationFragment.kt index fcd0ac583..46ef6fb98 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/onboarding/IdeSetupConfigurationFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/onboarding/IdeSetupConfigurationFragment.kt @@ -33,7 +33,6 @@ import android.text.Html import android.text.Spannable import android.text.SpannableStringBuilder import android.text.style.URLSpan -import android.util.Log import android.view.ViewGroup import android.widget.ArrayAdapter import androidx.core.content.getSystemService diff --git a/app/src/main/java/com/itsaky/androidide/fragments/output/AppLogFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/output/AppLogFragment.kt index 8a4cdb887..aef831bf5 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/output/AppLogFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/output/AppLogFragment.kt @@ -31,7 +31,7 @@ import com.itsaky.androidide.services.log.LogReceiverImpl import com.itsaky.androidide.services.log.LogReceiverService import com.itsaky.androidide.services.log.LogReceiverServiceConnection import com.itsaky.androidide.services.log.lookupLogService -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.util.concurrent.atomic.AtomicBoolean /** @@ -40,7 +40,6 @@ import java.util.concurrent.atomic.AtomicBoolean */ class AppLogFragment : LogViewFragment() { - private val log = ILogger.newInstance("AppLogFragment") private val isBoundToLogReceiver = AtomicBoolean(false) private var logServiceConnection: LogReceiverServiceConnection? = null @@ -77,6 +76,11 @@ class AppLogFragment : LogViewFragment() { } } + companion object { + + private val log = LoggerFactory.getLogger(AppLogFragment::class.java) + } + override fun isSimpleFormattingEnabled() = false override fun getFilename() = "app_logs" @@ -130,8 +134,8 @@ class AppLogFragment : LogViewFragment() { } val context = context ?: return - val intent = Intent(context, LogReceiverService::class.java) - .setAction(LogReceiverService.ACTION_CONNECT_LOG_CONSUMER) + val intent = Intent(context, LogReceiverService::class.java).setAction( + LogReceiverService.ACTION_CONNECT_LOG_CONSUMER) val serviceConnection = logServiceConnection ?: LogReceiverServiceConnection { binder -> logReceiverImpl = binder diff --git a/app/src/main/java/com/itsaky/androidide/fragments/output/IDELogFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/output/IDELogFragment.kt index 52edec0a7..451fc9869 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/output/IDELogFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/output/IDELogFragment.kt @@ -19,8 +19,12 @@ package com.itsaky.androidide.fragments.output import android.os.Bundle import android.view.View +import androidx.lifecycle.Lifecycle +import ch.qos.logback.classic.Logger +import ch.qos.logback.classic.LoggerContext import com.itsaky.androidide.R -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.logging.LifecycleAwareAppender +import org.slf4j.LoggerFactory /** * Fragment to show IDE logs. @@ -28,21 +32,7 @@ import com.itsaky.androidide.utils.ILogger */ class IDELogFragment : LogViewFragment() { - private var logListener: ILogger.LogListener? = - ILogger.LogListener { level, tag, message -> - if (message.contains("\n")) { - val split = message.split("\n").toTypedArray() - for (line in split) { - logLine(level, tag, line) - } - } else { - logLine(level, tag, message) - } - } - - init { - ILogger.addLogListener(this.logListener) - } + private val lifecycleAwareAppender = LifecycleAwareAppender(Lifecycle.State.CREATED) override fun isSimpleFormattingEnabled() = true override fun getFilename() = "ide_logs" @@ -50,11 +40,24 @@ class IDELogFragment : LogViewFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) emptyStateViewModel.emptyMessage.value = getString(R.string.msg_emptyview_idelogs) + + lifecycleAwareAppender.consumer = this::appendLine + lifecycleAwareAppender.attachTo(viewLifecycleOwner) + + val loggerContext = LoggerFactory.getILoggerFactory() as LoggerContext + val rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME) as Logger + + lifecycleAwareAppender.context = loggerContext + lifecycleAwareAppender.start() + + rootLogger.addAppender(lifecycleAwareAppender) } override fun onDestroy() { super.onDestroy() - ILogger.removeLogListener(logListener) - logListener = null + lifecycleAwareAppender.stop() + + val logger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME) as Logger + logger.detachAppender(lifecycleAwareAppender) } } \ No newline at end of file diff --git a/app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt index 5fabda1c2..666bc4335 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/output/LogViewFragment.kt @@ -30,10 +30,10 @@ import com.itsaky.androidide.editor.schemes.IDEColorScheme import com.itsaky.androidide.editor.schemes.IDEColorSchemeProvider import com.itsaky.androidide.fragments.EmptyStateFragment import com.itsaky.androidide.models.LogLine -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.ILogger.Level import com.itsaky.androidide.utils.jetbrainsMono import io.github.rosemoe.sora.widget.style.CursorAnimator +import org.slf4j.LoggerFactory import java.util.concurrent.ArrayBlockingQueue import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.locks.ReentrantLock @@ -51,6 +51,8 @@ abstract class LogViewFragment : companion object { + private val log = LoggerFactory.getLogger(LogViewFragment::class.java) + /** The maximum number of characters to append to the editor in case of huge log texts. */ const val MAX_CHUNK_SIZE = 10000 @@ -87,55 +89,56 @@ abstract class LogViewFragment : private val cache = StringBuilder() private var cacheLineTrack = ArrayBlockingQueue(MAX_LINE_COUNT, true) - private val log = ILogger.newInstance("LogViewFragment") - private val isTrimming = AtomicBoolean(false) private val logHandler = Handler(Looper.getMainLooper()) - private val logRunnable = - object : Runnable { - override fun run() { - cacheLock.withLock { - if (cacheLineTrack.size == MAX_LINE_COUNT) { - cache.delete(0, cacheLineTrack.poll()!!) - } + private val logRunnable = object : Runnable { + override fun run() { + cacheLock.withLock { + if (cacheLineTrack.size == MAX_LINE_COUNT) { + cache.delete(0, cacheLineTrack.poll()!!) + } - cacheLineTrack.clear() + cacheLineTrack.clear() - if (cache.length < MAX_CHUNK_SIZE) { - append(cache) - cache.clear() - } else { - // Append the lines in chunks to avoid UI lags - val length = min(cache.length, MAX_CHUNK_SIZE) - append(cache.subSequence(0, length)) - cache.delete(0, length) - } + if (cache.length < MAX_CHUNK_SIZE) { + append(cache) + cache.clear() + } else { + // Append the lines in chunks to avoid UI lags + val length = min(cache.length, MAX_CHUNK_SIZE) + append(cache.subSequence(0, length)) + cache.delete(0, length) + } - if (cache.isNotEmpty()) { - // if we still have data left to append, resechedule this - logHandler.removeCallbacks(this) - logHandler.postDelayed(this, LOG_DELAY) - } else { - trimLinesAtStart() - } + if (cache.isNotEmpty()) { + // if we still have data left to append, resechedule this + logHandler.removeCallbacks(this) + logHandler.postDelayed(this, LOG_DELAY) + } else { + trimLinesAtStart() } } } + } fun appendLog(line: LogLine) { - var lineString = - if (isSimpleFormattingEnabled()) { - line.toSimpleString() - } else { - line.toString() - } + val lineString = if (isSimpleFormattingEnabled()) { + line.toSimpleString() + } else { + line.toString() + } line.recycle() - if (!lineString.endsWith("\n")) { - lineString += "\n" + appendLine(lineString) + } + + protected fun appendLine(line: String) { + var lineStr = line + if (!lineStr.endsWith("\n")) { + lineStr += "\n" } if (isTrimming.get() || cache.isNotEmpty() || System.currentTimeMillis() - lastLog <= LOG_FREQUENCY) { @@ -143,7 +146,7 @@ abstract class LogViewFragment : logHandler.removeCallbacks(logRunnable) // If the log lines are too frequent, cache the lines to log them later at once - cache.append(lineString) + cache.append(lineStr) logHandler.postDelayed(logRunnable, LOG_DELAY) lastLog = System.currentTimeMillis() @@ -159,7 +162,7 @@ abstract class LogViewFragment : lastLog = System.currentTimeMillis() - append(lineString) + append(lineStr) trimLinesAtStart() } @@ -188,7 +191,7 @@ abstract class LogViewFragment : isTrimming.set(true) val lastLine = lineCount - MAX_LINE_COUNT - log.debug("Deleting log text till line $lastLine") + log.debug("Deleting log text till line {}", lastLine) delete(0, 0, lastLine, getColumnCount(lastLine)) isTrimming.set(false) } @@ -240,11 +243,8 @@ abstract class LogViewFragment : } } - IDEColorSchemeProvider.readSchemeAsync( - context = requireContext(), - coroutineScope = editor.editorScope, - type = LogLanguage.TS_TYPE - ) { scheme -> + IDEColorSchemeProvider.readSchemeAsync(context = requireContext(), + coroutineScope = editor.editorScope, type = LogLanguage.TS_TYPE) { scheme -> val language = TreeSitterLanguageProvider.forType(LogLanguage.TS_TYPE, requireContext()) checkNotNull(language) { "No TreeSitterLanguage found for type ${LogLanguage.TS_TYPE}" } diff --git a/app/src/main/java/com/itsaky/androidide/fragments/sidebar/BuildVariantsFragment.kt b/app/src/main/java/com/itsaky/androidide/fragments/sidebar/BuildVariantsFragment.kt index 162a1e573..730c72572 100644 --- a/app/src/main/java/com/itsaky/androidide/fragments/sidebar/BuildVariantsFragment.kt +++ b/app/src/main/java/com/itsaky/androidide/fragments/sidebar/BuildVariantsFragment.kt @@ -26,7 +26,6 @@ import com.itsaky.androidide.adapters.BuildVariantsAdapter import com.itsaky.androidide.databinding.FragmentBuildVariantsBinding import com.itsaky.androidide.fragments.EmptyStateFragment import com.itsaky.androidide.tooling.api.models.BuildVariantInfo -import com.itsaky.androidide.tooling.api.models.mapToSelectedVariants import com.itsaky.androidide.viewmodel.BuildVariantsViewModel import com.itsaky.androidide.viewmodel.EditorViewModel diff --git a/app/src/main/java/com/itsaky/androidide/handlers/BaseEventHandler.kt b/app/src/main/java/com/itsaky/androidide/handlers/BaseEventHandler.kt index 91849c72c..6686719bb 100644 --- a/app/src/main/java/com/itsaky/androidide/handlers/BaseEventHandler.kt +++ b/app/src/main/java/com/itsaky/androidide/handlers/BaseEventHandler.kt @@ -21,7 +21,8 @@ import android.content.Context import com.itsaky.androidide.activities.editor.EditorHandlerActivity import com.itsaky.androidide.eventbus.events.Event import com.itsaky.androidide.eventbus.events.EventReceiver -import com.itsaky.androidide.utils.ILogger +import org.slf4j.Logger +import org.slf4j.LoggerFactory /** * Base class for event handlers. @@ -30,13 +31,17 @@ import com.itsaky.androidide.utils.ILogger */ abstract class BaseEventHandler : EventReceiver { - protected val log = ILogger.newInstance(javaClass.simpleName) + companion object { + + @JvmStatic + protected val log: Logger = LoggerFactory.getLogger(BaseEventHandler::class.java) + } protected open fun checkIsEditorActivity(event: Event): Boolean { return event.get(Context::class.java) is EditorHandlerActivity } protected open fun logCannotHandle(event: Event) { - log.warn("Context is not EditorActivity. Cannot handle ${event.javaClass.simpleName} event.") + log.warn("Context is not EditorActivity. Cannot handle {} event.", event.javaClass.simpleName) } } diff --git a/app/src/main/java/com/itsaky/androidide/handlers/EditorBuildEventListener.kt b/app/src/main/java/com/itsaky/androidide/handlers/EditorBuildEventListener.kt index e0042d4f2..bd4c951e2 100644 --- a/app/src/main/java/com/itsaky/androidide/handlers/EditorBuildEventListener.kt +++ b/app/src/main/java/com/itsaky/androidide/handlers/EditorBuildEventListener.kt @@ -26,9 +26,9 @@ import com.itsaky.androidide.tooling.api.messages.result.BuildInfo import com.itsaky.androidide.tooling.events.ProgressEvent import com.itsaky.androidide.tooling.events.configuration.ProjectConfigurationStartEvent import com.itsaky.androidide.tooling.events.task.TaskStartEvent -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import com.itsaky.androidide.utils.flashSuccess +import org.slf4j.LoggerFactory import java.lang.ref.WeakReference /** @@ -42,7 +42,7 @@ class EditorBuildEventListener : GradleBuildService.EventListener { companion object { - private val log = ILogger.newInstance("EditorBuildEventListener") + private val log = LoggerFactory.getLogger(EditorBuildEventListener::class.java) } private val _activity: EditorHandlerActivity? @@ -137,7 +137,7 @@ class EditorBuildEventListener : GradleBuildService.EventListener { return _activity.also { if (it == null) { - log.warn("[$action] Activity reference has been destroyed!") + log.warn("[{}] Activity reference has been destroyed!", action) enabled = false } } diff --git a/app/src/main/java/com/itsaky/androidide/handlers/FileTreeActionHandler.kt b/app/src/main/java/com/itsaky/androidide/handlers/FileTreeActionHandler.kt index f44617fb7..0604de378 100644 --- a/app/src/main/java/com/itsaky/androidide/handlers/FileTreeActionHandler.kt +++ b/app/src/main/java/com/itsaky/androidide/handlers/FileTreeActionHandler.kt @@ -83,7 +83,7 @@ class FileTreeActionHandler : BaseEventHandler() { if (MB_10 < event.file.length()) { flashError("File is too big!") log.warn( - "Cannot open ${event.file.name} as it is too big. File size: ${event.file.length()} bytes") + "Cannot open {} as it is too big. File size: {} bytes", event.file, event.file.length()) return } diff --git a/app/src/main/java/com/itsaky/androidide/interfaces/DiagnosticClickListener.java b/app/src/main/java/com/itsaky/androidide/interfaces/DiagnosticClickListener.java index bc90f0033..09fbbe35e 100755 --- a/app/src/main/java/com/itsaky/androidide/interfaces/DiagnosticClickListener.java +++ b/app/src/main/java/com/itsaky/androidide/interfaces/DiagnosticClickListener.java @@ -17,9 +17,8 @@ **************************************************************************************/ package com.itsaky.androidide.interfaces; -import com.itsaky.androidide.models.DiagnosticGroup; import com.itsaky.androidide.lsp.models.DiagnosticItem; - +import com.itsaky.androidide.models.DiagnosticGroup; import java.io.File; public interface DiagnosticClickListener { diff --git a/app/src/main/java/com/itsaky/androidide/logging/LifecycleAwareAppender.kt b/app/src/main/java/com/itsaky/androidide/logging/LifecycleAwareAppender.kt new file mode 100644 index 000000000..d7e4a05e2 --- /dev/null +++ b/app/src/main/java/com/itsaky/androidide/logging/LifecycleAwareAppender.kt @@ -0,0 +1,96 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.logging + +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner +import ch.qos.logback.classic.encoder.PatternLayoutEncoder +import ch.qos.logback.classic.spi.ILoggingEvent +import ch.qos.logback.core.AppenderBase +import ch.qos.logback.core.Context + +/** + * An [AppenderBase] implementation to show the logs in the GUI. + * + * @author Akash Yadav + */ +class LifecycleAwareAppender @JvmOverloads constructor( + private val requireLifecycleState: Lifecycle.State = Lifecycle.State.CREATED, + var consumer: ((String) -> Unit)? = null +) : AppenderBase(), LifecycleEventObserver { + + private var currentState: Lifecycle.State? = null + private val encoder = PatternLayoutEncoder() + + init { + setName("LifecycleAwareAppender") + + encoder.pattern = "%date %-5level [%thread] %logger{0}:" + encoder.isOutputPatternAsHeader = true + } + + fun attachTo(lifecycleOwner: LifecycleOwner) = attachTo(lifecycleOwner.lifecycle) + fun attachTo(lifecycle: Lifecycle) = lifecycle.addObserver(this) + + fun detachFrom(lifecycleOwner: LifecycleOwner) = detachFrom(lifecycleOwner.lifecycle) + fun detachFrom(lifecycle: Lifecycle) = lifecycle.removeObserver(this) + + override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { + + this.currentState = when (event) { + Lifecycle.Event.ON_ANY -> null + else -> event.targetState + } + } + + override fun isStarted(): Boolean { + return (super.isStarted() + && currentState?.isAtLeast(this.requireLifecycleState) == true + && consumer != null) + } + + override fun start() { + this.encoder.start() + super.start() + } + + override fun stop() { + super.stop() + this.encoder.stop() + this.consumer = null + } + + override fun setContext(context: Context?) { + super.setContext(context) + this.encoder.context = context + } + + override fun append(eventObject: ILoggingEvent?) { + if (eventObject == null || !isStarted) { + return + } + + // When rendering the logs in the GUI, we need to ensure that the message does not span multiple lines + // if it does, we need to prefix the message with the layout header + val prefix = encoder.layout.doLayout(eventObject) + eventObject.formattedMessage.split('\n').forEach { + consumer?.invoke("$prefix $it") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/itsaky/androidide/lsp/IDELanguageClientImpl.java b/app/src/main/java/com/itsaky/androidide/lsp/IDELanguageClientImpl.java index 1d3c7f74b..9539fca5f 100755 --- a/app/src/main/java/com/itsaky/androidide/lsp/IDELanguageClientImpl.java +++ b/app/src/main/java/com/itsaky/androidide/lsp/IDELanguageClientImpl.java @@ -48,7 +48,6 @@ import com.itsaky.androidide.tasks.TaskExecutor; import com.itsaky.androidide.ui.CodeEditorView; import com.itsaky.androidide.utils.FlashbarActivityUtilsKt; import com.itsaky.androidide.utils.FlashbarUtilsKt; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.utils.LSPUtils; import io.github.rosemoe.sora.lang.diagnostic.DiagnosticsContainer; import io.github.rosemoe.sora.text.Content; @@ -64,6 +63,8 @@ import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; import kotlin.Unit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * AndroidIDE specific implementation of the LanguageClient @@ -72,7 +73,7 @@ public class IDELanguageClientImpl implements ILanguageClient { public static final int MAX_DIAGNOSTIC_FILES = 10; public static final int MAX_DIAGNOSTIC_ITEMS_PER_FILE = 20; - protected static final ILogger LOG = ILogger.newInstance("AbstractLanguageClient"); + protected static final Logger LOG = LoggerFactory.getLogger(IDELanguageClientImpl.class); private static IDELanguageClientImpl mInstance; private final Map> diagnostics = new HashMap<>(); protected EditorHandlerActivity activity; @@ -168,10 +169,7 @@ public class IDELanguageClientImpl implements ILanguageClient { final var action = params.getAction(); if (!canUseActivity()) { - LOG.error( - "Unable to perform code action", - "activity=" + null, - "action=" + action); + LOG.error("Unable to perform code action activity=null action={}", action); FlashbarUtilsKt.flashError(string.msg_cannot_perform_fix); return; } @@ -199,8 +197,7 @@ public class IDELanguageClientImpl implements ILanguageClient { (result, throwable) -> { progress.dismiss(); if (result == null || throwable != null || !result) { - LOG.error( - "Unable to perform code action", "result=" + result, "throwable=" + throwable); + LOG.error("Unable to perform code action result={}", result, throwable); FlashbarActivityUtilsKt.flashError(this.activity, string.msg_cannot_perform_fix); } else if (editor != null) { editor.executeCommand(action.getCommand()); @@ -328,10 +325,8 @@ public class IDELanguageClientImpl implements ILanguageClient { // Trim the diagnostics list if we have too many diagnostic items. // Including a lot of diagnostic items will result in UI lag when they are shown if (fileDiagnostics.size() > MAX_DIAGNOSTIC_ITEMS_PER_FILE) { - LOG.warn( - "Limiting diagnostics to", + LOG.warn("Limiting diagnostics to {} items for file {}", MAX_DIAGNOSTIC_ITEMS_PER_FILE, - "items for file", file.getName()); fileDiagnostics = fileDiagnostics.subList(0, MAX_DIAGNOSTIC_ITEMS_PER_FILE); diff --git a/app/src/main/java/com/itsaky/androidide/models/ApkMetadata.kt b/app/src/main/java/com/itsaky/androidide/models/ApkMetadata.kt index ff93b41e3..f49811e53 100755 --- a/app/src/main/java/com/itsaky/androidide/models/ApkMetadata.kt +++ b/app/src/main/java/com/itsaky/androidide/models/ApkMetadata.kt @@ -18,23 +18,37 @@ package com.itsaky.androidide.models import com.google.gson.annotations.SerializedName -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.JSONUtility.gson import com.itsaky.androidide.utils.ListingFileRedirect.getListingFile +import org.slf4j.LoggerFactory import java.io.File import java.io.FileNotFoundException import java.io.FileReader class ApkMetadata { - @SerializedName("version") var version = 0 - @SerializedName("artifactType") var artifactType: ArtifactType? = null - @SerializedName("applicationId") var applicationId: String? = null - @SerializedName("variantName") var variantName: String? = null - @SerializedName("elements") var elements: List? = null - @SerializedName("elementType") var elementType: String? = null + + @SerializedName("version") + var version = 0 + + @SerializedName("artifactType") + var artifactType: ArtifactType? = null + + @SerializedName("applicationId") + var applicationId: String? = null + + @SerializedName("variantName") + var variantName: String? = null + + @SerializedName("elements") + var elements: List? = null + + @SerializedName("elementType") + var elementType: String? = null companion object { - private val log = ILogger.newInstance("ApkMetadata") + + private val log = LoggerFactory.getLogger(ApkMetadata::class.java) + fun findApkFile(listingFIle: File): File? { return try { // This sometimes might be a redirect to the listing file @@ -45,20 +59,20 @@ class ApkMetadata { FileReader(redirectedFile).use { val metadata = gson.fromJson(it, ApkMetadata::class.java) if (!isValid(metadata)) { - log.warn("Invalid APK metadata:", metadata) + log.warn("Invalid APK metadata: {}", metadata) return@use null } for (element in metadata.elements!!) { if (element.outputFile == null) { - log.warn("No output file specified in APK metadata element:", element) + log.warn("No output file specified in APK metadata element: {}", element) continue } if (element.outputFile!!.endsWith(".apk")) { val apk = element.outputFile?.let { File(dir, it) } ?: continue if (apk.exists() && apk.isFile) { - log.info("Found apk in metadata:", apk) + log.info("Found apk in metadata: {}", apk) return@use apk } } @@ -75,24 +89,24 @@ class ApkMetadata { private fun isValid(metadata: ApkMetadata?): Boolean { // Null checks if (metadata?.artifactType?.type == null || metadata.elements == null) { - log.warn("APK metadata null check failed. Metadata:", metadata) + log.warn("APK metadata null check failed. Metadata: {}", metadata) return false } val type = metadata.artifactType val elements = metadata.elements if (type!!.type != ArtifactType.TYPE_APK) { - log.warn("Artifact is not of type APK. Metadata:", metadata) + log.warn("Artifact is not of type APK. Metadata: {}", metadata) return false } if (elements!!.isEmpty()) { - log.warn("No output elements found for metadata:", metadata) + log.warn("No output elements found for metadata: {}", metadata) return false } var atLeastOneApk = false for (element in elements) { if (element.outputFile?.endsWith(".apk") == false) { - log.warn("Skipping output element because file is not APK:", element) + log.warn("Skipping output element because file is not APK: {}", element) continue } atLeastOneApk = true diff --git a/app/src/main/java/com/itsaky/androidide/models/DiagnosticGroup.java b/app/src/main/java/com/itsaky/androidide/models/DiagnosticGroup.java index abbf104a9..963ac0cb7 100755 --- a/app/src/main/java/com/itsaky/androidide/models/DiagnosticGroup.java +++ b/app/src/main/java/com/itsaky/androidide/models/DiagnosticGroup.java @@ -18,7 +18,6 @@ package com.itsaky.androidide.models; import com.itsaky.androidide.lsp.models.DiagnosticItem; - import java.io.File; import java.util.List; diff --git a/app/src/main/java/com/itsaky/androidide/models/OpenedFile.kt b/app/src/main/java/com/itsaky/androidide/models/OpenedFile.kt index da069a64a..51ef80521 100644 --- a/app/src/main/java/com/itsaky/androidide/models/OpenedFile.kt +++ b/app/src/main/java/com/itsaky/androidide/models/OpenedFile.kt @@ -20,7 +20,7 @@ package com.itsaky.androidide.models import com.google.gson.Gson import com.google.gson.annotations.SerializedName import com.google.gson.stream.JsonReader -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory /** * A file that is opened in editor. @@ -36,7 +36,7 @@ data class OpenedFile( private const val KEY_FILE = "file" private const val KEY_SELECTION = "selection" - private val log = ILogger.newInstance("OpenedFile") + private val log = LoggerFactory.getLogger(OpenedFile::class.java) fun readFrom(reader: JsonReader): OpenedFile? { return try { diff --git a/app/src/main/java/com/itsaky/androidide/models/OpenedFilesCache.kt b/app/src/main/java/com/itsaky/androidide/models/OpenedFilesCache.kt index 126df2498..829b031bb 100644 --- a/app/src/main/java/com/itsaky/androidide/models/OpenedFilesCache.kt +++ b/app/src/main/java/com/itsaky/androidide/models/OpenedFilesCache.kt @@ -21,7 +21,7 @@ import com.google.gson.Gson import com.google.gson.annotations.SerializedName import com.google.gson.reflect.TypeToken import com.google.gson.stream.JsonReader -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.io.Reader /** @@ -34,7 +34,7 @@ data class OpenedFilesCache(@SerializedName(KEY_SELECTED_FILE) val selectedFile: private const val KEY_SELECTED_FILE = "selectedFile" private const val KEY_ALL_FILES = "allFiles" - private val log = ILogger.newInstance("OpenedFilesCache") + private val log = LoggerFactory.getLogger(OpenedFilesCache::class.java) @JvmStatic fun parse(contentReader: Reader): OpenedFilesCache? { diff --git a/app/src/main/java/com/itsaky/androidide/models/ProjectTemplate.java b/app/src/main/java/com/itsaky/androidide/models/ProjectTemplate.java index 09f8d1dc4..053b957fe 100755 --- a/app/src/main/java/com/itsaky/androidide/models/ProjectTemplate.java +++ b/app/src/main/java/com/itsaky/androidide/models/ProjectTemplate.java @@ -18,7 +18,6 @@ package com.itsaky.androidide.models; import android.content.Context; - import androidx.annotation.DrawableRes; import androidx.annotation.StringRes; diff --git a/app/src/main/java/com/itsaky/androidide/preferences/buildAndRunPrefExts.kt b/app/src/main/java/com/itsaky/androidide/preferences/buildAndRunPrefExts.kt index 597f57f8e..fbb0d7499 100644 --- a/app/src/main/java/com/itsaky/androidide/preferences/buildAndRunPrefExts.kt +++ b/app/src/main/java/com/itsaky/androidide/preferences/buildAndRunPrefExts.kt @@ -42,7 +42,6 @@ import com.itsaky.androidide.preferences.internal.launchAppAfterInstall import com.itsaky.androidide.resources.R.drawable import com.itsaky.androidide.resources.R.string import com.itsaky.androidide.tasks.executeAsync -import com.itsaky.androidide.utils.Environment import com.itsaky.androidide.utils.Environment.GRADLE_USER_HOME import com.itsaky.androidide.utils.flashError import com.itsaky.androidide.utils.flashSuccess diff --git a/app/src/main/java/com/itsaky/androidide/preferences/commonPrefExts.kt b/app/src/main/java/com/itsaky/androidide/preferences/commonPrefExts.kt index 367202347..7bd59dd0b 100644 --- a/app/src/main/java/com/itsaky/androidide/preferences/commonPrefExts.kt +++ b/app/src/main/java/com/itsaky/androidide/preferences/commonPrefExts.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.preferences import androidx.preference.Preference import com.itsaky.androidide.utils.uncheckedCast -import kotlinx.parcelize.IgnoredOnParcel import kotlin.reflect.KMutableProperty0 internal abstract class PropertyBasedMultiChoicePreference : MultiChoicePreference() { diff --git a/app/src/main/java/com/itsaky/androidide/preferences/xmlPrefExts.kt b/app/src/main/java/com/itsaky/androidide/preferences/xmlPrefExts.kt index c4486d29e..17cfb01b3 100644 --- a/app/src/main/java/com/itsaky/androidide/preferences/xmlPrefExts.kt +++ b/app/src/main/java/com/itsaky/androidide/preferences/xmlPrefExts.kt @@ -18,7 +18,6 @@ package com.itsaky.androidide.preferences import androidx.preference.Preference -import com.itsaky.androidide.resources.R.string import com.itsaky.androidide.preferences.internal.CLOSING_BRACKET_NEW_LINE import com.itsaky.androidide.preferences.internal.EMPTY_ELEMENTS_BEHAVIOR import com.itsaky.androidide.preferences.internal.INSERT_FINAL_NEW_LINE @@ -49,9 +48,10 @@ import com.itsaky.androidide.preferences.internal.splitAttributes import com.itsaky.androidide.preferences.internal.splitAttributesIndentSize import com.itsaky.androidide.preferences.internal.trimFinalNewLine import com.itsaky.androidide.preferences.internal.trimTrailingWhitespace +import com.itsaky.androidide.resources.R.string import kotlinx.parcelize.IgnoredOnParcel -import org.eclipse.lemminx.dom.builder.EmptyElements import kotlinx.parcelize.Parcelize +import org.eclipse.lemminx.dom.builder.EmptyElements @Parcelize class XMLPreferences( diff --git a/app/src/main/java/com/itsaky/androidide/provider/IDEDocumentsProvider.java b/app/src/main/java/com/itsaky/androidide/provider/IDEDocumentsProvider.java index c18c495e5..5ab4c2dc8 100644 --- a/app/src/main/java/com/itsaky/androidide/provider/IDEDocumentsProvider.java +++ b/app/src/main/java/com/itsaky/androidide/provider/IDEDocumentsProvider.java @@ -27,19 +27,17 @@ import android.provider.DocumentsContract.Document; import android.provider.DocumentsContract.Root; import android.provider.DocumentsProvider; import android.webkit.MimeTypeMap; - import androidx.annotation.NonNull; - import com.itsaky.androidide.resources.R; import com.itsaky.androidide.utils.Environment; -import com.itsaky.androidide.utils.ILogger; - import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Collections; import java.util.LinkedList; import java.util.Locale; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A document provider for the Storage Access Framework which exposes the files in the $HOME/ @@ -53,36 +51,36 @@ import java.util.Locale; * http://developer.android.com/guide/topics/providers/document-provider.html#43 * * @see TermuxDocumentsProvider + * href="https://github.com/termux/termux-app/blob/master/app/src/main/java/com/termux/filepicker/TermuxDocumentsProvider.java">TermuxDocumentsProvider */ public class IDEDocumentsProvider extends DocumentsProvider { private static final String ALL_MIME_TYPES = "*/*"; - private static final ILogger LOG = ILogger.newInstance("IDEDocumentsProvider"); + private static final Logger LOG = LoggerFactory.getLogger(IDEDocumentsProvider.class); private static final File BASE_DIR = getBaseDir(); // The default columns to return information about a root if no specific // columns are requested in a query. private static final String[] DEFAULT_ROOT_PROJECTION = - new String[] { - Root.COLUMN_ROOT_ID, - Root.COLUMN_MIME_TYPES, - Root.COLUMN_FLAGS, - Root.COLUMN_ICON, - Root.COLUMN_TITLE, - Root.COLUMN_SUMMARY, - Root.COLUMN_DOCUMENT_ID, - Root.COLUMN_AVAILABLE_BYTES + new String[]{ + Root.COLUMN_ROOT_ID, + Root.COLUMN_MIME_TYPES, + Root.COLUMN_FLAGS, + Root.COLUMN_ICON, + Root.COLUMN_TITLE, + Root.COLUMN_SUMMARY, + Root.COLUMN_DOCUMENT_ID, + Root.COLUMN_AVAILABLE_BYTES }; // The default columns to return information about a document if no specific // columns are requested in a query. private static final String[] DEFAULT_DOCUMENT_PROJECTION = - new String[] { - Document.COLUMN_DOCUMENT_ID, - Document.COLUMN_MIME_TYPE, - Document.COLUMN_DISPLAY_NAME, - Document.COLUMN_LAST_MODIFIED, - Document.COLUMN_FLAGS, - Document.COLUMN_SIZE + new String[]{ + Document.COLUMN_DOCUMENT_ID, + Document.COLUMN_MIME_TYPE, + Document.COLUMN_DISPLAY_NAME, + Document.COLUMN_LAST_MODIFIED, + Document.COLUMN_FLAGS, + Document.COLUMN_SIZE }; @NonNull @@ -263,8 +261,8 @@ public class IDEDocumentsProvider extends DocumentsProvider { * Add a representation of a file to a cursor. * * @param result the cursor to modify - * @param docId the document ID representing the desired file (may be null if given file) - * @param file the File object representing the desired file (may be null if given docID) + * @param docId the document ID representing the desired file (may be null if given file) + * @param file the File object representing the desired file (may be null if given docID) */ private void includeFile(MatrixCursor result, String docId, File file) throws FileNotFoundException { @@ -276,15 +274,21 @@ public class IDEDocumentsProvider extends DocumentsProvider { int flags = 0; if (file.isDirectory()) { - if (file.canWrite()) flags |= Document.FLAG_DIR_SUPPORTS_CREATE; + if (file.canWrite()) { + flags |= Document.FLAG_DIR_SUPPORTS_CREATE; + } } else if (file.canWrite()) { flags |= Document.FLAG_SUPPORTS_WRITE; } - if (file.getParentFile().canWrite()) flags |= Document.FLAG_SUPPORTS_DELETE; + if (file.getParentFile().canWrite()) { + flags |= Document.FLAG_SUPPORTS_DELETE; + } final String displayName = file.getName(); final String mimeType = getMimeType(file); - if (mimeType.startsWith("image/")) flags |= Document.FLAG_SUPPORTS_THUMBNAIL; + if (mimeType.startsWith("image/")) { + flags |= Document.FLAG_SUPPORTS_THUMBNAIL; + } final MatrixCursor.RowBuilder row = result.newRow(); row.add(Document.COLUMN_DOCUMENT_ID, docId); @@ -296,10 +300,14 @@ public class IDEDocumentsProvider extends DocumentsProvider { row.add(Document.COLUMN_ICON, R.mipmap.ic_launcher); } - /** Get the file given a document id (the reverse of {@link #getDocIdForFile(File)}). */ + /** + * Get the file given a document id (the reverse of {@link #getDocIdForFile(File)}). + */ private static File getFileForDocId(String docId) throws FileNotFoundException { final File f = new File(docId); - if (!f.exists()) throw new FileNotFoundException(f.getAbsolutePath() + " not found"); + if (!f.exists()) { + throw new FileNotFoundException(f.getAbsolutePath() + " not found"); + } return f; } @@ -312,7 +320,9 @@ public class IDEDocumentsProvider extends DocumentsProvider { if (lastDot >= 0) { final String extension = name.substring(lastDot + 1).toLowerCase(Locale.ROOT); final String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); - if (mime != null) return mime; + if (mime != null) { + return mime; + } } return "application/octet-stream"; } diff --git a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt index 9ee25814e..0159495c9 100644 --- a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt +++ b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt @@ -61,16 +61,15 @@ import com.itsaky.androidide.tooling.api.messages.result.BuildResult import com.itsaky.androidide.tooling.api.messages.result.GradleWrapperCheckResult import com.itsaky.androidide.tooling.api.messages.result.InitializeResult import com.itsaky.androidide.tooling.api.messages.result.TaskExecutionResult -import com.itsaky.androidide.tooling.api.messages.toLogLine import com.itsaky.androidide.tooling.events.ProgressEvent import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch +import org.slf4j.LoggerFactory import java.io.File import java.io.IOException import java.io.InputStream @@ -129,10 +128,9 @@ class GradleBuildService : Service(), BuildService, IToolingApiClient, companion object { - private val log = ILogger.newInstance("GradleBuildService") - private val serverLogger = ILogger.newInstance("ToolingApiServer") + private val log = LoggerFactory.getLogger(GradleBuildService::class.java) private val NOTIFICATION_ID = R.string.app_name - private val SERVER_System_err = ILogger.newInstance("ToolingApiErrorStream") + private val SERVER_System_err = LoggerFactory.getLogger("ToolingApiErrorStream") } override fun onCreate() { @@ -188,7 +186,7 @@ class GradleBuildService : Service(), BuildService, IToolingApiClient, mBinder?.release() mBinder = null - log.info("Service is being destroyed.", "Dismissing the shown notification...") + log.info("Service is being destroyed. Dismissing the shown notification...") notificationManager!!.cancel(NOTIFICATION_ID) val lookup = Lookup.getDefault() @@ -237,7 +235,7 @@ class GradleBuildService : Service(), BuildService, IToolingApiClient, } override fun onServerExited(exitCode: Int) { - log.warn("Tooling API process terminated with exit code:", exitCode) + log.warn("Tooling API process terminated with exit code: {}", exitCode) stopForeground(STOP_FOREGROUND_REMOVE) } @@ -249,8 +247,15 @@ class GradleBuildService : Service(), BuildService, IToolingApiClient, } override fun logMessage(params: LogMessageParams) { - val line = params.toLogLine() - serverLogger.log(line.level, line.formattedTagAndMessage()) + val logger = LoggerFactory.getLogger(params.tag) + when (params.level) { + 'D' -> logger.debug(params.message) + 'W' -> logger.warn(params.message) + 'E' -> logger.error(params.message) + 'I' -> logger.info(params.message) + + else -> logger.trace(params.message) + } } override fun logOutput(line: String) { diff --git a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildServiceConnnection.kt b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildServiceConnnection.kt index 1fbb99986..eb813b4f5 100644 --- a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildServiceConnnection.kt +++ b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildServiceConnnection.kt @@ -20,7 +20,7 @@ package com.itsaky.androidide.services.builder import android.content.ComponentName import android.content.ServiceConnection import android.os.IBinder -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory /** * [ServiceConnection] for [GradleBuildService]. @@ -28,15 +28,19 @@ import com.itsaky.androidide.utils.ILogger * @author Akash Yadav */ class GradleBuildServiceConnnection : ServiceConnection { - + internal var onConnected: ((GradleBuildService) -> Unit)? = null - private val log = ILogger.newInstance("GradleBuildServiceConnnection") - + + companion object { + + private val log = LoggerFactory.getLogger(GradleBuildServiceConnnection::class.java) + } + override fun onServiceConnected(name: ComponentName?, service: IBinder?) { val serviceBinder = service as GradleServiceBinder onConnected?.invoke(serviceBinder.service!!) } - + override fun onServiceDisconnected(name: ComponentName?) { onConnected = null log.info("Disconnected from Gradle build service") diff --git a/app/src/main/java/com/itsaky/androidide/services/builder/ToolingServerRunner.kt b/app/src/main/java/com/itsaky/androidide/services/builder/ToolingServerRunner.kt index 32809a6c8..b5c6c9c92 100644 --- a/app/src/main/java/com/itsaky/androidide/services/builder/ToolingServerRunner.kt +++ b/app/src/main/java/com/itsaky/androidide/services/builder/ToolingServerRunner.kt @@ -25,7 +25,6 @@ import com.itsaky.androidide.tooling.api.IToolingApiClient import com.itsaky.androidide.tooling.api.IToolingApiServer import com.itsaky.androidide.tooling.api.util.ToolingApiLauncher import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope @@ -33,6 +32,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.joinAll import kotlinx.coroutines.launch +import org.slf4j.LoggerFactory import java.io.InputStream import java.util.concurrent.atomic.AtomicBoolean @@ -59,7 +59,7 @@ internal class ToolingServerRunner( companion object { - private val log = ILogger.newInstance("ToolingServerRunner") + private val log = LoggerFactory.getLogger(ToolingServerRunner::class.java) } fun setListener(listener: OnServerStartListener?) { @@ -109,7 +109,7 @@ internal class ToolingServerRunner( val processJob = launch(Dispatchers.IO) { try { process?.waitFor() - log.info("Tooling API process exited with code : ${process?.exitValue() ?: ""}") + log.info("Tooling API process exited with code : {}", process?.exitValue() ?: "") process = null } finally { log.info("Destroying Tooling API process...") diff --git a/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverImpl.kt b/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverImpl.kt index 7ab4eec1c..fe991861b 100644 --- a/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverImpl.kt +++ b/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverImpl.kt @@ -22,7 +22,7 @@ import com.itsaky.androidide.logsender.ILogReceiver import com.itsaky.androidide.logsender.ILogSender import com.itsaky.androidide.models.LogLine import com.itsaky.androidide.tasks.executeAsyncProvideError -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.locks.ReentrantLock import kotlin.concurrent.withLock @@ -34,7 +34,6 @@ import kotlin.concurrent.withLock */ class LogReceiverImpl(consumer: ((LogLine) -> Unit)? = null) : ILogReceiver.Stub(), AutoCloseable { - private val log = ILogger.newInstance("LogReceiverImpl") private val senderHandler = MultiLogSenderHandler() private val senders = LogSendersRegistry() private val consumerLock = ReentrantLock(true) @@ -48,6 +47,11 @@ class LogReceiverImpl(consumer: ((LogLine) -> Unit)? = null) : ILogReceiver.Stub senderHandler.consumer = value?.let { synchronizeConsumer(value) } } + companion object { + + private val log = LoggerFactory.getLogger(LogReceiverImpl::class.java) + } + private fun synchronizeConsumer(consumer: (LogLine) -> Unit): (LogLine) -> Unit { return { line -> consumerLock.withLock { consumer(line) } } } @@ -98,7 +102,7 @@ class LogReceiverImpl(consumer: ((LogLine) -> Unit)? = null) : ILogReceiver.Stub // logging this also makes sure that the package name, pid and sender ID are // cached when the sender binds to the service // these fields are then used on disconnectAll() - log.info("Connecting to client ${caching.packageName}:${caching.id}:${caching.pid}") + log.info("Connecting to client {}:{}:{}", caching.packageName, caching.pid, caching.id) this.senders.put(caching) @@ -117,7 +121,7 @@ class LogReceiverImpl(consumer: ((LogLine) -> Unit)? = null) : ILogReceiver.Stub doAsync("startReaders") { senders.getPendingSenders().forEach { sender -> - log.info("Notifying sender '${sender.packageName}' to start reading logs...") + log.info("Notifying sender '{}' to start reading logs...", sender.packageName) sender.startReader(sender.port) } } @@ -153,7 +157,7 @@ class LogReceiverImpl(consumer: ((LogLine) -> Unit)? = null) : ILogReceiver.Stub } private fun disconnectSender(packageName: String, senderId: String) { - log.info("Disconnecting from client: '${packageName}'") + log.info("Disconnecting from client: '{}'", packageName) this.senderHandler.removeClient(senderId) this.senders.remove(packageName) logTotalConnected() @@ -172,7 +176,7 @@ class LogReceiverImpl(consumer: ((LogLine) -> Unit)? = null) : ILogReceiver.Stub private fun doAsync(actionName: String, action: () -> Unit) { executeAsyncProvideError(action::invoke) { _, error -> if (error != null) { - log.error("Failed to perform action '$actionName'", error) + log.error("Failed to perform action '{}'", actionName, error) } } } @@ -182,6 +186,6 @@ class LogReceiverImpl(consumer: ((LogLine) -> Unit)? = null) : ILogReceiver.Stub } private fun logTotalConnected() { - log.info("Total clients connected: ${senders.size}") + log.info("Total clients connected: {}", senders.size) } } \ No newline at end of file diff --git a/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverService.kt b/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverService.kt index 508e62b1d..3774fb499 100644 --- a/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverService.kt +++ b/app/src/main/java/com/itsaky/androidide/services/log/LogReceiverService.kt @@ -25,7 +25,7 @@ import com.itsaky.androidide.logsender.LogSender import com.itsaky.androidide.lookup.Lookup import com.itsaky.androidide.models.LogLine import com.itsaky.androidide.preferences.logsenderEnabled -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean @@ -42,10 +42,11 @@ class LogReceiverService : Service() { private val isBoundToConsumer = AtomicBoolean(false) private val scheduledExecutor = Executors.newSingleThreadScheduledExecutor() - private val log = ILogger.newInstance("LogReceiverService") companion object { + private val log = LoggerFactory.getLogger(LogReceiverService::class.java) + internal const val ACTION_CONNECT_LOG_CONSUMER = "com.itsaky.androidide.logrecevier.CONNECT_LOG_CONSUMER" internal const val ACTION_CONNECTION_UPDATE = "com.itsaky.androidide.logreceiver.CONNECTION_UPDATE" @@ -62,7 +63,7 @@ class LogReceiverService : Service() { } override fun onBind(intent: Intent?): IBinder? { - log.debug("Received bind request: $intent") + log.debug("Received bind request: {}", intent) if (!logsenderEnabled) { log.debug("Rejecting bind request. LogReceiver is disabled.") @@ -83,7 +84,7 @@ class LogReceiverService : Service() { } if (intent?.action != LogSender.SERVICE_ACTION) { - log.debug("Rejecting bind request: action=${intent?.action}") + log.debug("Rejecting bind request: action={}", intent?.action) return null } diff --git a/app/src/main/java/com/itsaky/androidide/services/log/LogSenderHandler.kt b/app/src/main/java/com/itsaky/androidide/services/log/LogSenderHandler.kt index e316967aa..f28cd1a41 100644 --- a/app/src/main/java/com/itsaky/androidide/services/log/LogSenderHandler.kt +++ b/app/src/main/java/com/itsaky/androidide/services/log/LogSenderHandler.kt @@ -19,10 +19,10 @@ package com.itsaky.androidide.services.log import com.itsaky.androidide.logsender.socket.SenderInfoCommand import com.itsaky.androidide.models.LogLine -import com.itsaky.androidide.utils.ILogger import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import org.slf4j.LoggerFactory import java.net.Socket import java.net.SocketException @@ -31,15 +31,16 @@ import java.net.SocketException * * @author Akash Yadav */ -class LogSenderHandler( - private val sender: SenderInfoCommand, - private val socket: Socket, +class LogSenderHandler(private val sender: SenderInfoCommand, private val socket: Socket, internal var consumer: ((LogLine) -> Unit)? = null, - private var onClose: ((String) -> Unit)? = null -) : AutoCloseable { + private var onClose: ((String) -> Unit)? = null) : AutoCloseable { private var manuallyClosed = false - private val log = ILogger.newInstance("LogSenderHandler") + + companion object { + + private val log = LoggerFactory.getLogger(LogSenderHandler::class.java) + } suspend fun startAsync() = withContext(Dispatchers.IO) { try { @@ -54,8 +55,7 @@ class LogSenderHandler( } } catch (err: SocketException) { if (!manuallyClosed) { - log.error("An error occurred while reading from socket") - log.error(err) + log.error("An error occurred while reading from socket", err) } } finally { close() diff --git a/app/src/main/java/com/itsaky/androidide/services/log/MultiLogSenderHandler.kt b/app/src/main/java/com/itsaky/androidide/services/log/MultiLogSenderHandler.kt index 5e3ef345e..a4523f8e8 100644 --- a/app/src/main/java/com/itsaky/androidide/services/log/MultiLogSenderHandler.kt +++ b/app/src/main/java/com/itsaky/androidide/services/log/MultiLogSenderHandler.kt @@ -21,16 +21,15 @@ import com.itsaky.androidide.logsender.socket.SenderInfoCommand import com.itsaky.androidide.logsender.socket.SocketCommandParser import com.itsaky.androidide.models.LogLine import com.itsaky.androidide.tasks.cancelIfActive -import com.itsaky.androidide.utils.ILogger import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import org.slf4j.LoggerFactory import java.lang.Thread.currentThread import java.net.ServerSocket -import java.util.concurrent.CancellationException import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger @@ -42,7 +41,6 @@ import java.util.concurrent.atomic.AtomicInteger */ class MultiLogSenderHandler(consumer: ((LogLine) -> Unit)? = null) : AutoCloseable { - private val log = ILogger.newInstance("MultiLogSenderHandler") private val clients = ConcurrentHashMap() private val port = AtomicInteger(-1) private var isAlive = AtomicBoolean(false) @@ -56,6 +54,10 @@ class MultiLogSenderHandler(consumer: ((LogLine) -> Unit)? = null) : AutoCloseab clients.forEach { (_, client) -> client.consumer = value } } + companion object { + private val log = LoggerFactory.getLogger(MultiLogSenderHandler::class.java) + } + fun getPort(): Int { return port.get() } @@ -71,7 +73,7 @@ class MultiLogSenderHandler(consumer: ((LogLine) -> Unit)? = null) : AutoCloseab try { port.set(server.localPort) - log.info("Starting log receiver server socket at port ${getPort()}") + log.info("Starting log receiver server socket at port {}", getPort()) while (job?.isCancelled != true && isAlive.get()) { val clientSocket = server.accept() diff --git a/app/src/main/java/com/itsaky/androidide/tasks/callables/FileTreeCallable.java b/app/src/main/java/com/itsaky/androidide/tasks/callables/FileTreeCallable.java index edc7af479..a57d0cc88 100755 --- a/app/src/main/java/com/itsaky/androidide/tasks/callables/FileTreeCallable.java +++ b/app/src/main/java/com/itsaky/androidide/tasks/callables/FileTreeCallable.java @@ -21,10 +21,8 @@ package com.itsaky.androidide.tasks.callables; import android.content.Context; - import com.itsaky.androidide.adapters.viewholders.FileTreeViewHolder; import com.unnamed.b.atv.model.TreeNode; - import java.io.File; import java.io.FileFilter; import java.util.Arrays; diff --git a/app/src/main/java/com/itsaky/androidide/tasks/callables/ListDirectoryCallable.java b/app/src/main/java/com/itsaky/androidide/tasks/callables/ListDirectoryCallable.java index ea2d5c78b..223b9715c 100755 --- a/app/src/main/java/com/itsaky/androidide/tasks/callables/ListDirectoryCallable.java +++ b/app/src/main/java/com/itsaky/androidide/tasks/callables/ListDirectoryCallable.java @@ -21,9 +21,7 @@ package com.itsaky.androidide.tasks.callables; import android.text.TextUtils; - import com.blankj.utilcode.util.FileUtils; - import java.io.File; import java.io.FileFilter; diff --git a/app/src/main/java/com/itsaky/androidide/tasks/callables/UnzipCallable.java b/app/src/main/java/com/itsaky/androidide/tasks/callables/UnzipCallable.java index 79a830f7a..915ebe482 100755 --- a/app/src/main/java/com/itsaky/androidide/tasks/callables/UnzipCallable.java +++ b/app/src/main/java/com/itsaky/androidide/tasks/callables/UnzipCallable.java @@ -21,7 +21,6 @@ package com.itsaky.androidide.tasks.callables; import com.blankj.utilcode.util.ZipUtils; - import java.io.File; import java.util.List; import java.util.concurrent.Callable; diff --git a/app/src/main/java/com/itsaky/androidide/ui/CodeEditorView.kt b/app/src/main/java/com/itsaky/androidide/ui/CodeEditorView.kt index f01c81901..856f3781e 100644 --- a/app/src/main/java/com/itsaky/androidide/ui/CodeEditorView.kt +++ b/app/src/main/java/com/itsaky/androidide/ui/CodeEditorView.kt @@ -75,7 +75,6 @@ import com.itsaky.androidide.preferences.internal.wordwrap import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE import com.itsaky.androidide.tasks.cancelIfActive import com.itsaky.androidide.tasks.runOnUiThread -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.customOrJBMono import io.github.rosemoe.sora.text.Content import io.github.rosemoe.sora.text.LineSeparator @@ -92,6 +91,7 @@ import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.slf4j.LoggerFactory import java.io.Closeable import java.io.File @@ -150,7 +150,7 @@ class CodeEditorView( companion object { - private val log = ILogger.newInstance("CodeEditorView") + private val log = LoggerFactory.getLogger(CodeEditorView::class.java) } init { @@ -232,7 +232,7 @@ class CodeEditorView( val file = this.file ?: return false if (!isModified && file.exists()) { - log.info("File was not modified. Skipping save operation.", file.name) + log.info("File was not modified. Skipping save operation for file {}", file.name) return false } diff --git a/app/src/main/java/com/itsaky/androidide/ui/EditorBottomSheet.kt b/app/src/main/java/com/itsaky/androidide/ui/EditorBottomSheet.kt index 796a977a4..35fa3184e 100644 --- a/app/src/main/java/com/itsaky/androidide/ui/EditorBottomSheet.kt +++ b/app/src/main/java/com/itsaky/androidide/ui/EditorBottomSheet.kt @@ -51,10 +51,10 @@ import com.itsaky.androidide.resources.R.string import com.itsaky.androidide.tasks.TaskExecutor.CallbackWithError import com.itsaky.androidide.tasks.TaskExecutor.executeAsync import com.itsaky.androidide.tasks.TaskExecutor.executeAsyncProvideError -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.IntentUtils.shareFile import com.itsaky.androidide.utils.Symbols.forFile import com.itsaky.androidide.utils.flashError +import org.slf4j.LoggerFactory import java.io.File import java.io.IOException import java.nio.charset.StandardCharsets @@ -87,10 +87,10 @@ constructor( val pagerAdapter: EditorBottomSheetTabAdapter - private val log = ILogger.newInstance("EditorBottomSheet") - companion object { + private val log = LoggerFactory.getLogger(EditorBottomSheet::class.java) + const val CHILD_HEADER = 0 const val CHILD_SYMBOL_INPUT = 1 const val CHILD_ACTION = 2 @@ -129,7 +129,7 @@ constructor( val fragment = pagerAdapter.getFragmentAtIndex(binding.tabs.selectedTabPosition) if (fragment !is ShareableOutputFragment) { - log.error("Unknown fragment:", fragment) + log.error("Unknown fragment: {}", fragment) return@setOnClickListener } @@ -148,7 +148,7 @@ constructor( binding.clearFab.setOnClickListener { val fragment: Fragment = pagerAdapter.getFragmentAtIndex(binding.tabs.selectedTabPosition) if (fragment !is ShareableOutputFragment) { - log.error("Unknown fragment:", fragment) + log.error("Unknown fragment: {}", fragment) return@setOnClickListener } (fragment as ShareableOutputFragment).clearOutput() diff --git a/app/src/main/java/com/itsaky/androidide/ui/SymbolInputView.java b/app/src/main/java/com/itsaky/androidide/ui/SymbolInputView.java index 8c7f946a2..226e586aa 100755 --- a/app/src/main/java/com/itsaky/androidide/ui/SymbolInputView.java +++ b/app/src/main/java/com/itsaky/androidide/ui/SymbolInputView.java @@ -25,8 +25,6 @@ import com.itsaky.androidide.adapters.SymbolInputAdapter; import com.itsaky.androidide.editor.ui.IDEEditor; import com.itsaky.androidide.models.Symbol; import com.itsaky.androidide.utils.Symbols; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class SymbolInputView extends RecyclerView { diff --git a/app/src/main/java/com/itsaky/androidide/ui/transition/ArcMotionPlus.java b/app/src/main/java/com/itsaky/androidide/ui/transition/ArcMotionPlus.java index f5a55991c..c10a570ca 100755 --- a/app/src/main/java/com/itsaky/androidide/ui/transition/ArcMotionPlus.java +++ b/app/src/main/java/com/itsaky/androidide/ui/transition/ArcMotionPlus.java @@ -38,10 +38,10 @@ package com.itsaky.androidide.ui.transition; * * } */ + import android.content.Context; import android.graphics.Path; import android.util.AttributeSet; - import androidx.transition.PathMotion; public class ArcMotionPlus extends PathMotion { diff --git a/app/src/main/java/com/itsaky/androidide/ui/transition/ProgressTransition.java b/app/src/main/java/com/itsaky/androidide/ui/transition/ProgressTransition.java index b02f11ff4..37219b89e 100755 --- a/app/src/main/java/com/itsaky/androidide/ui/transition/ProgressTransition.java +++ b/app/src/main/java/com/itsaky/androidide/ui/transition/ProgressTransition.java @@ -22,10 +22,8 @@ import android.animation.ObjectAnimator; import android.util.Property; import android.view.ViewGroup; import android.widget.ProgressBar; - import androidx.transition.Transition; import androidx.transition.TransitionValues; - import com.itsaky.androidide.utils.IntProperty; public class ProgressTransition extends Transition { diff --git a/app/src/main/java/com/itsaky/androidide/utils/ApkInstallationSessionCallback.kt b/app/src/main/java/com/itsaky/androidide/utils/ApkInstallationSessionCallback.kt index 512827ef3..04affe6f3 100644 --- a/app/src/main/java/com/itsaky/androidide/utils/ApkInstallationSessionCallback.kt +++ b/app/src/main/java/com/itsaky/androidide/utils/ApkInstallationSessionCallback.kt @@ -20,17 +20,21 @@ package com.itsaky.androidide.utils import com.itsaky.androidide.R.string import com.itsaky.androidide.activities.editor.BaseEditorActivity import com.itsaky.androidide.ui.EditorBottomSheet +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class ApkInstallationSessionCallback(private var activity: BaseEditorActivity?) : SingleSessionCallback() { - private val log = ILogger.newInstance("InstallationSessionCallback") private var sessionId = -1 + companion object { + private val log = LoggerFactory.getLogger(ApkInstallationSessionCallback::class.java) + } + override fun onCreated(sessionId: Int) { this.sessionId = sessionId - log.debug("Created package installation session:", sessionId) + log.debug("Created package installation session: {}", sessionId) activity?._binding?.apply { bottomSheet.setActionText(activity!!.getString(string.msg_installing_apk)) bottomSheet.setActionProgress(0) @@ -65,7 +69,7 @@ class ApkInstallationSessionCallback(private var activity: BaseEditorActivity?) try { packageInstaller.abandonSession(info.sessionId) } catch (ex: Exception) { - log.error("Failed to abandon session ${info.sessionId} : ${ex.cause?.message ?: ex.message}") + log.error("Failed to abandon session {} : {}", info.sessionId, ex.cause?.message ?: ex.message) } } } diff --git a/app/src/main/java/com/itsaky/androidide/utils/ClassBuilder.kt b/app/src/main/java/com/itsaky/androidide/utils/ClassBuilder.kt index 6e8496561..e48b49dfc 100644 --- a/app/src/main/java/com/itsaky/androidide/utils/ClassBuilder.kt +++ b/app/src/main/java/com/itsaky/androidide/utils/ClassBuilder.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.utils import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import com.itsaky.androidide.preferences.internal.tabSize import com.itsaky.androidide.preferences.utils.indentationString import com.squareup.javapoet.JavaFile import com.squareup.javapoet.MethodSpec diff --git a/app/src/main/java/com/itsaky/androidide/utils/HighlightRangeHelper.java b/app/src/main/java/com/itsaky/androidide/utils/HighlightRangeHelper.java deleted file mode 100644 index 3718ec8a0..000000000 --- a/app/src/main/java/com/itsaky/androidide/utils/HighlightRangeHelper.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.utils; - -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.ANNOTATION; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.CONSTRUCTOR; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.ENUM; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.ENUM_TYPE; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.EXCEPTION_PARAMETER; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.FIELD; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.INSTANCE_INIT; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.INTERFACE; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.LOCAL_VARIABLE; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.METHOD_DECLARATION; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.METHOD_INVOCATION; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.PACKAGE_NAME; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.PARAMETER; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.RESOURCE_VARIABLE; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.STATIC_FIELD; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.STATIC_INIT; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.TYPE_NAME; -import static com.itsaky.androidide.lsp.models.HighlightTokenKind.TYPE_PARAMETER; - -import com.itsaky.androidide.lsp.models.HighlightToken; -import com.itsaky.androidide.lsp.models.HighlightTokenKind; -import com.itsaky.androidide.models.Position; - -import java.util.List; - -public class HighlightRangeHelper { - - private static final ILogger LOG = ILogger.newInstance("HighlightRangeHelper"); - private final List highlights; - - public HighlightRangeHelper(List highlights) { - this.highlights = highlights; - } - - public boolean isEnumType(int line, int column) { - return isOfKind(line, column, ENUM_TYPE); - } - - /** - * Check if the token at the given index has the given token kind. - * - * @param line The line to check. - * @param column The column to check. - * @param kind The kind to check. - * @return {@code true} if the token at the given position has the given kind, {@code false} - * otherwise. - */ - public boolean isOfKind(int line, int column, HighlightTokenKind kind) { - final var position = new Position(line, column); - int left = 0; - int right = this.highlights.size(); - int mid; - while (left < right) { - mid = (left + right) / 2; - var token = this.highlights.get(mid); - var range = token.getRange(); - var pos = range.getStart().compareTo(position); - if (pos < 0) { - left = mid + 1; - } else if (pos > 0) { - right = mid - 1; - } else { - return token.getKind() == kind; - } - } - return false; - } - - public boolean isAnnotationType(int line, int column) { - return isOfKind(line, column, ANNOTATION); - } - - public boolean isInterface(int line, int column) { - return isOfKind(line, column, INTERFACE); - } - - public boolean isEnum(int line, int column) { - return isOfKind(line, column, ENUM); - } - - public boolean isParameter(int line, int column) { - return isOfKind(line, column, PARAMETER); - } - - public boolean isExceptionParam(int line, int column) { - return isOfKind(line, column, EXCEPTION_PARAMETER); - } - - public boolean isConstructor(int line, int column) { - return isOfKind(line, column, CONSTRUCTOR); - } - - public boolean isStaticInit(int line, int column) { - return isOfKind(line, column, STATIC_INIT); - } - - public boolean isInstanceInit(int line, int column) { - return isOfKind(line, column, INSTANCE_INIT); - } - - public boolean isTypeParam(int line, int column) { - return isOfKind(line, column, TYPE_PARAMETER); - } - - public boolean isResourceVariable(int line, int column) { - return isOfKind(line, column, RESOURCE_VARIABLE); - } - - public boolean isPackageName(int line, int column) { - return isOfKind(line, column, PACKAGE_NAME); - } - - public boolean isClassName(int line, int column) { - return isOfKind(line, column, TYPE_NAME); - } - - public boolean isField(int line, int column) { - return isOfKind(line, column, FIELD); - } - - public boolean isStaticField(int line, int column) { - return isOfKind(line, column, STATIC_FIELD); - } - - public boolean isMethodDeclaration(int line, int column) { - return isOfKind(line, column, METHOD_DECLARATION); - } - - public boolean isMethodInvocation(int line, int column) { - return isOfKind(line, column, METHOD_INVOCATION); - } - - public boolean isLocal(int line, int column) { - return isOfKind(line, column, LOCAL_VARIABLE); - } -} diff --git a/app/src/main/java/com/itsaky/androidide/utils/InstallationResultHandler.kt b/app/src/main/java/com/itsaky/androidide/utils/InstallationResultHandler.kt index 32fca159e..551020bea 100644 --- a/app/src/main/java/com/itsaky/androidide/utils/InstallationResultHandler.kt +++ b/app/src/main/java/com/itsaky/androidide/utils/InstallationResultHandler.kt @@ -23,6 +23,7 @@ import android.content.Intent import android.content.IntentSender import android.content.pm.PackageInstaller import com.itsaky.androidide.services.InstallationResultReceiver +import org.slf4j.LoggerFactory /** * Handles result of APK installation. @@ -31,28 +32,28 @@ import com.itsaky.androidide.services.InstallationResultReceiver */ object InstallationResultHandler { - private val log = ILogger.newInstance("InstallationResultHandler") - private const val INSTALL_PACKAGE_REQ_CODE = 2304 private const val INSTALL_PACKAGE_ACTION = "com.itsaky.androidide.installer.INSTALL_PACKAGE" + private val log = LoggerFactory.getLogger(InstallationResultHandler::class.java) + @JvmStatic fun createEditorActivitySender(context: Context): IntentSender { val intent = Intent(context, InstallationResultReceiver::class.java) intent.action = INSTALL_PACKAGE_ACTION return PendingIntent.getBroadcast( - context, - INSTALL_PACKAGE_REQ_CODE, - intent, - PendingIntent.FLAG_UPDATE_CURRENT - ) + context, + INSTALL_PACKAGE_REQ_CODE, + intent, + PendingIntent.FLAG_UPDATE_CURRENT + ) .intentSender } @JvmStatic fun onResult(context: Context?, intent: Intent?): String? { if (context == null || intent == null || intent.action != INSTALL_PACKAGE_ACTION) { - log.warn("Invalid broadcast received", "action=${intent?.action}") + log.warn("Invalid broadcast received. action={}", intent?.action) return null } @@ -79,10 +80,12 @@ object InstallationResultHandler { } null } + PackageInstaller.STATUS_SUCCESS -> { log.info("Package installed successfully!") packageName } + PackageInstaller.STATUS_FAILURE, PackageInstaller.STATUS_FAILURE_ABORTED, PackageInstaller.STATUS_FAILURE_BLOCKED, @@ -90,11 +93,12 @@ object InstallationResultHandler { PackageInstaller.STATUS_FAILURE_INCOMPATIBLE, PackageInstaller.STATUS_FAILURE_INVALID, PackageInstaller.STATUS_FAILURE_STORAGE -> { - log.error("Package installation failed with status code", status, "and message:", message) + log.error("Package installation failed with status code {} and message {}", status, message) null } + else -> { - log.warn("Invalid status code received in broadcast:", status) + log.warn("Invalid status code received in broadcast: {}", status) null } } diff --git a/app/src/main/java/com/itsaky/androidide/utils/IntentUtils.kt b/app/src/main/java/com/itsaky/androidide/utils/IntentUtils.kt index ce3b12bb7..9728343d4 100644 --- a/app/src/main/java/com/itsaky/androidide/utils/IntentUtils.kt +++ b/app/src/main/java/com/itsaky/androidide/utils/IntentUtils.kt @@ -117,7 +117,7 @@ object IntentUtils { } catch (e: Throwable) { flashError(R.string.msg_app_launch_failed) if (logError) { - ILogger.instance().error("Failed to launch application with package name '$packageName'", e) + ILogger.ROOT.error("Failed to launch application with package name '{}'", packageName, e) } return false } @@ -138,7 +138,7 @@ object IntentUtils { } catch (e: Throwable) { flashError(R.string.msg_app_launch_failed) if (logError) { - ILogger.instance().error("Failed to launch app", e) + ILogger.ROOT.error("Failed to launch app", e) } false } diff --git a/app/src/main/java/com/itsaky/androidide/utils/JdkUtils.kt b/app/src/main/java/com/itsaky/androidide/utils/JdkUtils.kt index e8e6b9089..a47e706fd 100644 --- a/app/src/main/java/com/itsaky/androidide/utils/JdkUtils.kt +++ b/app/src/main/java/com/itsaky/androidide/utils/JdkUtils.kt @@ -23,6 +23,7 @@ import com.itsaky.androidide.app.IDEApplication import com.itsaky.androidide.models.JdkDistribution import com.itsaky.androidide.shell.executeProcessAsync import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment +import org.slf4j.LoggerFactory import java.io.File import java.nio.file.Files @@ -33,7 +34,7 @@ import java.nio.file.Files */ object JdkUtils { - private val log = ILogger.newInstance("JdkUtils") + private val log = LoggerFactory.getLogger(JdkUtils::class.java) /** * Finds the available JDK installations and returns the JAVA_HOME for each installation. @@ -65,7 +66,7 @@ object JdkUtils { return@mapNotNull getDistFromJavaBin(java) } ?: run { - log.error("Failed to list files in $optDir") + log.error("Failed to list files in {}", optDir) emptyList() } } @@ -92,12 +93,12 @@ object JdkUtils { fun getDistFromJavaBin(java: File): JdkDistribution? { if (!java.exists() || !java.isFile || !java.canExecute()) { log.error( - "Failed to lookup JDK installation. File '$java' does not exist or cannot be executed.") + "Failed to lookup JDK installation. File '{}' does not exist or cannot be executed.", java) return null } val properties = readProperties(java) ?: run { - log.error("Failed to retrieve Java properties from java binary: '$java'") + log.error("Failed to retrieve Java properties from java binary: '{}'", java) return null } @@ -107,7 +108,7 @@ object JdkUtils { @VisibleForTesting internal fun readDistFromProps(properties: String): JdkDistribution? { val javaHome = Regex("java\\.home\\s*=\\s*(.*)").find(properties)?.groupValues?.get(1) ?: run { - log.error("Failed to determine property 'java.home'. Properties:", properties) + log.error("Failed to determine property 'java.home'. Properties: {}", properties) return null } @@ -115,11 +116,11 @@ object JdkUtils { val javaVersion = Regex("java\\.version\\s*=\\s*(.*)").find(properties)?.groupValues?.get(1) ?: run { - log.error("Failed to determine property 'java.version'. Properties:", properties) + log.error("Failed to determine property 'java.version'. Properties: {}", properties) return null } - log.debug("Found java.version=${javaVersion}") + log.debug("Found java.version={}", javaVersion) return JdkDistribution(javaVersion, javaHome) } @@ -149,7 +150,8 @@ object JdkUtils { if (!canExecute(shell)) { log.warn( - "Unable to determine JDK installations. Command ${shell.absolutePath} not found or is not executable.") + "Unable to determine JDK installations. Command {} not found or is not executable.", + shell.absolutePath) return null } diff --git a/app/src/main/java/com/itsaky/androidide/utils/ProjectWriter.java b/app/src/main/java/com/itsaky/androidide/utils/ProjectWriter.java index cd090ea4b..de80a486e 100755 --- a/app/src/main/java/com/itsaky/androidide/utils/ProjectWriter.java +++ b/app/src/main/java/com/itsaky/androidide/utils/ProjectWriter.java @@ -21,15 +21,10 @@ import static java.lang.Character.isUpperCase; import static java.lang.Character.toLowerCase; import androidx.annotation.NonNull; - import com.blankj.utilcode.util.ResourceUtils; -import com.blankj.utilcode.util.ThreadUtils; -import com.itsaky.androidide.interfaces.ProjectWriterCallback; - import java.io.File; import java.util.regex.Matcher; import java.util.regex.Pattern; - import kotlin.text.StringsKt; public class ProjectWriter { diff --git a/app/src/main/java/com/itsaky/androidide/utils/RecursiveFileSearcher.java b/app/src/main/java/com/itsaky/androidide/utils/RecursiveFileSearcher.java index 8ef96798d..97f0a2a1a 100755 --- a/app/src/main/java/com/itsaky/androidide/utils/RecursiveFileSearcher.java +++ b/app/src/main/java/com/itsaky/androidide/utils/RecursiveFileSearcher.java @@ -25,7 +25,8 @@ import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; import com.itsaky.androidide.models.SearchResult; import com.itsaky.androidide.tasks.TaskExecutor; - +import io.github.rosemoe.sora.text.CharPosition; +import io.github.rosemoe.sora.text.Content; import java.io.File; import java.io.FileFilter; import java.util.ArrayList; @@ -36,9 +37,6 @@ import java.util.concurrent.Callable; import java.util.regex.Matcher; import java.util.regex.Pattern; -import io.github.rosemoe.sora.text.CharPosition; -import io.github.rosemoe.sora.text.Content; - /** * This class provides API to search in files recursively * @@ -46,15 +44,13 @@ import io.github.rosemoe.sora.text.Content; */ public class RecursiveFileSearcher { - private static final ILogger logger = ILogger.newInstance("RecursiveFileSearcher"); - /** * Search the given text in files recursively in given search directories * - * @param text Text to search - * @param exts Extentions of file to search. Maybe null. + * @param text Text to search + * @param exts Extentions of file to search. Maybe null. * @param searchDirs Directories to search in. Subdirectories will be included - * @param callback A listener that will listen to the search result + * @param callback A listener that will listen to the search result */ public static void searchRecursiveAsync( String text, List exts, List searchDirs, Callback callback) { @@ -97,9 +93,13 @@ public class RecursiveFileSearcher { FileUtils.listFilesInDirWithFilter(dir, new MultiFileFilter(exts), true); for (int j = 0; files != null && j < files.size(); j++) { final File file = files.get(j); - if (file.isDirectory()) continue; + if (file.isDirectory()) { + continue; + } final String text = FileIOUtils.readFile2String(file); - if (text == null || text.trim().isEmpty()) continue; + if (text == null || text.trim().isEmpty()) { + continue; + } final Content content = new Content(text); final List ranges = new ArrayList<>(); Matcher matcher = Pattern.compile(Pattern.quote(this.query)).matcher(text); @@ -157,6 +157,7 @@ public class RecursiveFileSearcher { } public static interface Callback { + void onResult(Map> results); } } diff --git a/app/src/main/java/com/itsaky/androidide/utils/TextWatcherAdapter.java b/app/src/main/java/com/itsaky/androidide/utils/TextWatcherAdapter.java index 81b7ca762..2554a0caa 100644 --- a/app/src/main/java/com/itsaky/androidide/utils/TextWatcherAdapter.java +++ b/app/src/main/java/com/itsaky/androidide/utils/TextWatcherAdapter.java @@ -19,7 +19,6 @@ package com.itsaky.androidide.utils; import android.text.Editable; import android.text.TextWatcher; - import androidx.annotation.NonNull; /** diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/BuildVariantsViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/BuildVariantsViewModel.kt index 78b8b915b..053509c72 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/BuildVariantsViewModel.kt +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/BuildVariantsViewModel.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import com.itsaky.androidide.projects.ProjectManagerImpl import com.itsaky.androidide.tooling.api.models.BuildVariantInfo /** diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt index c150f48b4..a3232c14d 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt @@ -254,7 +254,7 @@ class EditorViewModel : ViewModel() { fun handleOpenedFilesCacheJobCompletion(it: Job, operation: String) { it.invokeOnCompletion { err -> if (err != null) { - ILogger.instance().error("[EditorViewModel] Failed to $operation opened files cache", err) + ILogger.ROOT.error("[EditorViewModel] Failed to {} opened files cache", operation, err) } } } diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/EmptyStateFragmentViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/EmptyStateFragmentViewModel.kt index 9a57c21e7..9916ce463 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/EmptyStateFragmentViewModel.kt +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/EmptyStateFragmentViewModel.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import com.itsaky.androidide.R /** * @author Akash Yadav diff --git a/common/src/main/java/com/itsaky/androidide/adapters/SimpleIconTextAdapter.java b/common/src/main/java/com/itsaky/androidide/adapters/SimpleIconTextAdapter.java index 77339898d..e8b9b4e6d 100755 --- a/common/src/main/java/com/itsaky/androidide/adapters/SimpleIconTextAdapter.java +++ b/common/src/main/java/com/itsaky/androidide/adapters/SimpleIconTextAdapter.java @@ -18,9 +18,7 @@ package com.itsaky.androidide.adapters; import androidx.annotation.NonNull; - import com.itsaky.androidide.models.IconTextListItem; - import java.util.List; /** diff --git a/common/src/main/java/com/itsaky/androidide/app/BaseIDEActivity.kt b/common/src/main/java/com/itsaky/androidide/app/BaseIDEActivity.kt index 1baef1bfc..3fc31923e 100755 --- a/common/src/main/java/com/itsaky/androidide/app/BaseIDEActivity.kt +++ b/common/src/main/java/com/itsaky/androidide/app/BaseIDEActivity.kt @@ -21,10 +21,8 @@ import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.itsaky.androidide.common.R - import com.itsaky.androidide.tasks.cancelIfActive import com.itsaky.androidide.ui.themes.IThemeManager -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.resolveAttr import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -84,10 +82,4 @@ abstract class BaseIDEActivity : AppCompatActivity() { protected open fun preSetContentLayout() {} protected abstract fun bindLayout(): View - - companion object { - - const val REQCODE_STORAGE = 1009 - protected var LOG = ILogger.newInstance("StudioActivity") - } } diff --git a/common/src/main/java/com/itsaky/androidide/colorpicker/ColorPickerView.java b/common/src/main/java/com/itsaky/androidide/colorpicker/ColorPickerView.java index 266911fb5..02c16cbfa 100644 --- a/common/src/main/java/com/itsaky/androidide/colorpicker/ColorPickerView.java +++ b/common/src/main/java/com/itsaky/androidide/colorpicker/ColorPickerView.java @@ -31,15 +31,12 @@ import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.LinearLayout; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; - import com.google.android.material.slider.Slider; import com.itsaky.androidide.common.R; import com.itsaky.androidide.common.databinding.LayoutColorPickerBinding; -import com.itsaky.androidide.utils.ILogger; /** * A color picker view. @@ -48,7 +45,6 @@ import com.itsaky.androidide.utils.ILogger; */ public class ColorPickerView extends LinearLayout { - private static final ILogger LOG = ILogger.newInstance("ColorPickerView"); private final LayoutColorPickerBinding binding; private final int DEFAULT_COLOR; private int alpha; @@ -142,11 +138,14 @@ public class ColorPickerView extends LinearLayout { this.mPickListener = listener; } - /** A TextWatcher that is used to listen for text updates in the hex color input field. */ + /** + * A TextWatcher that is used to listen for text updates in the hex color input field. + */ private class ColorTextWatcher implements TextWatcher { @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) {} + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { @@ -160,8 +159,10 @@ public class ColorPickerView extends LinearLayout { } @Override - public void afterTextChanged(Editable s) {} + public void afterTextChanged(Editable s) { + } } + /** * Set the color value of this picker to the given hex color code. * @@ -182,11 +183,12 @@ public class ColorPickerView extends LinearLayout { /** * Called when the user picks a color using the 'Pick' button. * - * @param color The integer value of the color. + * @param color The integer value of the color. * @param hexCode The hex color code of the color. */ void onPick(int color, String hexCode); } + /** * Set the color value for this color picker. this will in turn update value of the sliders and * the color preview. @@ -217,7 +219,9 @@ public class ColorPickerView extends LinearLayout { return argb(alpha, red, green, blue); } - /** Call this method to update the preview of the current color. */ + /** + * Call this method to update the preview of the current color. + */ private void updatePreview() { this.binding.colorPreview.setBackgroundColor(getColor()); } diff --git a/common/src/main/java/com/itsaky/androidide/managers/ToolsManager.java b/common/src/main/java/com/itsaky/androidide/managers/ToolsManager.java index 8d25f0480..733955bc8 100755 --- a/common/src/main/java/com/itsaky/androidide/managers/ToolsManager.java +++ b/common/src/main/java/com/itsaky/androidide/managers/ToolsManager.java @@ -25,7 +25,6 @@ import com.itsaky.androidide.app.BaseApplication; import com.itsaky.androidide.app.configuration.IDEBuildConfigProvider; import com.itsaky.androidide.app.configuration.IJdkDistributionProvider; import com.itsaky.androidide.utils.Environment; -import com.itsaky.androidide.utils.ILogger; import java.io.File; import java.io.FileReader; import java.io.IOException; @@ -37,10 +36,12 @@ import java.util.concurrent.CompletableFuture; import kotlin.io.ConstantsKt; import kotlin.io.FilesKt; import org.jetbrains.annotations.Contract; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ToolsManager { - private static final ILogger LOG = ILogger.newInstance("ToolsManager"); + private static final Logger LOG = LoggerFactory.getLogger(ToolsManager.class); public static String COMMON_ASSET_DATA_DIR = "data/common"; @@ -136,7 +137,7 @@ public class ToolsManager { return version > fileVersion; } catch (Throwable err) { - LOG.error("Failed to read color scheme version for scheme '" + path + "'", err); + LOG.error("Failed to read color scheme version for scheme '{}'", path, err); return false; } } @@ -164,7 +165,7 @@ public class ToolsManager { private static void deleteIdeenv() { final var file = new File(Environment.BIN_DIR, "ideenv"); if (file.exists() && !file.delete()) { - LOG.warn("Unable to delete", file); + LOG.warn("Unable to delete file: {}", file); } } @@ -182,7 +183,7 @@ public class ToolsManager { if (sourceAapt2.exists() && sourceAapt2.isFile()) { FilesKt.copyTo(sourceAapt2, Environment.AAPT2, true, ConstantsKt.DEFAULT_BUFFER_SIZE); } else { - LOG.error(sourceAapt2 + " file does not exist! This can be problematic."); + LOG.error("{} file does not exist! This can be problematic.", sourceAapt2); } } diff --git a/common/src/main/java/com/itsaky/androidide/syntax/colorschemes/SchemeAndroidIDE.java b/common/src/main/java/com/itsaky/androidide/syntax/colorschemes/SchemeAndroidIDE.java index b2999fb3a..15cf1a4aa 100644 --- a/common/src/main/java/com/itsaky/androidide/syntax/colorschemes/SchemeAndroidIDE.java +++ b/common/src/main/java/com/itsaky/androidide/syntax/colorschemes/SchemeAndroidIDE.java @@ -19,7 +19,6 @@ package com.itsaky.androidide.syntax.colorschemes; import android.content.Context; import android.graphics.Color; - import io.github.rosemoe.sora.lang.styling.TextStyle; import io.github.rosemoe.sora.widget.schemes.EditorColorScheme; diff --git a/common/src/main/java/com/itsaky/androidide/syntax/highlighters/Highlighter.java b/common/src/main/java/com/itsaky/androidide/syntax/highlighters/Highlighter.java index 9a5506892..bca54fecb 100644 --- a/common/src/main/java/com/itsaky/androidide/syntax/highlighters/Highlighter.java +++ b/common/src/main/java/com/itsaky/androidide/syntax/highlighters/Highlighter.java @@ -20,7 +20,6 @@ package com.itsaky.androidide.syntax.highlighters; import android.text.SpannableStringBuilder; - import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE; /** diff --git a/common/src/main/java/com/itsaky/androidide/syntax/highlighters/JavaHighlighter.java b/common/src/main/java/com/itsaky/androidide/syntax/highlighters/JavaHighlighter.java index 463b49a94..410b93d49 100644 --- a/common/src/main/java/com/itsaky/androidide/syntax/highlighters/JavaHighlighter.java +++ b/common/src/main/java/com/itsaky/androidide/syntax/highlighters/JavaHighlighter.java @@ -19,18 +19,14 @@ package com.itsaky.androidide.syntax.highlighters; import android.text.SpannableStringBuilder; import android.text.style.BackgroundColorSpan; import android.text.style.ForegroundColorSpan; - import com.itsaky.androidide.lexers.java.JavaLexer; import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE; - -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.Token; - +import io.github.rosemoe.sora.widget.schemes.EditorColorScheme; import java.io.StringReader; import java.util.regex.Matcher; import java.util.regex.Pattern; - -import io.github.rosemoe.sora.widget.schemes.EditorColorScheme; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Token; public class JavaHighlighter implements Highlighter { diff --git a/common/src/main/java/com/itsaky/androidide/tasks/TaskExecutor.kt b/common/src/main/java/com/itsaky/androidide/tasks/TaskExecutor.kt index 320670dd2..f08b3bb90 100755 --- a/common/src/main/java/com/itsaky/androidide/tasks/TaskExecutor.kt +++ b/common/src/main/java/com/itsaky/androidide/tasks/TaskExecutor.kt @@ -20,13 +20,14 @@ import android.app.ProgressDialog import android.content.Context import com.blankj.utilcode.util.ThreadUtils import com.itsaky.androidide.common.R -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.util.concurrent.Callable import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletionException object TaskExecutor { - private val log = ILogger.newInstance("TaskExecutor") + + private val log = LoggerFactory.getLogger(TaskExecutor::class.java) @JvmOverloads @JvmStatic diff --git a/common/src/main/java/com/itsaky/androidide/ui/ContentTranslatingDrawerLayout.kt b/common/src/main/java/com/itsaky/androidide/ui/ContentTranslatingDrawerLayout.kt index b7c782921..c7d7cab6d 100644 --- a/common/src/main/java/com/itsaky/androidide/ui/ContentTranslatingDrawerLayout.kt +++ b/common/src/main/java/com/itsaky/androidide/ui/ContentTranslatingDrawerLayout.kt @@ -22,7 +22,6 @@ import android.util.AttributeSet import android.view.View import androidx.core.view.GravityCompat import androidx.drawerlayout.widget.DrawerLayout -import com.itsaky.androidide.utils.ILogger /** * A [DrawerLayout] that scales its content when navigation drawers are opened or closed. @@ -39,11 +38,6 @@ class ContentTranslatingDrawerLayout : InterceptableDrawerLayout { defStyleAttr: Int ) : super(context, attrs, defStyleAttr) - companion object { - - private val log = ILogger.newInstance("ContentTranslatingDrawerLayout") - } - /** * The ID of the child view which will be translated when the navigation views are expanded/collapsed. * diff --git a/common/src/main/java/com/itsaky/androidide/utils/AndroidUtils.java b/common/src/main/java/com/itsaky/androidide/utils/AndroidUtils.java index 5ebe7461a..3d5191f15 100644 --- a/common/src/main/java/com/itsaky/androidide/utils/AndroidUtils.java +++ b/common/src/main/java/com/itsaky/androidide/utils/AndroidUtils.java @@ -2,13 +2,11 @@ package com.itsaky.androidide.utils; import com.itsaky.androidide.app.BaseApplication; import com.itsaky.androidide.resources.R; - +import java.util.Locale; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Locale; - public class AndroidUtils { /** * The package is used to create a directory (eg: diff --git a/common/src/main/java/com/itsaky/androidide/utils/ApkInstaller.kt b/common/src/main/java/com/itsaky/androidide/utils/ApkInstaller.kt index 632f9320f..57263af2a 100644 --- a/common/src/main/java/com/itsaky/androidide/utils/ApkInstaller.kt +++ b/common/src/main/java/com/itsaky/androidide/utils/ApkInstaller.kt @@ -27,6 +27,7 @@ import android.content.pm.PackageInstaller.SessionCallback import android.text.TextUtils import androidx.core.content.FileProvider import com.itsaky.androidide.tasks.executeAsync +import org.slf4j.LoggerFactory import java.io.File import java.io.IOException @@ -37,7 +38,7 @@ import java.io.IOException */ object ApkInstaller { - private val log = ILogger.newInstance("ApkInstaller") + private val log = LoggerFactory.getLogger(ApkInstaller::class.java) private const val DEBUG_FALLBACK_INSTALLER = false /** @@ -51,11 +52,11 @@ object ApkInstaller { @JvmStatic fun installApk(context: Context, sender: IntentSender, apk: File, callback: SessionCallback) { if (!apk.exists() || !apk.isFile || apk.extension != "apk") { - log.error("File is not an APK:", apk) + log.error("File is not an APK: {}", apk) return } - log.info("Installing APK:", apk) + log.info("Installing APK: {}", apk) if (isMiui() || DEBUG_FALLBACK_INSTALLER) { log.warn( diff --git a/common/src/main/java/com/itsaky/androidide/utils/CharSequenceReader.java b/common/src/main/java/com/itsaky/androidide/utils/CharSequenceReader.java index 6f4c41798..c81a248dd 100644 --- a/common/src/main/java/com/itsaky/androidide/utils/CharSequenceReader.java +++ b/common/src/main/java/com/itsaky/androidide/utils/CharSequenceReader.java @@ -17,7 +17,6 @@ package com.itsaky.androidide.utils; import androidx.annotation.NonNull; - import java.io.Reader; import java.io.Serializable; import java.util.Objects; diff --git a/common/src/main/java/com/itsaky/androidide/utils/Environment.java b/common/src/main/java/com/itsaky/androidide/utils/Environment.java index f1204a46c..71121f1d3 100755 --- a/common/src/main/java/com/itsaky/androidide/utils/Environment.java +++ b/common/src/main/java/com/itsaky/androidide/utils/Environment.java @@ -19,10 +19,11 @@ package com.itsaky.androidide.utils; import android.annotation.SuppressLint; import androidx.annotation.NonNull; import com.blankj.utilcode.util.FileUtils; -import com.itsaky.androidide.syntax.highlighters.JavaHighlighter; import java.io.File; import java.util.Map; import java.util.UUID; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @SuppressLint("SdCardPath") public final class Environment { @@ -34,7 +35,7 @@ public final class Environment { public static final String DEFAULT_PREFIX = DEFAULT_ROOT + "/usr"; public static final String DEFAULT_JAVA_HOME = DEFAULT_PREFIX + "/opt/openjdk"; private static final String ANDROIDIDE_PROJECT_CACHE_DIR = ".androidide"; - private static final ILogger LOG = ILogger.newInstance("Environment"); + private static final Logger LOG = LoggerFactory.getLogger(Environment.class); public static File ROOT; public static File PREFIX; public static File HOME; diff --git a/common/src/main/java/com/itsaky/androidide/utils/FileUtil.java b/common/src/main/java/com/itsaky/androidide/utils/FileUtil.java index 6d8b6cedf..24299dcee 100755 --- a/common/src/main/java/com/itsaky/androidide/utils/FileUtil.java +++ b/common/src/main/java/com/itsaky/androidide/utils/FileUtil.java @@ -42,9 +42,7 @@ import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.text.TextUtils; - import androidx.annotation.NonNull; - import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/common/src/main/java/com/itsaky/androidide/utils/FlashbarActivityUtils.kt b/common/src/main/java/com/itsaky/androidide/utils/FlashbarActivityUtils.kt index 97bc54018..a983c2c9b 100644 --- a/common/src/main/java/com/itsaky/androidide/utils/FlashbarActivityUtils.kt +++ b/common/src/main/java/com/itsaky/androidide/utils/FlashbarActivityUtils.kt @@ -35,7 +35,6 @@ import com.itsaky.androidide.resources.R import com.itsaky.androidide.utils.FlashType.ERROR import com.itsaky.androidide.utils.FlashType.INFO import com.itsaky.androidide.utils.FlashType.SUCCESS -import java.util.function.Consumer const val DURATION_SHORT = 2000L const val DURATION_LONG = 3500L diff --git a/common/src/main/java/com/itsaky/androidide/utils/FlashbarUtils.kt b/common/src/main/java/com/itsaky/androidide/utils/FlashbarUtils.kt index 0ac666eb6..82f6ec47f 100644 --- a/common/src/main/java/com/itsaky/androidide/utils/FlashbarUtils.kt +++ b/common/src/main/java/com/itsaky/androidide/utils/FlashbarUtils.kt @@ -21,7 +21,6 @@ import android.app.Activity import androidx.annotation.StringRes import com.blankj.utilcode.util.ActivityUtils import com.itsaky.androidide.flashbar.Flashbar -import java.util.function.Consumer fun flashbarBuilder(): Flashbar.Builder? { return withActivity { flashbarBuilder() } @@ -70,7 +69,7 @@ fun flashProgress( private fun withActivity(action: Activity.() -> T?): T? { return ActivityUtils.getTopActivity()?.let { it.action() } ?: run { - ILogger.instance().warn("Cannot show flashbar message. Cannot get top activity.") + ILogger.ROOT.warn("Cannot show flashbar message. Cannot get top activity.") null } } diff --git a/common/src/main/java/com/itsaky/androidide/utils/LSPUtils.java b/common/src/main/java/com/itsaky/androidide/utils/LSPUtils.java index 7f69c4f80..9cabbf970 100755 --- a/common/src/main/java/com/itsaky/androidide/utils/LSPUtils.java +++ b/common/src/main/java/com/itsaky/androidide/utils/LSPUtils.java @@ -18,7 +18,6 @@ package com.itsaky.androidide.utils; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; - import java.util.Comparator; import java.util.List; diff --git a/common/src/main/java/com/itsaky/androidide/utils/ioUtils.kt b/common/src/main/java/com/itsaky/androidide/utils/ioUtils.kt index 68ad80571..bc706feb1 100644 --- a/common/src/main/java/com/itsaky/androidide/utils/ioUtils.kt +++ b/common/src/main/java/com/itsaky/androidide/utils/ioUtils.kt @@ -45,8 +45,6 @@ package com.itsaky.androidide.utils import java.io.IOException import java.io.InputStream import java.io.OutputStream -import java.lang.NullPointerException -import kotlin.jvm.Throws /** * Reads all bytes from this input stream and writes the bytes to the diff --git a/composite-builds/build-deps-common/desugaring-core/src/main/java/com/itsaky/androidide/desugaring/ch/qos/logback/core/util/DesugarEnvUtil.java b/composite-builds/build-deps-common/desugaring-core/src/main/java/com/itsaky/androidide/desugaring/ch/qos/logback/core/util/DesugarEnvUtil.java new file mode 100644 index 000000000..72168394c --- /dev/null +++ b/composite-builds/build-deps-common/desugaring-core/src/main/java/com/itsaky/androidide/desugaring/ch/qos/logback/core/util/DesugarEnvUtil.java @@ -0,0 +1,36 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.desugaring.ch.qos.logback.core.util; + +/** + * @author Akash Yadav + */ +public class DesugarEnvUtil { + + /** + *

Returns the current version of logback, or null if data is not + * available. + *

+ * + * @since 1.3.0 + * @return current version or null if missing version data + */ + static public String logbackVersion() { + return null; + } +} diff --git a/editor-api/src/main/java/com/itsaky/androidide/treesitter/api/tsUtils.kt b/editor-api/src/main/java/com/itsaky/androidide/treesitter/api/tsUtils.kt index ad0c2e106..bf98ada14 100644 --- a/editor-api/src/main/java/com/itsaky/androidide/treesitter/api/tsUtils.kt +++ b/editor-api/src/main/java/com/itsaky/androidide/treesitter/api/tsUtils.kt @@ -18,15 +18,14 @@ package com.itsaky.androidide.treesitter.api import com.itsaky.androidide.treesitter.TSNode -import com.itsaky.androidide.treesitter.TSParser import com.itsaky.androidide.treesitter.TSQuery import com.itsaky.androidide.treesitter.TSQueryCursor import com.itsaky.androidide.treesitter.TSQueryMatch import com.itsaky.androidide.treesitter.TSTree -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory @PublishedApi -internal val log = ILogger.newInstance("TsUtilsKt") +internal val log = LoggerFactory.getLogger("TsUtilsKt") /** * Safely create a query cursor and execute the given [TSQuery]. The given [action] will be called for @@ -45,18 +44,24 @@ inline fun TSQueryCursor.safeExecQueryCursor( debugName: String = "", debugLogging: Boolean = false, crossinline action: (TSQueryMatch) -> ResultT -) : ResultT? { - - log.isEnabled = debugLogging +): ResultT? { if (tree == null || !tree.canAccess()) { - log.debug("$debugName: Cannot execute query, tree is null or not accessible", "tree=$tree", "tree.canAccess=${tree?.canAccess()}") + if (debugLogging) { + log.debug("$debugName: Cannot execute query, tree is null or not accessible", "tree=$tree", + "tree.canAccess=${tree?.canAccess()}") + } return null } val rootNode = tree.rootNode if (!rootNode.canAccess() || rootNode.hasChanges()) { - log.debug("$debugName, Cannot execute query, tree's root node is not accessible or has been edited", "rootNode=$rootNode", "rootNode.canAccess=${rootNode.canAccess()}", "rootNode.hasChanges=${rootNode.canAccess() && rootNode.hasChanges()}") + if (debugLogging) { + log.debug( + "$debugName, Cannot execute query, tree's root node is not accessible or has been edited", + "rootNode=$rootNode", "rootNode.canAccess=${rootNode.canAccess()}", + "rootNode.hasChanges=${rootNode.canAccess() && rootNode.hasChanges()}") + } return null } @@ -66,7 +71,7 @@ inline fun TSQueryCursor.safeExecQueryCursor( recycleNodeAfterUse = recycleNodeAfterUse, matchCondition = { val result = tree.canAccess() && matchCondition(it) - if (!result) { + if (!result && debugLogging) { log.debug("$debugName: tree.canAccess=${tree.canAccess()}") } result @@ -96,14 +101,15 @@ inline fun TSQueryCursor.safeExecQueryCursor( debugName: String = "", debugLogging: Boolean = false, crossinline action: (TSQueryMatch) -> ResultT -) : ResultT? { +): ResultT? { return doSafeExecQueryCursor( query = query, node = node, recycleNodeAfterUse = recycleNodeAfterUse, matchCondition = { match -> - match != null && canAccess() && node.canAccess() && !node.hasChanges() && matchCondition(match) + match != null && canAccess() && node.canAccess() && !node.hasChanges() && matchCondition( + match) }, whileTrue = whileTrue, onClosedOrEdited = onClosedOrEdited, @@ -123,17 +129,21 @@ internal inline fun TSQueryCursor.doSafeExecQueryCursor( debugName: String = "", debugLogging: Boolean = false, crossinline action: (TSQueryMatch) -> ResultT -) : ResultT? { - - log.isEnabled = debugLogging +): ResultT? { if (!query.canAccess()) { - log.debug("$debugName: Cannot execute query, query is not accessible") + if (debugLogging) { + log.debug("$debugName: Cannot execute query, query is not accessible") + } return null } if (!node.canAccess() || node.hasChanges()) { - log.debug("$debugName: Cannot execute query, node is not accessible or has been edited", "node.canAccess=${node.canAccess()}", "node.hasChanges=${node.canAccess() && node.hasChanges()}") + if (debugLogging) { + log.debug("$debugName: Cannot execute query, node is not accessible or has been edited", + "node.canAccess=${node.canAccess()}", + "node.hasChanges=${node.canAccess() && node.hasChanges()}") + } return null } @@ -144,13 +154,15 @@ internal inline fun TSQueryCursor.doSafeExecQueryCursor( val result = action(match) if (!matchCondition(match)) { - log.debug( - "$debugName: Cannot proceed with query operation.", - "cursor.canAccess=${canAccess()}", - "query.canAccess=${query.canAccess()}", - "node.canAccess=${node.canAccess()}", - "node.hasChanges=${node.canAccess() && node.hasErrors()}" - ) + if (debugLogging) { + log.debug( + "$debugName: Cannot proceed with query operation.", + "cursor.canAccess=${canAccess()}", + "query.canAccess=${query.canAccess()}", + "node.canAccess=${node.canAccess()}", + "node.hasChanges=${node.canAccess() && node.hasErrors()}" + ) + } onClosedOrEdited() break } diff --git a/editor-treesitter/build.gradle.kts b/editor-treesitter/build.gradle.kts index 2661a69f0..c8f8525ff 100644 --- a/editor-treesitter/build.gradle.kts +++ b/editor-treesitter/build.gradle.kts @@ -34,7 +34,9 @@ android { dependencies { api(libs.common.editor) api(libs.common.kotlin.coroutines.android) - api(libs.androidide.ts) + api(libs.androidide.ts) { + isChanging = true + } api(libs.androidx.collection) api(projects.common) diff --git a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/LineSpansGenerator.kt b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/LineSpansGenerator.kt index cecf911ef..0a9393c4f 100644 --- a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/LineSpansGenerator.kt +++ b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/LineSpansGenerator.kt @@ -47,7 +47,6 @@ import com.itsaky.androidide.treesitter.TSQueryCursor import com.itsaky.androidide.treesitter.TSTree import com.itsaky.androidide.treesitter.api.TreeSitterQueryCapture import com.itsaky.androidide.treesitter.api.safeExecQueryCursor -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.editor.ts.spans.TsSpanFactory import io.github.rosemoe.sora.lang.styling.Span import io.github.rosemoe.sora.lang.styling.SpanFactory @@ -64,17 +63,14 @@ import io.github.rosemoe.sora.widget.schemes.EditorColorScheme * * @author Rosemoe */ -class LineSpansGenerator( - internal var tree: TSTree, internal var lineCount: Int, +class LineSpansGenerator(internal var tree: TSTree, internal var lineCount: Int, private val content: Content, internal var theme: TsTheme, private val languageSpec: TsLanguageSpec, var scopedVariables: TsScopedVariables, - private val spanFactory: TsSpanFactory -) : Spans { + private val spanFactory: TsSpanFactory) : Spans { companion object { const val CACHE_THRESHOLD = 60 - private val log = ILogger.newInstance("LineSpansGenerator") } private val caches = mutableListOf() @@ -115,19 +111,10 @@ class LineSpansGenerator( TSQueryCursor.create().use { cursor -> cursor.setByteRange(startIndex * 2, endIndex * 2) - cursor.safeExecQueryCursor( - query = languageSpec.tsQuery, - tree = tree, - recycleNodeAfterUse = true, - debugLogging = false, - debugName = "LineSpansGenerator.captureRegion()" - ) { match -> - if (languageSpec.queryPredicator.doPredicate( - languageSpec.predicates, - content, - match - ) - ) { + cursor.safeExecQueryCursor(query = languageSpec.tsQuery, tree = tree, + recycleNodeAfterUse = true, debugLogging = false, + debugName = "LineSpansGenerator.captureRegion()") { match -> + if (languageSpec.queryPredicator.doPredicate(languageSpec.predicates, content, match)) { captures.addAll(match.captures) } } @@ -141,27 +128,14 @@ class LineSpansGenerator( val start = (startByte / 2 - startIndex).coerceAtLeast(0) val pattern = capture.index // Do not add span for overlapping regions and out-of-bounds regions - if (start >= lastIndex && endByte / 2 >= startIndex && startByte / 2 < endIndex - && (pattern !in languageSpec.localsScopeIndices && pattern !in languageSpec.localsDefinitionIndices - && pattern !in languageSpec.localsDefinitionValueIndices && pattern !in languageSpec.localsMembersScopeIndices) - ) { + if (start >= lastIndex && endByte / 2 >= startIndex && startByte / 2 < endIndex && (pattern !in languageSpec.localsScopeIndices && pattern !in languageSpec.localsDefinitionIndices && pattern !in languageSpec.localsDefinitionValueIndices && pattern !in languageSpec.localsMembersScopeIndices)) { if (start != lastIndex) { - list.addAll( - createSpans( - capture, - lastIndex, - start - 1, - theme.normalTextStyle - ) - ) + list.addAll(createSpans(capture, lastIndex, start - 1, theme.normalTextStyle)) } var style = 0L if (capture.index in languageSpec.localsReferenceIndices) { - val def = scopedVariables.findDefinition( - startByte / 2, - endByte / 2, - content.substring(startByte / 2, endByte / 2) - ) + val def = scopedVariables.findDefinition(startByte / 2, endByte / 2, + content.substring(startByte / 2, endByte / 2)) if (def != null && def.matchedHighlightPattern != -1) { style = theme.resolveStyleForPattern(def.matchedHighlightPattern) } @@ -196,12 +170,8 @@ class LineSpansGenerator( return list } - private fun createSpans( - capture: TSQueryCapture, - startColumn: Int, - endColumn: Int, - style: Long - ): List { + private fun createSpans(capture: TSQueryCapture, startColumn: Int, endColumn: Int, + style: Long): List { val spans = spanFactory.createSpans(capture, startColumn, style) if (spans.size > 1) { var prevCol = spans[0].column diff --git a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsAnalyzeWorker.kt b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsAnalyzeWorker.kt index 0afc28505..b1c493cd9 100644 --- a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsAnalyzeWorker.kt +++ b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsAnalyzeWorker.kt @@ -25,7 +25,6 @@ import com.itsaky.androidide.treesitter.api.TreeSitterInputEdit import com.itsaky.androidide.treesitter.api.TreeSitterQueryCapture import com.itsaky.androidide.treesitter.api.safeExecQueryCursor import com.itsaky.androidide.treesitter.string.UTF16StringFactory -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.data.ObjectAllocator import io.github.rosemoe.sora.editor.ts.spans.TsSpanFactory import io.github.rosemoe.sora.lang.analysis.StyleReceiver @@ -40,7 +39,7 @@ import kotlinx.coroutines.cancel import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.newSingleThreadContext -import java.lang.RuntimeException +import org.slf4j.LoggerFactory import java.util.concurrent.CancellationException import java.util.concurrent.LinkedBlockingQueue @@ -58,7 +57,7 @@ internal class TsAnalyzeWorker( companion object { - private val log = ILogger.newInstance("TsAnalyzeWorker") + private val log = LoggerFactory.getLogger(TsAnalyzeWorker::class.java) } var stylesReceiver: StyleReceiver? = null @@ -151,7 +150,11 @@ internal class TsAnalyzeWorker( } else "" val pendingMsgs = messageChannel.size log.error( - "AnalyzeWorker[lang=$langName, message=${msgType}${msgTypeSuffix}], pendingMsgs=$pendingMsgs] crashed", + "AnalyzeWorker[lang={}, message={}{}], pendingMsgs={}] crashed", + langName, + msgType, + msgTypeSuffix, + pendingMsgs, err) } } diff --git a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsBracketPairs.kt b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsBracketPairs.kt index 98e2dd3df..1ae857456 100644 --- a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsBracketPairs.kt +++ b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsBracketPairs.kt @@ -28,7 +28,6 @@ import com.itsaky.androidide.treesitter.TSQueryCursor import com.itsaky.androidide.treesitter.TSTree import com.itsaky.androidide.treesitter.api.TreeSitterQueryCapture import com.itsaky.androidide.treesitter.api.safeExecQueryCursor -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.lang.brackets.BracketsProvider import io.github.rosemoe.sora.lang.brackets.PairedBracket import io.github.rosemoe.sora.text.Content @@ -39,18 +38,13 @@ class TsBracketPairs(private val tree: TSTree, private val languageSpec: TsLangu companion object { - private val log = ILogger.newInstance("TsBracketPairs") - val OPEN_NAME = "editor.brackets.open" val CLOSE_NAME = "editor.brackets.close" } override fun getPairedBracketAt(text: Content, index: Int): PairedBracket? { - if (!languageSpec.bracketsQuery.canAccess() - || languageSpec.bracketsQuery.patternCount <= 0 - || !tree.canAccess() - ) { + if (!languageSpec.bracketsQuery.canAccess() || languageSpec.bracketsQuery.patternCount <= 0 || !tree.canAccess()) { return null } @@ -59,13 +53,9 @@ class TsBracketPairs(private val tree: TSTree, private val languageSpec: TsLangu var matched = false - return@use cursor.safeExecQueryCursor( - query = languageSpec.bracketsQuery, - tree = tree, - recycleNodeAfterUse = true, - whileTrue = { !matched }, - debugName = "TsBracketPairs.getPairedBracketAt()" - ) { match -> + return@use cursor.safeExecQueryCursor(query = languageSpec.bracketsQuery, tree = tree, + recycleNodeAfterUse = true, whileTrue = { !matched }, + debugName = "TsBracketPairs.getPairedBracketAt()") { match -> if (!languageSpec.bracketsPredicator.doPredicate(languageSpec.predicates, text, match)) { return@safeExecQueryCursor null } @@ -100,8 +90,7 @@ class TsBracketPairs(private val tree: TSTree, private val languageSpec: TsLangu if (matched && positions.find { it == -1 } == null) { return@safeExecQueryCursor PairedBracket(startStartByte / 2, - (startEndByte - startStartByte) / 2, endStartByte / 2, - (endEndByte - endStartByte) / 2) + (startEndByte - startStartByte) / 2, endStartByte / 2, (endEndByte - endStartByte) / 2) } return@safeExecQueryCursor null diff --git a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsLanguageSpec.kt b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsLanguageSpec.kt index 124331f5d..6de34daaa 100644 --- a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsLanguageSpec.kt +++ b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsLanguageSpec.kt @@ -126,7 +126,7 @@ open class TsLanguageSpec( } } if (!tsQuery.canAccess()) { - throw IllegalArgumentException("Syntax highlights query is invalid") + throw IllegalArgumentException("Syntax highlights query is invalid, errOffset=" + tsQuery.errorOffset + ", errType=" + tsQuery.errorType) } if (tsQuery.errorType != TSQueryError.None) { val region = if (tsQuery.errorOffset < highlightScmOffset) "locals" else "highlight" diff --git a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsScopedVariables.kt b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsScopedVariables.kt index f9477b393..6e4d25842 100644 --- a/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsScopedVariables.kt +++ b/editor-treesitter/src/main/java/io/github/rosemoe/sora/editor/ts/TsScopedVariables.kt @@ -32,12 +32,11 @@ import com.itsaky.androidide.treesitter.api.TreeSitterNode import com.itsaky.androidide.treesitter.api.TreeSitterQueryCapture import com.itsaky.androidide.treesitter.api.safeExecQueryCursor import com.itsaky.androidide.treesitter.string.UTF16String -import com.itsaky.androidide.utils.ILogger import java.util.Stack private typealias TSNodeIndices = Pair -private fun TSNode.indices() : TSNodeIndices { +private fun TSNode.indices(): TSNodeIndices { return startByte to endByte } @@ -54,11 +53,6 @@ class TsScopedVariables(tree: TSTree, text: UTF16String, val spec: TsLanguageSpe private val rootScope: Scope - companion object { - - private val log = ILogger.newInstance("TsScopedVariables") - } - init { val rootNode = tree.rootNode var needsWalk = true diff --git a/editor/src/main/assets/editor/treesitter/log/highlights.scm b/editor/src/main/assets/editor/treesitter/log/highlights.scm index 3fbda2ebf..18bd54456 100644 --- a/editor/src/main/assets/editor/treesitter/log/highlights.scm +++ b/editor/src/main/assets/editor/treesitter/log/highlights.scm @@ -56,36 +56,51 @@ ) (ide_log_line - (ide_tag) @err.tag + (date) @err.date + (time) @err.time (priority) @err.priority + (thread_name) @err.thread_name + (tag) @err.tag (message) @err.msg - (#match? @err.priority "E") + (#match? @err.priority "ERROR") ) (ide_log_line - (ide_tag) @warn.tag + (date) @warn.date + (time) @warn.time (priority) @warn.priority + (thread_name) @warn.thread_name + (tag) @warn.tag (message) @warn.msg - (#match? @warn.priority "W") + (#match? @warn.priority "WARN") ) (ide_log_line - (ide_tag) @info.tag + (date) @info.date + (time) @info.time (priority) @info.priority + (thread_name) @info.thread_name + (tag) @info.tag (message) @info.msg - (#match? @info.priority "I") + (#match? @info.priority "INFO") ) (ide_log_line - (ide_tag) @debug.tag + (date) @debug.date + (time) @debug.time (priority) @debug.priority + (thread_name) @debug.thread_name + (tag) @debug.tag (message) @debug.msg - (#match? @debug.priority "D") + (#match? @debug.priority "DEBUG") ) (ide_log_line - (ide_tag) @verbose.tag + (date) @verbose.date + (time) @verbose.time (priority) @verbose.priority + (thread_name) @verbose.thread_name + (tag) @verbose.tag (message) @verbose.msg - (#match? @verbose.priority "V") -) \ No newline at end of file + (#match? @verbose.priority "TRACE") +) diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/CommonCompletionProvider.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/CommonCompletionProvider.kt index 4ca5e650a..d78c15386 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/CommonCompletionProvider.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/CommonCompletionProvider.kt @@ -25,10 +25,10 @@ import com.itsaky.androidide.lsp.models.FailureType.COMPLETION import com.itsaky.androidide.lsp.models.LSPFailure import com.itsaky.androidide.lsp.util.setupLookupForCompletion import com.itsaky.androidide.models.Position -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.lang.completion.CompletionCancelledException import io.github.rosemoe.sora.text.CharPosition import io.github.rosemoe.sora.text.ContentReference +import org.slf4j.LoggerFactory import java.nio.file.Path import java.util.concurrent.CancellationException @@ -45,7 +45,7 @@ internal class CommonCompletionProvider( companion object { - private val log = ILogger.newInstance("CommonCompletionProvider") + private val log = LoggerFactory.getLogger(CommonCompletionProvider::class.java) } /** diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/IDELanguage.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/IDELanguage.kt index 11ae8ad74..6ff9b660f 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/IDELanguage.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/IDELanguage.kt @@ -24,13 +24,13 @@ import com.itsaky.androidide.lsp.api.ILanguageServer import com.itsaky.androidide.preferences.internal.tabSize import com.itsaky.androidide.preferences.internal.useSoftTab import com.itsaky.androidide.progress.ICancelChecker -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.lang.Language import io.github.rosemoe.sora.lang.completion.CompletionCancelledException import io.github.rosemoe.sora.lang.completion.CompletionPublisher import io.github.rosemoe.sora.lang.format.Formatter import io.github.rosemoe.sora.text.CharPosition import io.github.rosemoe.sora.text.ContentReference +import org.slf4j.LoggerFactory import java.nio.file.Paths /** @@ -76,13 +76,14 @@ abstract class IDELanguage : Language { val server = languageServer ?: return val path = extraArguments.getString(IEditor.KEY_FILE, null) if (path == null) { - LOG.warn("Cannot provide completions. No file provided.") + log.warn("Cannot provide completions. No file provided.") return } val completionProvider = CommonCompletionProvider(server, cancelChecker) val file = Paths.get(path) - val completionItems = completionProvider.complete(content, file, position) { checkIsCompletionChar(it) } + val completionItems = completionProvider.complete(content, file, + position) { checkIsCompletionChar(it) } publisher.setUpdateThreshold(1) (publisher as IDECompletionPublisher).addLSPItems(completionItems) } @@ -116,6 +117,6 @@ abstract class IDELanguage : Language { companion object { - private val LOG = ILogger.newInstance("IDELanguage") + private val log = LoggerFactory.getLogger(IDELanguage::class.java) } } \ No newline at end of file diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/LSPFormatter.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/LSPFormatter.kt index d9e359d21..2269751fe 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/LSPFormatter.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/LSPFormatter.kt @@ -22,7 +22,6 @@ import com.itsaky.androidide.lsp.models.CodeFormatResult import com.itsaky.androidide.lsp.models.FormatCodeParams import com.itsaky.androidide.models.Position import com.itsaky.androidide.models.Range -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.lang.format.AsyncFormatter import io.github.rosemoe.sora.text.CharPosition import io.github.rosemoe.sora.text.Content diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/cpp/CppAnalyzer.java b/editor/src/main/java/com/itsaky/androidide/editor/language/cpp/CppAnalyzer.java index 8d3e79bff..ca6e0012c 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/cpp/CppAnalyzer.java +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/cpp/CppAnalyzer.java @@ -26,31 +26,25 @@ import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.forKeyw import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.forString; import static io.github.rosemoe.sora.lang.styling.TextStyle.makeStyle; -import com.itsaky.androidide.editor.language.incremental.IncrementalToken; import com.itsaky.androidide.editor.language.incremental.BaseIncrementalAnalyzeManager; +import com.itsaky.androidide.editor.language.incremental.IncrementalToken; import com.itsaky.androidide.editor.language.incremental.LineState; import com.itsaky.androidide.lexers.cpp.CPP14Lexer; -import com.itsaky.androidide.utils.ILogger; - -import java.lang.Override; +import io.github.rosemoe.sora.lang.styling.Span; import java.util.ArrayList; import java.util.List; -import io.github.rosemoe.sora.lang.styling.Span; - public class CppAnalyzer extends BaseIncrementalAnalyzeManager { - private static final ILogger LOG = ILogger.newInstance("CppAnalyzer"); - public CppAnalyzer() { super(CPP14Lexer.class); } @Override protected int[][] getMultilineTokenStartEndTypes() { - final var start = new int[] {CPP14Lexer.Div, CPP14Lexer.Star}; - final var end = new int[] {CPP14Lexer.Star, CPP14Lexer.Div}; - return new int[][] {start, end}; + final var start = new int[]{CPP14Lexer.Div, CPP14Lexer.Star}; + final var end = new int[]{CPP14Lexer.Star, CPP14Lexer.Div}; + return new int[][]{start, end}; } @Override @@ -228,6 +222,6 @@ public class CppAnalyzer extends BaseIncrementalAnalyzeManager { @Override protected int[] getCodeBlockTokens() { - return new int[] {CPP14Lexer.LeftBrace, CPP14Lexer.RightBrace}; + return new int[]{CPP14Lexer.LeftBrace, CPP14Lexer.RightBrace}; } } diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/cpp/CppLanguage.java b/editor/src/main/java/com/itsaky/androidide/editor/language/cpp/CppLanguage.java index 4650d9bb0..9ffd1a4f5 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/cpp/CppLanguage.java +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/cpp/CppLanguage.java @@ -22,7 +22,6 @@ import com.itsaky.androidide.editor.language.IDELanguage; import com.itsaky.androidide.editor.language.newline.BracketsNewlineHandler; import com.itsaky.androidide.editor.language.utils.CommonSymbolPairs; import com.itsaky.androidide.lexers.cpp.CPP14Lexer; -import com.itsaky.androidide.utils.ILogger; import io.github.rosemoe.sora.lang.analysis.AnalyzeManager; import io.github.rosemoe.sora.lang.completion.CompletionCancelledException; import io.github.rosemoe.sora.lang.completion.CompletionPublisher; @@ -33,12 +32,14 @@ import io.github.rosemoe.sora.widget.SymbolPairMatch; import java.io.StringReader; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.Token; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class CppLanguage extends IDELanguage { - private static final ILogger LOG = ILogger.newInstance("CppLanguage"); + private static final Logger LOG = LoggerFactory.getLogger(CppLanguage.class); private final NewlineHandler[] newlineHandlers = - new NewlineHandler[] {new BracketsNewlineHandler(this::getIndentAdvance, this::useTab)}; + new NewlineHandler[]{new BracketsNewlineHandler(this::getIndentAdvance, this::useTab)}; private final CommonSymbolPairs symbolPairs = new CommonSymbolPairs(); private CppAnalyzer analyzer; diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/groovy/GroovyLanguage.java b/editor/src/main/java/com/itsaky/androidide/editor/language/groovy/GroovyLanguage.java index 2ed7a7b28..5fac2e17a 100755 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/groovy/GroovyLanguage.java +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/groovy/GroovyLanguage.java @@ -23,7 +23,6 @@ import com.itsaky.androidide.editor.language.newline.BracketsNewlineHandler; import com.itsaky.androidide.editor.language.utils.CommonSymbolPairs; import com.itsaky.androidide.lexers.groovy.GroovyLexer; import com.itsaky.androidide.utils.CharSequenceReader; -import com.itsaky.androidide.utils.ILogger; import io.github.rosemoe.sora.lang.analysis.AnalyzeManager; import io.github.rosemoe.sora.lang.completion.CompletionCancelledException; import io.github.rosemoe.sora.lang.completion.CompletionPublisher; @@ -34,10 +33,12 @@ import io.github.rosemoe.sora.widget.SymbolPairMatch; import java.io.StringReader; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.Token; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class GroovyLanguage extends IDELanguage { - private static final ILogger LOG = ILogger.newInstance("GroovyLanguage"); + private static final Logger LOG = LoggerFactory.getLogger(GroovyLanguage.class); private final GroovyAnalyzer analyzer; private final GroovyAutoComplete completer; private final NewlineHandler[] newlineHandlers = diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/newline/TSBracketsHandler.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/newline/TSBracketsHandler.kt index 84752fd98..535f808d9 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/newline/TSBracketsHandler.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/newline/TSBracketsHandler.kt @@ -22,7 +22,6 @@ import io.github.rosemoe.sora.lang.smartEnter.NewlineHandleResult import io.github.rosemoe.sora.lang.styling.Styles import io.github.rosemoe.sora.text.CharPosition import io.github.rosemoe.sora.text.Content -import io.github.rosemoe.sora.text.ContentReference import io.github.rosemoe.sora.text.TextUtils /** diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/KotlinLanguage.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/KotlinLanguage.kt index e526b42ce..4bb0fe547 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/KotlinLanguage.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/KotlinLanguage.kt @@ -20,7 +20,6 @@ package com.itsaky.androidide.editor.language.treesitter import android.content.Context import com.itsaky.androidide.editor.language.treesitter.TreeSitterLanguage.Factory import com.itsaky.androidide.treesitter.kotlin.TSLanguageKotlin -import com.itsaky.androidide.utils.withStopWatch import io.github.rosemoe.sora.lang.Language.INTERRUPTION_LEVEL_STRONG /** diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt index 29687b9ed..599f10406 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterLanguage.kt @@ -30,7 +30,6 @@ import com.itsaky.androidide.treesitter.TSParser import com.itsaky.androidide.treesitter.TSQueryCapture import com.itsaky.androidide.treesitter.TSQueryCursor import com.itsaky.androidide.treesitter.TSQueryMatch -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.editor.ts.TsTheme import io.github.rosemoe.sora.lang.Language.INTERRUPTION_LEVEL_STRONG import io.github.rosemoe.sora.lang.analysis.AnalyzeManager diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterSpanFactory.kt b/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterSpanFactory.kt index 37459248a..65b90e788 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterSpanFactory.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/treesitter/TreeSitterSpanFactory.kt @@ -22,18 +22,16 @@ import androidx.core.graphics.ColorUtils import com.itsaky.androidide.editor.schemes.LanguageScheme import com.itsaky.androidide.treesitter.TSQuery import com.itsaky.androidide.treesitter.TSQueryCapture -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.parseHexColor import io.github.rosemoe.sora.editor.ts.spans.DefaultSpanFactory import io.github.rosemoe.sora.editor.ts.spans.TsSpanFactory import io.github.rosemoe.sora.lang.styling.Span import io.github.rosemoe.sora.lang.styling.SpanFactory import io.github.rosemoe.sora.lang.styling.Styles -import io.github.rosemoe.sora.lang.styling.span.SpanColorResolver import io.github.rosemoe.sora.lang.styling.span.SpanConstColorResolver -import io.github.rosemoe.sora.lang.styling.span.SpanExt import io.github.rosemoe.sora.lang.styling.span.SpanExtAttrs import io.github.rosemoe.sora.text.ContentReference +import org.slf4j.LoggerFactory /** * [TsSpanFactory] for tree sitter languages. @@ -49,7 +47,7 @@ class TreeSitterSpanFactory( companion object { - private val log = ILogger.newInstance("TreeSitterSpanFactory") + private val log = LoggerFactory.getLogger(TreeSitterSpanFactory::class.java) @JvmStatic private val HEX_REGEX = "#\\b([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})\\b".toRegex() @@ -103,7 +101,7 @@ class TreeSitterSpanFactory( val color = try { parseHexColor(result.groupValues[1]).toInt() } catch (e: Exception) { - log.error("An error occurred parsing hex color. text=$text", e) + log.error("An error occurred parsing hex color. text={}", text, e) return@forEach } diff --git a/editor/src/main/java/com/itsaky/androidide/editor/schemes/IDEColorSchemeProvider.kt b/editor/src/main/java/com/itsaky/androidide/editor/schemes/IDEColorSchemeProvider.kt index 7c219204d..e72ad0bea 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/schemes/IDEColorSchemeProvider.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/schemes/IDEColorSchemeProvider.kt @@ -24,13 +24,13 @@ import com.itsaky.androidide.preferences.internal.DEFAULT_COLOR_SCHEME import com.itsaky.androidide.preferences.internal.colorScheme import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.isSystemInDarkMode import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus +import org.slf4j.LoggerFactory import java.io.File import java.io.FileFilter import java.util.Properties @@ -40,7 +40,7 @@ import kotlin.coroutines.CoroutineContext /** @author Akash Yadav */ object IDEColorSchemeProvider { - private val log = ILogger.newInstance("IDEColorSchemeProvider") + private val log = LoggerFactory.getLogger(IDEColorSchemeProvider::class.java) private val schemesDir = File(Environment.ANDROIDIDE_UI, "editor/schemes") private val schemes = ConcurrentHashMap() @@ -99,7 +99,7 @@ object IDEColorSchemeProvider { scheme.darkVariant?.load() scheme } catch (err: Exception) { - log.error("An error occurred while loading color scheme '$colorScheme'", err) + log.error("An error occurred while loading color scheme '{}'", colorScheme, err) null } } @@ -126,7 +126,7 @@ object IDEColorSchemeProvider { Properties().apply { load(reader) } } } catch (err: Exception) { - log.error("Failed to read properties for scheme '${schemeDir.name}'") + log.error("Failed to read properties for scheme '{}'", schemeDir.name) continue } @@ -143,7 +143,7 @@ object IDEColorSchemeProvider { } if (version <= 0) { - log.warn("Version code of color scheme '$schemeDir' must be set to >= 1") + log.warn("Version code of color scheme '{}' must be set to >= 1", schemeDir) } if (file.isBlank()) { @@ -258,7 +258,7 @@ object IDEColorSchemeProvider { return currentScheme?.let { scheme -> return@let if (scheme.getLanguageScheme(type) == null) { - log.warn("Color scheme '${scheme.name}' does not support '$type'") + log.warn("Color scheme '{}' does not support '{}'", scheme.name, type) log.warn("Falling back to default color scheme") null } else { diff --git a/editor/src/main/java/com/itsaky/androidide/editor/schemes/LanguageSpecProvider.kt b/editor/src/main/java/com/itsaky/androidide/editor/schemes/LanguageSpecProvider.kt index 91ac64b77..79aadfe4f 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/schemes/LanguageSpecProvider.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/schemes/LanguageSpecProvider.kt @@ -25,9 +25,9 @@ import com.itsaky.androidide.editor.language.treesitter.predicates.MatchPredicat import com.itsaky.androidide.editor.language.treesitter.predicates.NotEqualPredicate import com.itsaky.androidide.editor.language.treesitter.predicates.NotMatchPredicate import com.itsaky.androidide.treesitter.TSLanguage -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.editor.ts.LocalsCaptureSpec import io.github.rosemoe.sora.editor.ts.TsLanguageSpec +import org.slf4j.LoggerFactory import java.io.FileNotFoundException /** @@ -38,7 +38,7 @@ import java.io.FileNotFoundException object LanguageSpecProvider { private const val BASE_SPEC_PATH = "editor/treesitter" - private val log = ILogger.newInstance("LanguageSpecProvider") + private val log = LoggerFactory.getLogger(LanguageSpecProvider::class.java) @JvmStatic @JvmOverloads @@ -57,13 +57,13 @@ object LanguageSpecProvider { bracketsScmSource = readScheme(context, type, "brackets"), localsCaptureSpec = localsCaptureSpec, predicates = - listOf( - MatchPredicate, - NotMatchPredicate, - EqualPredicate, - NotEqualPredicate, - AnyOfPredicate - ) + listOf( + MatchPredicate, + NotMatchPredicate, + EqualPredicate, + NotEqualPredicate, + AnyOfPredicate + ) ) return TreeSitterLanguageSpec( spec = editorLangSpec, @@ -77,7 +77,7 @@ object LanguageSpecProvider { } catch (e: Exception) { if (e !is FileNotFoundException) { // log everything except FileNotFoundException - log.error("Failed to read scheme file $name for type $type", e) + log.error("Failed to read scheme file {} for type {}", name, type, e) } "" } diff --git a/editor/src/main/java/com/itsaky/androidide/editor/schemes/LocalCaptureSpecProvider.kt b/editor/src/main/java/com/itsaky/androidide/editor/schemes/LocalCaptureSpecProvider.kt index 14db526bc..d9e9c4915 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/schemes/LocalCaptureSpecProvider.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/schemes/LocalCaptureSpecProvider.kt @@ -17,8 +17,8 @@ package com.itsaky.androidide.editor.schemes -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.editor.ts.LocalsCaptureSpec +import org.slf4j.LoggerFactory /** * Provides local @@ -27,7 +27,7 @@ import io.github.rosemoe.sora.editor.ts.LocalsCaptureSpec */ object LocalCaptureSpecProvider { - private val log = ILogger.newInstance("LocalCaptureSpecProvider") + private val log = LoggerFactory.getLogger(LocalCaptureSpecProvider::class.java) @JvmStatic fun newLocalCaptureSpec(type: String): LocalsCaptureSpec { @@ -35,9 +35,7 @@ object LocalCaptureSpecProvider { IDEColorSchemeProvider.getColorSchemeForType(type)?.languages?.get(type) ?: run { log.error( - "Cannot create LocalsCaptureSpec", - "Failed to load current color scheme.", - "Falling back to default implementation" + "Cannot create LocalsCaptureSpec. Failed to load current color scheme. Falling back to default implementation" ) return LocalsCaptureSpec.DEFAULT } @@ -46,7 +44,7 @@ object LocalCaptureSpecProvider { override fun isDefinitionCapture(captureName: String): Boolean { return lang.isLocalDef(captureName) } - + override fun isDefinitionValueCapture(captureName: String): Boolean { return lang.isLocalDefVal(captureName) } @@ -54,11 +52,11 @@ object LocalCaptureSpecProvider { override fun isReferenceCapture(captureName: String): Boolean { return lang.isLocalRef(captureName) } - + override fun isScopeCapture(captureName: String): Boolean { return lang.isLocalScope(captureName) } - + override fun isMembersScopeCapture(captureName: String): Boolean { return lang.isMembersScope(captureName) } diff --git a/editor/src/main/java/com/itsaky/androidide/editor/schemes/internal/parser/EditorSchemeParser.kt b/editor/src/main/java/com/itsaky/androidide/editor/schemes/internal/parser/EditorSchemeParser.kt index 008e7a805..49b830d9a 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/schemes/internal/parser/EditorSchemeParser.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/schemes/internal/parser/EditorSchemeParser.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.editor.schemes.internal.parser -import androidx.core.util.set import com.google.gson.stream.JsonReader import com.itsaky.androidide.editor.schemes.IDEColorScheme import com.itsaky.androidide.editor.schemes.internal.parser.SchemeParser.EditorColors diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/AbstractPopupWindow.kt b/editor/src/main/java/com/itsaky/androidide/editor/ui/AbstractPopupWindow.kt index de204033c..89cc0f613 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/AbstractPopupWindow.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/AbstractPopupWindow.kt @@ -17,9 +17,9 @@ package com.itsaky.androidide.editor.ui -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.widget.CodeEditor import io.github.rosemoe.sora.widget.base.EditorPopupWindow +import org.slf4j.LoggerFactory /** * Abstract class for all [IDEEditor] popup windows. @@ -30,13 +30,15 @@ abstract class AbstractPopupWindow(editor: CodeEditor, features: Int) : EditorPopupWindow(editor, features) { companion object { - private val log = ILogger.newInstance("AbstractPopupWindow") + + private val log = LoggerFactory.getLogger(AbstractPopupWindow::class.java) } override fun show() { (editor as? IDEEditor)?.ensureWindowsDismissed() if (!editor.isAttachedToWindow) { - log.error("Trying to show popup window '${javaClass.name}' when editor is not attached to window") + log.error("Trying to show popup window '{}' when editor is not attached to window", + javaClass.name) return } diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorActionsMenu.kt b/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorActionsMenu.kt index 2771dc95b..0a3326184 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorActionsMenu.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorActionsMenu.kt @@ -43,7 +43,7 @@ import com.itsaky.androidide.actions.ActionsRegistry import com.itsaky.androidide.actions.ActionsRegistry.Companion.getInstance import com.itsaky.androidide.actions.EditorActionItem import com.itsaky.androidide.actions.FillMenuParams -import com.itsaky.androidide.editor.R.* +import com.itsaky.androidide.editor.R.layout import com.itsaky.androidide.editor.databinding.LayoutPopupMenuItemBinding import com.itsaky.androidide.editor.ui.EditorActionsMenu.ActionsListAdapter.VH import com.itsaky.androidide.lsp.api.ILanguageServerRegistry diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorCompletionWindow.kt b/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorCompletionWindow.kt index 3b2f898d9..39896ad08 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorCompletionWindow.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorCompletionWindow.kt @@ -22,11 +22,11 @@ import android.net.Uri import android.widget.ListView import com.itsaky.androidide.lsp.util.DocumentationReferenceProvider import com.itsaky.androidide.progress.ProgressManager -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.KeyboardUtils import io.github.rosemoe.sora.lang.completion.CompletionItem import io.github.rosemoe.sora.widget.component.CompletionLayout import io.github.rosemoe.sora.widget.component.EditorAutoCompletion +import org.slf4j.LoggerFactory import java.lang.ref.WeakReference import kotlin.math.min @@ -39,7 +39,11 @@ class EditorCompletionWindow(val editor: IDEEditor) : EditorAutoCompletion(edito private var listView: ListView? = null private val items: MutableList = mutableListOf() - private val log = ILogger.newInstance(javaClass.simpleName) + + companion object { + + private val log = LoggerFactory.getLogger(EditorCompletionWindow::class.java) + } init { setLayout(EditorCompletionLayout()) @@ -80,7 +84,7 @@ class EditorCompletionWindow(val editor: IDEEditor) : EditorAutoCompletion(edito return try { super.select(pos) } catch (e: Throwable) { - log.warn("Unable to select completion item at $pos", e) + log.warn("Unable to select completion item at {}", pos, e) false } } @@ -153,8 +157,8 @@ class EditorCompletionWindow(val editor: IDEEditor) : EditorAutoCompletion(edito } if (adapter!!.count >= 1 - && KeyboardUtils.isHardKeyboardConnected(context) - ) { + && KeyboardUtils.isHardKeyboardConnected(context) + ) { currentSelection = 0 } }, diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorEventDispatcher.kt b/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorEventDispatcher.kt index 74730c994..e2a8b4a9d 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorEventDispatcher.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorEventDispatcher.kt @@ -26,7 +26,6 @@ import com.itsaky.androidide.eventbus.events.editor.DocumentSelectedEvent import com.itsaky.androidide.projects.FileManager.onDocumentClose import com.itsaky.androidide.projects.FileManager.onDocumentContentChange import com.itsaky.androidide.projects.FileManager.onDocumentOpen -import com.itsaky.androidide.utils.ILogger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -34,6 +33,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus +import org.slf4j.LoggerFactory import java.util.concurrent.CancellationException import java.util.concurrent.LinkedBlockingQueue @@ -51,7 +51,7 @@ class EditorEventDispatcher( companion object { - private val log = ILogger.newInstance("EditorEventDispatcher") + private val log = LoggerFactory.getLogger(EditorEventDispatcher::class.java) } fun init(scope: CoroutineScope) { diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorFeatures.kt b/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorFeatures.kt index 2bc2a4d09..b2440d115 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorFeatures.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/EditorFeatures.kt @@ -46,7 +46,7 @@ class EditorFeatures( override fun setSelection(start: Position, end: Position) { withEditor { if (!isValidPosition(start, true) || !isValidPosition(end, true)) { - log.warn("Invalid selection range: start=$start end=$end") + log.warn("Invalid selection range: start={} end={}", start, end) return@withEditor } diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.kt b/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.kt index 852c40819..724eb295f 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.kt @@ -72,7 +72,6 @@ import com.itsaky.androidide.tasks.JobCancelChecker import com.itsaky.androidide.tasks.cancelIfActive import com.itsaky.androidide.tasks.launchAsyncWithProgress import com.itsaky.androidide.utils.DocumentUtils -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import io.github.rosemoe.sora.event.ContentChangeEvent import io.github.rosemoe.sora.event.SelectionChangeEvent @@ -95,6 +94,7 @@ import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.slf4j.LoggerFactory import java.io.File /** @@ -177,7 +177,7 @@ open class IDEEditor @JvmOverloads constructor(context: Context, attrs: Attribut private const val SELECTION_CHANGE_DELAY = 500L - internal val log = ILogger.newInstance("IDEEditor") + internal val log = LoggerFactory.getLogger(IDEEditor::class.java) /** * Create input type flags for the editor. @@ -596,7 +596,7 @@ open class IDEEditor @JvmOverloads constructor(context: Context, attrs: Attribut language.setupWith(finalScheme) if (finalScheme.getLanguageScheme(type) == null) { - log.warn("Color scheme does not support file type '$type'") + log.warn("Color scheme does not support file type '{}'", type) finalScheme = SchemeAndroidIDE.newInstance(context) } } @@ -626,7 +626,7 @@ open class IDEEditor @JvmOverloads constructor(context: Context, attrs: Attribut }.also { job -> job.invokeOnCompletion { err -> if (err != null) { - log.error("Failed to setup tree sitter language for file: $file", err) + log.error("Failed to setup tree sitter language for file: {}", file, err) } setupTsLanguageJob = null @@ -888,7 +888,7 @@ open class IDEEditor @JvmOverloads constructor(context: Context, attrs: Attribut } } - private inline fun safeGet(name: String, action: () -> T) : T? { + private inline fun safeGet(name: String, action: () -> T): T? { return try { action() } catch (err: Throwable) { @@ -897,16 +897,16 @@ open class IDEEditor @JvmOverloads constructor(context: Context, attrs: Attribut } } - private fun Job.logError(action: String) : Job = apply { + private fun Job.logError(action: String): Job = apply { invokeOnCompletion { err -> logError(err, action) } } private fun logError(err: Throwable?, action: String) { err ?: return if (CancelChecker.isCancelled(err)) { - log.warn("$action has been cancelled") + log.warn("{} has been cancelled", action) } else { - log.error("$action failed") + log.error("{} failed", action) } } } \ No newline at end of file diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/ReplaceAction.kt b/editor/src/main/java/com/itsaky/androidide/editor/ui/ReplaceAction.kt index 594383bbb..320009fc2 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/ReplaceAction.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/ReplaceAction.kt @@ -21,7 +21,7 @@ import android.view.LayoutInflater import com.itsaky.androidide.editor.databinding.LayoutEditorFindReplaceBinding import com.itsaky.androidide.resources.R import com.itsaky.androidide.utils.DialogUtils -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory /** * Handles the replace action while searching in file. @@ -30,7 +30,7 @@ import com.itsaky.androidide.utils.ILogger */ object ReplaceAction { - private val log = ILogger.newInstance("ReplaceAction") + private val log = LoggerFactory.getLogger(ReplaceAction::class.java) @JvmStatic fun doReplace(editor: IDEEditor) { diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/SignatureHelpWindow.java b/editor/src/main/java/com/itsaky/androidide/editor/ui/SignatureHelpWindow.java index c86179e61..2e0ac610f 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/SignatureHelpWindow.java +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/SignatureHelpWindow.java @@ -25,10 +25,11 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.itsaky.androidide.lsp.models.SignatureHelp; import com.itsaky.androidide.lsp.models.SignatureInformation; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.utils.ResourceUtilsKt; import io.github.rosemoe.sora.event.SelectionChangeEvent; import io.github.rosemoe.sora.widget.base.EditorPopupWindow; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * An {@link EditorPopupWindow} used to show signature help. @@ -37,7 +38,7 @@ import io.github.rosemoe.sora.widget.base.EditorPopupWindow; */ public class SignatureHelpWindow extends BaseEditorWindow { - private static final ILogger LOG = ILogger.newInstance("SignatureHelpWindow"); + private static final Logger LOG = LoggerFactory.getLogger(SignatureHelpWindow.class); /** * Create a signature help popup window for editor @@ -48,12 +49,12 @@ public class SignatureHelpWindow extends BaseEditorWindow { super(editor); editor.subscribeEvent( - SelectionChangeEvent.class, - (event, unsubscribe) -> { - if (isShowing()) { - dismiss(); - } - }); + SelectionChangeEvent.class, + (event, unsubscribe) -> { + if (isShowing()) { + dismiss(); + } + }); } public void setupAndDisplay(SignatureHelp signature) { @@ -83,29 +84,26 @@ public class SignatureHelpWindow extends BaseEditorWindow { final SpannableStringBuilder sb = new SpannableStringBuilder(); if (activeSignature < 0 || activeParameter < 0) { - LOG.debug("activeSignature:", activeSignature, "activeParameter:", activeParameter); + LOG.debug("activeSignature: {}, activeParameter: {}", activeSignature, activeParameter); return null; } var count = signatures.size(); if (activeSignature >= count) { - LOG.debug("Active signature is invalid", "Size is " + count); + LOG.debug("Active signature is invalid. Size is {}", count); return null; } // remove all with non-applicable signatures signatures.removeIf( - info -> { - final var remove = activeParameter >= info.getParameters().size(); - if (remove) { - LOG.debug( - "Removing", - info, - "params=" + info.getParameters().size(), - "active=" + activeParameter); - } - return remove; - }); + info -> { + final var remove = activeParameter >= info.getParameters().size(); + if (remove) { + LOG.debug("Removing {} params={} active={}", info, info.getParameters().size(), + activeParameter); + } + return remove; + }); count = signatures.size(); for (var i = 0; i < count; i++) { @@ -127,22 +125,22 @@ public class SignatureHelpWindow extends BaseEditorWindow { * @param result The builder to append spanned text to. */ private void formatSignature( - @NonNull SignatureInformation signature, - int paramIndex, - SpannableStringBuilder result) { + @NonNull SignatureInformation signature, + int paramIndex, + SpannableStringBuilder result) { String name = signature.getLabel(); name = name.substring(0, name.indexOf("(")); final var foreground = ResourceUtilsKt.resolveAttr(getEditor().getContext(), - attr.colorOnSecondaryContainer); + attr.colorOnSecondaryContainer); final var paramSelected = 0xffff6060; final var operators = 0xff4fc3f7; result.append( - name, new ForegroundColorSpan(foreground), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); + name, new ForegroundColorSpan(foreground), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); result.append( - "(", new ForegroundColorSpan(operators), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); + "(", new ForegroundColorSpan(operators), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); var params = signature.getParameters(); for (int i = 0; i < params.size(); i++) { @@ -150,22 +148,22 @@ public class SignatureHelpWindow extends BaseEditorWindow { final var info = params.get(i); if (i == params.size() - 1) { result.append( - info.getLabel() + "", - new ForegroundColorSpan(color), - SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); + info.getLabel(), + new ForegroundColorSpan(color), + SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); } else { result.append( - info.getLabel() + "", - new ForegroundColorSpan(color), - SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); + info.getLabel(), + new ForegroundColorSpan(color), + SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); result.append( - ",", - new ForegroundColorSpan(operators), - SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); + ",", + new ForegroundColorSpan(operators), + SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); result.append(" "); } } result.append( - ")", new ForegroundColorSpan(0xff4fc3f7), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); + ")", new ForegroundColorSpan(0xff4fc3f7), SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE); } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ccccf3c5b..c2be524a5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ gradle-tooling = "8.6" junit-jupiter = "5.10.2" kotlin = "1.9.22" kotlin-coroutines = "1.8.0" -tree-sitter = "4.0.1" +tree-sitter = "4.2.0" editor = "0.23.4" glide = "4.16.0" androidx-vectordrawable = "1.1.0" @@ -17,6 +17,7 @@ androidx-espresso = "3.5.1" retrofit = "2.9.0" markwon = "4.6.2" maven-publish-plugin = "0.27.0" +logback = "1.5.3" [libraries] @@ -118,6 +119,9 @@ aapt2-annotations = { module = "com.android.tools:annotations", version = "31.2. aapt2-jb-annotations = { module = "org.jetbrains:annotations", version = "24.1.0" } aapt2-proto = { module = "com.android.tools.build:aapt2-proto", version = "8.3.0-10880808" } +logging-logback-core = { module = "ch.qos.logback:logback-core", version.ref = "logback" } +logging-logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback" } + # XML xml-xercesImpl = { module = "xerces:xercesImpl", version = "2.12.2" } xml-apis = { module = "xml-apis:xml-apis", version = "2.0.2" } diff --git a/idestats/src/main/java/com/itsaky/androidide/stats/StatUploadWorker.kt b/idestats/src/main/java/com/itsaky/androidide/stats/StatUploadWorker.kt index a631306fd..e4d0ea182 100644 --- a/idestats/src/main/java/com/itsaky/androidide/stats/StatUploadWorker.kt +++ b/idestats/src/main/java/com/itsaky/androidide/stats/StatUploadWorker.kt @@ -20,7 +20,7 @@ package com.itsaky.androidide.stats import android.content.Context import androidx.work.Worker import androidx.work.WorkerParameters -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @@ -44,12 +44,12 @@ class StatUploadWorker(context: Context, workerParams: WorkerParameters) : Worke const val KEY_APP_VERSION = "app_version" const val KEY_APP_CPU_ARCH = "app_cpu_arch" - private val log = ILogger.newInstance("StatUploadWorker") + private val log = LoggerFactory.getLogger(StatUploadWorker::class.java) } override fun doWork(): Result { val data = StatData.fromInputData(inputData = inputData) - log.debug("Uploading stats: $data") + log.debug("Uploading stats: {}", data) val retrofit = Retrofit.Builder().baseUrl(STAT_UPLOAD_BASE_URL) .addConverterFactory(GsonConverterFactory.create()).build() @@ -65,20 +65,19 @@ class StatUploadWorker(context: Context, workerParams: WorkerParameters) : Worke val body = response.body() if (!response.isSuccessful || body == null) { log.error( - "Stat upload failed: responseCode: ${response.code()}, responseBody: $body, errBody: ${ - response.errorBody()?.string() ?: "(empty)" - }") + "Stat upload failed: responseCode: {}, responseBody: {}, errBody: {}", response.code(), + body, response.errorBody()?.string() ?: "(empty)") // try again next time return Result.failure() } if (body.status != 200) { - log.error("Stat upload failed: response: $body") + log.error("Stat upload failed: response: {}", body) return Result.failure() } - log.info("Stat upload successful: $body") + log.info("Stat upload successful: {}", body) return Result.success() } } \ No newline at end of file diff --git a/logger/build.gradle.kts b/logger/build.gradle.kts index e1ad0c56c..f4c7fe488 100644 --- a/logger/build.gradle.kts +++ b/logger/build.gradle.kts @@ -25,7 +25,12 @@ description = "AndroidIDE Logging Framework" dependencies { compileOnly(projects.subprojects.frameworkStubs) - + + api(libs.logging.logback.core) + api(libs.logging.logback.classic) + + implementation(projects.buildInfo) + testImplementation(libs.tests.junit) testImplementation(libs.tests.google.truth) } \ No newline at end of file diff --git a/logger/src/main/java/com/itsaky/androidide/utils/AndroidLogger.java b/logger/src/main/java/com/itsaky/androidide/logging/JvmStdErrAppender.java similarity index 52% rename from logger/src/main/java/com/itsaky/androidide/utils/AndroidLogger.java rename to logger/src/main/java/com/itsaky/androidide/logging/JvmStdErrAppender.java index c4c13d4cd..e76184eb5 100644 --- a/logger/src/main/java/com/itsaky/androidide/utils/AndroidLogger.java +++ b/logger/src/main/java/com/itsaky/androidide/logging/JvmStdErrAppender.java @@ -1,54 +1,43 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.utils; - -import android.util.Log; - -/** - * {@link ILogger} implementation for the Android Runtime (ART). - * - * @author Akash Yadav - */ -public class AndroidLogger extends ILogger { - - protected AndroidLogger(String tag) { - super(tag); - } - - @Override - protected void doLog(Level level, String message) { - switch (level) { - case ERROR: - Log.e(TAG, message); - break; - case WARNING: - Log.w(TAG, message); - break; - case VERBOSE: - Log.v(TAG, message); - break; - case INFO: - Log.i(TAG, message); - break; - case DEBUG: - default: - Log.d(TAG, message); - break; - } - } -} +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.logging; + +import com.itsaky.androidide.logging.utils.LogUtils; + +/** + * @author Akash Yadav + */ +public class JvmStdErrAppender extends StdErrAppender { + + public static final String PROP_JVM_STDERR_APPENDER_ENABLED = "ide.logging.jvmStdErrAppenderEnabled"; + + private boolean isJvm = false; // JvmStdErrAppender is disabled by default + + @Override + public void start() { + this.isJvm = LogUtils.isJvm(); + super.start(); + } + + @Override + public boolean isStarted() { + return super.isStarted() + && isJvm + && Boolean.parseBoolean(System.getProperty(PROP_JVM_STDERR_APPENDER_ENABLED, "true")); + } +} diff --git a/logger/src/main/java/com/itsaky/androidide/logging/LogcatAppender.java b/logger/src/main/java/com/itsaky/androidide/logging/LogcatAppender.java new file mode 100644 index 000000000..267b04c7f --- /dev/null +++ b/logger/src/main/java/com/itsaky/androidide/logging/LogcatAppender.java @@ -0,0 +1,175 @@ +/** + * Copyright 2019 Anthony Trinh + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package com.itsaky.androidide.logging; + +import android.util.Log; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.UnsynchronizedAppenderBase; +import com.itsaky.androidide.logging.utils.LogUtils; + +/** + * An appender that wraps the native Android logging mechanism (logcat); redirects all + * logging requests to logcat + *

+ * Note:
+ * By default, this appender pushes all messages to logcat regardless of logcat's own + * filter settings (i.e., everything is printed). To disable this behavior and enable + * filter-checking, use {@link #setCheckLoggable(boolean)}. See the Android Developer Guide for + * details on adjusting the logcat filter. + *

+ * + * @author Fred Eisele + * @author Anthony Trinh + * @see ADB + * Filtering Output + */ +public class LogcatAppender extends UnsynchronizedAppenderBase { + + private PatternLayoutEncoder encoder = null; + private boolean checkLoggable = false; + + // AndroidIDE Changed: Appender is enabled only when running on Android. + private boolean isAndroid = false; + // AndroidIDE Changed + + /** + * Checks that required parameters are set, and if everything is in order, activates this + * appender. + */ + @Override + public void start() { + this.isAndroid = !LogUtils.isJvm(); + + if (!isAndroid) { + addInfo("Appender [" + name + "] is not running on Android. Skipping init."); + return; + } + + if ((this.encoder == null) || (this.encoder.getLayout() == null)) { + addError("No layout set for the appender named [" + name + "]."); + return; + } + + super.start(); + } + + @Override + public boolean isStarted() { + return super.isStarted() && isAndroid; + } + + /** + * Writes an event to Android's logging mechanism (logcat) + * + * @param event the event to be logged + */ + @Override + public void append(ILoggingEvent event) { + + if (!isStarted()) { + return; + } + + // format tag based on encoder layout; truncate if max length + // exceeded (only necessary for isLoggable(), which throws + // IllegalArgumentException) + + String tag = LogUtils.processLogTag(event.getLoggerName()); + + switch (event.getLevel().levelInt) { + case Level.ALL_INT: + case Level.TRACE_INT: + if (!checkLoggable || Log.isLoggable(tag, Log.VERBOSE)) { + Log.v(tag, this.encoder.getLayout().doLayout(event)); + } + break; + + case Level.DEBUG_INT: + if (!checkLoggable || Log.isLoggable(tag, Log.DEBUG)) { + Log.d(tag, this.encoder.getLayout().doLayout(event)); + } + break; + + case Level.INFO_INT: + if (!checkLoggable || Log.isLoggable(tag, Log.INFO)) { + Log.i(tag, this.encoder.getLayout().doLayout(event)); + } + break; + + case Level.WARN_INT: + if (!checkLoggable || Log.isLoggable(tag, Log.WARN)) { + Log.w(tag, this.encoder.getLayout().doLayout(event)); + } + break; + + case Level.ERROR_INT: + if (!checkLoggable || Log.isLoggable(tag, Log.ERROR)) { + Log.e(tag, this.encoder.getLayout().doLayout(event)); + } + break; + + case Level.OFF_INT: + default: + break; + } + } + + /** + * Gets the pattern-layout encoder for this appender's logcat message + * + * @return the pattern-layout encoder + */ + public PatternLayoutEncoder getEncoder() { + return this.encoder; + } + + /** + * Sets the pattern-layout encoder for this appender's logcat message + * + * @param encoder the pattern-layout encoder + */ + public void setEncoder(PatternLayoutEncoder encoder) { + this.encoder = encoder; + } + + /** + * Sets whether to ask Android before logging a message with a specific tag and priority (i.e., + * calls {@code android.util.Log.html#isLoggable}). + *

+ * See Log#isLoggable(java.lang.String, + * int) + * + * @param enable {@code true} to enable; {@code false} to disable + */ + public void setCheckLoggable(boolean enable) { + this.checkLoggable = enable; + } + + /** + * Gets the enable status of the isLoggable()-check that is called before logging + *

+ * Log#isLoggable(java.lang.String, + * int) + * + * @return {@code true} if enabled; {@code false} otherwise + */ + public boolean getCheckLoggable() { + return this.checkLoggable; + } + +} \ No newline at end of file diff --git a/logger/src/main/java/com/itsaky/androidide/logging/StdErrAppender.java b/logger/src/main/java/com/itsaky/androidide/logging/StdErrAppender.java new file mode 100644 index 000000000..27eca8b2f --- /dev/null +++ b/logger/src/main/java/com/itsaky/androidide/logging/StdErrAppender.java @@ -0,0 +1,80 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.logging; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.UnsynchronizedAppenderBase; +import ch.qos.logback.core.encoder.Encoder; +import com.itsaky.androidide.logging.encoder.ThreadTimeEncoder; +import java.io.IOException; +import java.util.Objects; + +/** + * @author Akash Yadav + */ +public class StdErrAppender extends UnsynchronizedAppenderBase { + + private Encoder encoder = null; + + @Override + public void start() { + if (encoder == null) { + addWarn("No encoder set for the appender named [" + name + + "]. Falling back to ThreadTimeEncoder."); + encoder = new ThreadTimeEncoder(); + } + + super.start(); + } + + @Override + protected void append(ILoggingEvent eventObject) { + if (!isStarted()) { + return; + } + + Objects.requireNonNull(encoder, "Encoder must not be null"); + byte[] bytes = encoder.encode(eventObject); + try { + System.err.write(bytes); + } catch (IOException e) { + addError("Failed to write to stderr", e); + } + } + + /** + * Set the encoder for this appender. + * + * @param encoder The encoder. + */ + public void setEncoder( + Encoder encoder + ) { + this.encoder = encoder; + } + + + /** + * Get the encoder for this appender. + * + * @return The encoder. + */ + public Encoder getEncoder() { + return encoder; + } +} diff --git a/logger/src/test/java/com/itsaky/androidide/utils/LoggerTest.java b/logger/src/main/java/com/itsaky/androidide/logging/encoder/IDELogFormatEncoder.java similarity index 59% rename from logger/src/test/java/com/itsaky/androidide/utils/LoggerTest.java rename to logger/src/main/java/com/itsaky/androidide/logging/encoder/IDELogFormatEncoder.java index d2705fd23..1132d97bf 100644 --- a/logger/src/test/java/com/itsaky/androidide/utils/LoggerTest.java +++ b/logger/src/main/java/com/itsaky/androidide/logging/encoder/IDELogFormatEncoder.java @@ -1,37 +1,36 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.utils; - -import static com.google.common.truth.Truth.assertThat; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** - * @author Akash Yadav - */ -@RunWith(JUnit4.class) -public class LoggerTest { - @Test - public void testLoggerInstance() { - final var log = ILogger.newInstance("LoggerTest"); - log.debug("Logger.newInstance() on JVM returns:", log.getClass().getName()); - assertThat(log).isInstanceOf(JvmLogger.class); - } -} +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.logging.encoder; + +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; + +/** + * Encoder to format the log events in AndroidIDE. + * + * @author Akash Yadav + */ +public class IDELogFormatEncoder extends PatternLayoutEncoder { + + private static final String LOG_PATTERN = "%date %-5level [%thread] %logger{0}: %msg%n"; + + public IDELogFormatEncoder() { + super(); + setPattern(LOG_PATTERN); + setOutputPatternAsHeader(true); + } +} diff --git a/logger/src/main/java/com/itsaky/androidide/logging/encoder/ThreadTimeEncoder.java b/logger/src/main/java/com/itsaky/androidide/logging/encoder/ThreadTimeEncoder.java new file mode 100644 index 000000000..4e37b550d --- /dev/null +++ b/logger/src/main/java/com/itsaky/androidide/logging/encoder/ThreadTimeEncoder.java @@ -0,0 +1,86 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.logging.encoder; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.encoder.EncoderBase; +import com.itsaky.androidide.logging.utils.LogUtils; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * Encoder to format the log events similar to logcat -v threadtime. + * + * @author Akash Yadav + */ +public class ThreadTimeEncoder extends EncoderBase { + + @Override + public byte[] headerBytes() { + return new byte[0]; + } + + @Override + public byte[] encode(ILoggingEvent event) { + final var sb = new StringBuilder(); + final var date = new SimpleDateFormat("dd-MM HH:mm:ss.SSS", Locale.ROOT).format( + new Date(event.getTimeStamp())); + var tag = event.getLoggerName(); + if (tag.length() > LogUtils.MAX_TAG_LENGTH) { + tag = tag.substring(0, LogUtils.MAX_TAG_LENGTH - 1) + "*"; + } + + sb.append(date); + sb.append(' '); + sb.append(String.format(Locale.ROOT, "%5d", pid())); + sb.append(' '); + sb.append(String.format(Locale.ROOT, "%5d", tid())); + sb.append(' '); + sb.append(event.getLevel().levelStr.charAt(0)); + sb.append(' '); + sb.append(tag); + sb.append(": "); + sb.append(event.getFormattedMessage()); + + return sb.toString().getBytes(StandardCharsets.UTF_8); + } + + @Override + public byte[] footerBytes() { + return new byte[0]; + } + + private long tid() { + if (LogUtils.isJvm()) { + return Thread.currentThread().getId(); + } + + return android.os.Process.myTid(); + } + + private long pid() { + if (LogUtils.isJvm()) { + // no public API to get process ID in Java + return -1; + } + + return android.os.Process.myUid(); + } +} diff --git a/logger/src/main/java/com/itsaky/androidide/utils/JvmLogger.java b/logger/src/main/java/com/itsaky/androidide/logging/utils/LogUtils.java similarity index 50% rename from logger/src/main/java/com/itsaky/androidide/utils/JvmLogger.java rename to logger/src/main/java/com/itsaky/androidide/logging/utils/LogUtils.java index 2da4ecaa5..d7141c10b 100644 --- a/logger/src/main/java/com/itsaky/androidide/utils/JvmLogger.java +++ b/logger/src/main/java/com/itsaky/androidide/logging/utils/LogUtils.java @@ -1,53 +1,54 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.utils; - -import static com.itsaky.androidide.utils.LogTagUtils.trimTagIfNeeded; - -/** - * {@link ILogger} implementation for the JVM. - * - * @author Akash Yadav - */ -public class JvmLogger extends ILogger { - - public static LogInterceptor interceptor; - - protected JvmLogger(String tag) { - super(tag); - } - - @Override - protected void doLog(Level level, String message) { - if (interceptor != null) { - interceptor.onLog(level, TAG, message); - } else { - System.err.printf( - "%-25s %-2s %s%n", - trimTagIfNeeded(TAG, 25), - level.levelChar, - message - ); - } - } - - public interface LogInterceptor { - - void onLog(Level level, String tag, String message); - } -} +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.logging.utils; + +/** + * @author Akash Yadav + */ +public class LogUtils { + + public static boolean isJvm() { + try { + // If we're in a testing environment + Class.forName("org.junit.runners.JUnit4"); + return true; + } catch (ClassNotFoundException e) { + // ignored + } + + try { + Class.forName("android.content.Context"); + return false; + } catch (ClassNotFoundException e) { + return true; + } + } + + public static final int MAX_TAG_LENGTH = 23; + public static String processLogTag(String tag) { + if (tag == null) { + return null; + } + + if (tag.length() > MAX_TAG_LENGTH) { + return tag.substring(0, MAX_TAG_LENGTH - 1) + "*"; + } + + return tag; + } +} diff --git a/logger/src/main/java/com/itsaky/androidide/utils/ILogger.java b/logger/src/main/java/com/itsaky/androidide/utils/ILogger.java index dc6f9a815..bba3d3d7f 100644 --- a/logger/src/main/java/com/itsaky/androidide/utils/ILogger.java +++ b/logger/src/main/java/com/itsaky/androidide/utils/ILogger.java @@ -36,11 +36,11 @@ package com.itsaky.androidide.utils; import static com.itsaky.androidide.utils.LogUtils.preProcessLogTag; -import java.util.ArrayList; -import java.util.List; +import com.itsaky.androidide.buildinfo.BuildInfo; import java.util.Map; -import java.util.Objects; import java.util.WeakHashMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Logger for the IDE. @@ -52,11 +52,9 @@ import java.util.WeakHashMap; */ public abstract class ILogger { - public static final String DEFAULT_TAG = "AndroidIDE"; - public static final String MSG_SEPARATOR = " "; // Separate messages with a space. + public static final Logger ROOT = LoggerFactory.getLogger(BuildInfo.PACKAGE_NAME); - private static final List logListeners = new ArrayList<>(); - private static final Map cachedLoggers = new WeakHashMap<>(); + public static final String MSG_SEPARATOR = " "; // Separate messages with a space. protected final String TAG; @@ -66,173 +64,6 @@ public abstract class ILogger { TAG = preProcessLogTag(tag); } - public static ILogger instance() { - return cachedLoggers.computeIfAbsent(DEFAULT_TAG, ILogger::createInstance); - } - - private static ILogger createInstance(String tag) { - return cachedLoggers.computeIfAbsent(tag, ILogger::newPlatformDependentLogger); - } - - private static ILogger newPlatformDependentLogger(String tag) { - return LogUtils.isJvm() ? new JvmLogger(tag) : new AndroidLogger(tag); - } - - public static void addLogListener(LogListener listener) { - logListeners.add(Objects.requireNonNull(listener)); - } - - public static void removeLogListener(LogListener listener) { - logListeners.remove(Objects.requireNonNull(listener)); - } - - public static ILogger newInstance(String tag) { - return createInstance(tag); - } - - /** - * Log error messages. - * - * @param messages The messages to log. - * @return This logger instance. - */ - public ILogger error(Object... messages) { - return log(Level.ERROR, messages); - } - - /** - * Log messages with the given log level. - * - * @param level The log level of the messages. - * @param messages The messages to log. - * @return This logger instance. - */ - public ILogger log(Level level, Object... messages) { - logAndNotify(level, generateMessage(messages)); - return this; - } - - private void logAndNotify(Level level, String msg) { - if (!isEnabled()) { - // logger is disabled - return; - } - - doLog(level, msg); - for (final var listener : logListeners) { - listener.log(level, TAG, msg); - } - } - - /** - * Log the message to an appropriate stream where the user can see the log messages. - * - * @param level The log level for this message. - * @param message The full generated message for this log. Might contain new lines. - * @see Level#DEBUG - * @see Level#ERROR - * @see Level#WARNING - * @see Level#VERBOSE - * @see Level#INFO - */ - protected abstract void doLog(Level level, String message); - - protected String generateMessage(Object... messages) { - StringBuilder sb = new StringBuilder(); - if (messages == null) { - return "null"; - } - - for (Object msg : messages) { - sb.append(msg instanceof Throwable ? "\n" : MSG_SEPARATOR); - sb.append(msg instanceof Throwable ? LogUtils.getFullStackTrace(((Throwable) msg)) : msg); - sb.append(msg instanceof Throwable ? "\n" : MSG_SEPARATOR); - } - - return sb.toString(); - } - - /** - * Log warning messages. - * - * @param messages The messages to log. - * @return This logger instance. - */ - public ILogger warn(Object... messages) { - return log(Level.WARNING, messages); - } - - /** - * Log verbose messages. - * - * @param messages The messages to log. - * @return This logger instance. - */ - public ILogger verbose(Object... messages) { - return log(Level.VERBOSE, messages); - } - - /** - * Log information messages. - * - * @param messages The messages to log. - * @return This logger instance. - */ - public ILogger info(Object... messages) { - return log(Level.INFO, messages); - } - - /** - * Logs the name of method and class which calls this method. - */ - public void logThis() { - debug(getCallerClassDescription()); - } - - /** - * Log debug messages. - * - * @param messages The messages to log. - * @return This logger instance. - */ - public ILogger debug(Object... messages) { - return log(Level.DEBUG, messages); - } - - /** - * Enable or disable this logger instance. - * - * @param enabled Whether this logger is enabled. - * @see #isEnabled() - */ - public void setEnabled(boolean enabled) { - isEnabled = enabled; - } - - /** - * @return Whether this logger is enabled. - * @see #setEnabled(boolean) - */ - public boolean isEnabled() { - return isEnabled; - } - - protected String getCallerClassDescription() { - final var elements = Thread.currentThread().getStackTrace(); - for (int i = 1, elementsLength = elements.length; i < elementsLength; i++) { - final var element = elements[i]; - final var klass = element.getClassName(); - final var method = element.getMethodName(); - if (ILogger.class.getName().equals(klass) || klass.contains("java.lang.Thread")) { - continue; - } - - return String.format("%s [%s]", method, klass); - } - - return " "; - } - /** * Logging level. */ @@ -252,6 +83,11 @@ public abstract class ILogger { public static Level forChar(char c) { c = Character.toUpperCase(c); + if (c == 'T') { + // trace + return VERBOSE; + } + for (Level value : values()) { if (value.levelChar == c) { return value; diff --git a/logger/src/main/resources/logback.xml b/logger/src/main/resources/logback.xml new file mode 100644 index 000000000..ebdb227e1 --- /dev/null +++ b/logger/src/main/resources/logback.xml @@ -0,0 +1,32 @@ + + + + + false + + + + + + + + + + + + \ No newline at end of file diff --git a/logsender/src/main/java/com/itsaky/androidide/logsender/LogSenderService.java b/logsender/src/main/java/com/itsaky/androidide/logsender/LogSenderService.java index 4256e4327..a09e1ab0b 100644 --- a/logsender/src/main/java/com/itsaky/androidide/logsender/LogSenderService.java +++ b/logsender/src/main/java/com/itsaky/androidide/logsender/LogSenderService.java @@ -51,7 +51,7 @@ public class LogSenderService extends Service { @Override public void onCreate() { - Logger.LOG.logThis(); + Logger.debug("[LogSenderService] onCreate()"); super.onCreate(); setupNotificationChannel(); startForeground(NOTIFICATION_ID, buildNotification()); @@ -106,7 +106,7 @@ public class LogSenderService extends Service { @Override public void onTaskRemoved(Intent rootIntent) { - Logger.LOG.logThis(); + Logger.debug("[LogSenderService] [onTaskRemoved]", rootIntent); if (!logSender.isConnected() && !logSender.isBinding()) { Logger.debug("Not bound to AndroidIDE. Ignored."); @@ -120,7 +120,7 @@ public class LogSenderService extends Service { @Override public void onDestroy() { - Logger.LOG.logThis(); + Logger.debug("[LogSenderService] [onDestroy]"); if (!logSender.isConnected() && !logSender.isBinding()) { Logger.debug("Not bound to AndroidIDE. Ignored."); return; diff --git a/logsender/src/main/java/com/itsaky/androidide/logsender/utils/Logger.java b/logsender/src/main/java/com/itsaky/androidide/logsender/utils/Logger.java index 2c911f5a5..9e59ba0ca 100644 --- a/logsender/src/main/java/com/itsaky/androidide/logsender/utils/Logger.java +++ b/logsender/src/main/java/com/itsaky/androidide/logsender/utils/Logger.java @@ -17,7 +17,8 @@ package com.itsaky.androidide.logsender.utils; -import com.itsaky.androidide.utils.ILogger; +import java.util.Arrays; +import org.slf4j.LoggerFactory; /** * Static methods for logging messages. @@ -25,21 +26,74 @@ import com.itsaky.androidide.utils.ILogger; * @author Akash Yadav */ public class Logger { - public static final ILogger LOG = ILogger.newInstance("LogSender"); + + private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(Logger.class); public static void error(Object... messages) { - LOG.error(messages); + if (messages == null || messages.length == 0) { + return; + } + if (messages.length == 1) { + LOG.error(String.valueOf(messages[0])); + return; + } + + if (messages.length == 2) { + LOG.error(String.valueOf(messages[0]), messages[1]); + return; + } + + LOG.error(String.valueOf(messages[0]), Arrays.copyOfRange(messages, 1, messages.length)); } public static void warn(Object... messages) { - LOG.warn(messages); + if (messages == null || messages.length == 0) { + return; + } + if (messages.length == 1) { + LOG.warn(String.valueOf(messages[0])); + return; + } + + if (messages.length == 2) { + LOG.warn(String.valueOf(messages[0]), messages[1]); + return; + } + + LOG.warn(String.valueOf(messages[0]), Arrays.copyOfRange(messages, 1, messages.length)); } public static void info(Object... messages) { - LOG.info(messages); + if (messages == null || messages.length == 0) { + return; + } + if (messages.length == 1) { + LOG.info(String.valueOf(messages[0])); + return; + } + + if (messages.length == 2) { + LOG.info(String.valueOf(messages[0]), messages[1]); + return; + } + + LOG.info(String.valueOf(messages[0]), Arrays.copyOfRange(messages, 1, messages.length)); } public static void debug(Object... messages) { - LOG.debug(messages); + if (messages == null || messages.length == 0) { + return; + } + if (messages.length == 1) { + LOG.debug(String.valueOf(messages[0])); + return; + } + + if (messages.length == 2) { + LOG.debug(String.valueOf(messages[0]), messages[1]); + return; + } + + LOG.debug(String.valueOf(messages[0]), Arrays.copyOfRange(messages, 1, messages.length)); } } diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/DefaultLanguageServerRegistry.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/DefaultLanguageServerRegistry.java index 8f4215b85..86dd50e64 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/DefaultLanguageServerRegistry.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/DefaultLanguageServerRegistry.java @@ -21,6 +21,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.itsaky.androidide.eventbus.events.project.ProjectInitializedEvent; import com.itsaky.androidide.projects.api.Project; +import com.itsaky.androidide.utils.ILogger; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -121,7 +122,7 @@ public class DefaultLanguageServerRegistry extends ILanguageServerRegistry { return; } - LOG.debug("Dispatching ProjectInitializedEvent to language servers..."); + ILogger.ROOT.debug("Dispatching ProjectInitializedEvent to language servers..."); for (final var server : mRegister.values()) { server.setupWithProject(project); } diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ICompletionProvider.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ICompletionProvider.java index 0b225fa69..a496060e8 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ICompletionProvider.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ICompletionProvider.java @@ -35,14 +35,12 @@ package com.itsaky.androidide.lsp.api; import androidx.annotation.NonNull; - import com.itsaky.androidide.lookup.Lookup; import com.itsaky.androidide.lsp.models.CompletionItem; import com.itsaky.androidide.lsp.models.CompletionParams; import com.itsaky.androidide.lsp.models.CompletionResult; import com.itsaky.androidide.lsp.models.CompletionsKt; import com.itsaky.androidide.lsp.models.MatchLevel; - import com.itsaky.androidide.progress.ICancelChecker; import java.nio.file.Files; import java.nio.file.Path; diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ILanguageServerRegistry.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ILanguageServerRegistry.java index bcb7d996b..502bafd96 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ILanguageServerRegistry.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/api/ILanguageServerRegistry.java @@ -20,8 +20,6 @@ package com.itsaky.androidide.lsp.api; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.itsaky.androidide.utils.ILogger; - /** * A language server registry which keeps track of registered language servers. * @@ -30,7 +28,6 @@ import com.itsaky.androidide.utils.ILogger; public abstract class ILanguageServerRegistry { private static ILanguageServerRegistry sRegistry = null; - protected static final ILogger LOG = ILogger.newInstance("ILanguageServerRegistry"); public static ILanguageServerRegistry getDefault() { if (sRegistry == null) { diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/internal/model/CachedCompletion.kt b/lsp/api/src/main/java/com/itsaky/androidide/lsp/internal/model/CachedCompletion.kt index 639c9b7a1..bac6e9409 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/internal/model/CachedCompletion.kt +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/internal/model/CachedCompletion.kt @@ -20,7 +20,7 @@ package com.itsaky.androidide.lsp.internal.model import com.itsaky.androidide.lsp.models.CompletionParams import com.itsaky.androidide.progress.ICancelChecker import com.itsaky.androidide.utils.DocumentUtils -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.nio.file.Paths /** @@ -34,9 +34,10 @@ private constructor( val result: com.itsaky.androidide.lsp.models.CompletionResult ) { - private val log = ILogger.newInstance(javaClass.simpleName) companion object { + private val log = LoggerFactory.getLogger(CachedCompletion::class.java) + /** Empty cached completion. Could be used to represent "no cache available". */ @JvmField val EMPTY = diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/snippets/SnippetParser.kt b/lsp/api/src/main/java/com/itsaky/androidide/lsp/snippets/SnippetParser.kt index fc619b5bc..72727e0bc 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/snippets/SnippetParser.kt +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/snippets/SnippetParser.kt @@ -21,8 +21,8 @@ import com.google.gson.JsonParseException import com.google.gson.stream.JsonReader import com.itsaky.androidide.app.BaseApplication import com.itsaky.androidide.tasks.executeAsyncProvideError -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.VMUtils +import org.slf4j.LoggerFactory import java.io.IOException import java.util.concurrent.ConcurrentHashMap @@ -33,7 +33,7 @@ import java.util.concurrent.ConcurrentHashMap */ object SnippetParser { - private val log = ILogger.newInstance("SnippetParser") + private val log = LoggerFactory.getLogger(SnippetParser::class.java) fun parse( lang: String, @@ -86,7 +86,7 @@ object SnippetParser { } }) { result, err -> if (result == null || err != null) { - log.error("Failed to load '${type}' snippets", err) + log.error("Failed to load '{}' snippets", type, err) } } } diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/DiagnosticUtil.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/DiagnosticUtil.java index 9d438ad31..6216bd77b 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/DiagnosticUtil.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/DiagnosticUtil.java @@ -18,11 +18,9 @@ package com.itsaky.androidide.lsp.util; import androidx.annotation.NonNull; - import com.itsaky.androidide.lsp.models.DiagnosticItem; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; - import java.util.Collections; import java.util.List; diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/DocumentationReferenceProvider.kt b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/DocumentationReferenceProvider.kt index 81aebdf73..61ca52f78 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/DocumentationReferenceProvider.kt +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/DocumentationReferenceProvider.kt @@ -21,7 +21,7 @@ import com.itsaky.androidide.lsp.models.ClassCompletionData import com.itsaky.androidide.lsp.models.ICompletionData import com.itsaky.androidide.lsp.models.MemberCompletionData import com.itsaky.androidide.lsp.models.MethodCompletionData -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory /** * Provides the documentation URL for classes, methods, fields, etc. @@ -30,6 +30,8 @@ import com.itsaky.androidide.utils.ILogger */ object DocumentationReferenceProvider { + private val log = LoggerFactory.getLogger(DocumentationReferenceProvider::class.java) + const val DOCS_BASE_URL = "https://developer.android.com/reference/" /** @@ -85,9 +87,10 @@ object DocumentationReferenceProvider { url.append(data.parameterTypes.joinToString(separator = ", ")) url.append(')') } - log.debug(url) + + log.debug("Documentation URL for {}#{} is {}", klass.className, + ((data as? MemberCompletionData?)?.memberName ?: ""), url) + return url.toString() } - - private val log = ILogger.newInstance("DocumentationReferenceProvider") } diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/LSPEditorActions.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/LSPEditorActions.java index 05a315b53..e379b54ed 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/LSPEditorActions.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/LSPEditorActions.java @@ -17,8 +17,6 @@ package com.itsaky.androidide.lsp.util; -import static com.itsaky.androidide.utils.ILogger.newInstance; - import com.itsaky.androidide.actions.ActionItem; import com.itsaky.androidide.actions.ActionMenu; import com.itsaky.androidide.actions.ActionsRegistry; @@ -31,15 +29,13 @@ import com.itsaky.androidide.utils.ILogger; */ public class LSPEditorActions { - private static final ILogger LOG = newInstance("LSPEditorActions"); - public static void ensureActionsMenuRegistered(IActionsMenuProvider provider) { final var registry = ActionsRegistry.getInstance(); final var action = registry.findAction(ActionItem.Location.EDITOR_TEXT_ACTIONS, CodeActionsMenu.ID); if (action == null) { - LOG.error("Cannot find registered editor actions menu"); + ILogger.ROOT.error("[LSPEditorActions] Cannot find registered editor actions menu"); return; } diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/NoCompletionsProvider.kt b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/NoCompletionsProvider.kt index 046c64b71..2af592db3 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/NoCompletionsProvider.kt +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/NoCompletionsProvider.kt @@ -18,8 +18,6 @@ package com.itsaky.androidide.lsp.util import com.itsaky.androidide.lsp.api.ICompletionProvider -import com.itsaky.androidide.lsp.models.CompletionParams -import com.itsaky.androidide.lsp.models.CompletionResult /** @author Akash Yadav */ class NoCompletionsProvider : ICompletionProvider { diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/PrefBasedServerSettings.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/PrefBasedServerSettings.java index 20f581a12..65f6ffc8f 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/PrefBasedServerSettings.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/PrefBasedServerSettings.java @@ -18,10 +18,9 @@ package com.itsaky.androidide.lsp.util; import androidx.annotation.Nullable; - import com.itsaky.androidide.app.BaseApplication; -import com.itsaky.androidide.managers.PreferenceManager; import com.itsaky.androidide.lsp.api.IServerSettings; +import com.itsaky.androidide.managers.PreferenceManager; /** * {@link IServerSettings} implementation which uses {@link diff --git a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/StringUtils.java b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/StringUtils.java index f29dbfa36..f70267a13 100644 --- a/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/StringUtils.java +++ b/lsp/api/src/main/java/com/itsaky/androidide/lsp/util/StringUtils.java @@ -17,11 +17,7 @@ package com.itsaky.androidide.lsp.util; -import static com.itsaky.androidide.utils.ILogger.newInstance; - import com.itsaky.androidide.fuzzysearch.FuzzySearch; -import com.itsaky.androidide.utils.ILogger; - import java.util.Locale; /** @@ -29,8 +25,6 @@ import java.util.Locale; */ public class StringUtils { - private static final ILogger LOG = newInstance("StringUtils"); - public static boolean matchesFuzzy(CharSequence candidate, CharSequence partialName) { return matchesFuzzy(candidate, partialName, false); } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaCompilerProvider.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaCompilerProvider.java index 19c8ce6e0..6a297295c 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaCompilerProvider.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaCompilerProvider.java @@ -20,7 +20,6 @@ package com.itsaky.androidide.lsp.java; import androidx.annotation.NonNull; import com.itsaky.androidide.lsp.java.compiler.JavaCompilerService; import com.itsaky.androidide.projects.api.ModuleProject; - import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaLanguageServer.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaLanguageServer.kt index e0cc5e8e0..9a5f32480 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaLanguageServer.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/JavaLanguageServer.kt @@ -63,7 +63,6 @@ import com.itsaky.androidide.projects.IProjectManager.Companion.getInstance import com.itsaky.androidide.projects.api.ModuleProject import com.itsaky.androidide.projects.api.Project import com.itsaky.androidide.utils.DocumentUtils -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.VMUtils import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -72,6 +71,7 @@ import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.slf4j.LoggerFactory import java.nio.file.Path import java.util.Objects @@ -98,7 +98,7 @@ class JavaLanguageServer : ILanguageServer { companion object { const val SERVER_ID = "ide.lsp.java" - private val LOG = ILogger.newInstance("JavaLanguageServer") + private val log = LoggerFactory.getLogger(JavaLanguageServer::class.java) } init { @@ -168,7 +168,7 @@ class JavaLanguageServer : ILanguageServer { } if (diagnosticProvider!!.isAnalyzing()) { - LOG.warn("Cancelling source code analysis due to completion request") + log.warn("Cancelling source code analysis due to completion request") diagnosticProvider.cancel() } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/BaseJavaCodeAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/BaseJavaCodeAction.kt index abac28fd8..e5354f483 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/BaseJavaCodeAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/BaseJavaCodeAction.kt @@ -79,7 +79,7 @@ abstract class BaseJavaCodeAction : EditorActionItem { result.asCodeActions(compiler, label) } catch (e: Exception) { flashError(e.cause?.message ?: e.message) - ILogger.instance().error(e) + ILogger.ROOT.error(e.cause?.message ?: e.message, e) return } @@ -87,10 +87,10 @@ abstract class BaseJavaCodeAction : EditorActionItem { onPerformCodeActionFailed(data) return } - + data.getLanguageClient()?.performCodeAction(actions) } - + protected open fun onPerformCodeActionFailed(data: ActionData) { flashError(R.string.msg_codeaction_failed) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/FieldBasedAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/FieldBasedAction.kt index 656408374..bdfc75315 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/FieldBasedAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/FieldBasedAction.kt @@ -28,16 +28,16 @@ import com.itsaky.androidide.lsp.java.compiler.CompileTask import com.itsaky.androidide.lsp.java.visitors.FindTypeDeclarationAt import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashInfo +import io.github.rosemoe.sora.widget.CodeEditor +import jdkx.lang.model.element.Modifier.STATIC import openjdk.source.tree.ClassTree import openjdk.source.tree.Tree.Kind.VARIABLE import openjdk.source.tree.VariableTree -import io.github.rosemoe.sora.widget.CodeEditor +import org.slf4j.LoggerFactory import java.nio.file.Path import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletionException -import jdkx.lang.model.element.Modifier.STATIC /** * Any action that has to work with fields in the current class can inherit this action. @@ -46,18 +46,21 @@ import jdkx.lang.model.element.Modifier.STATIC */ abstract class FieldBasedAction : BaseJavaCodeAction() { - private val log = ILogger.newInstance(javaClass.simpleName) + companion object { + + private val log = LoggerFactory.getLogger(FieldBasedAction::class.java) + } override fun prepare(data: ActionData) { super.prepare(data) if ( !visible || - !data.hasRequiredData( - com.itsaky.androidide.models.Range::class.java, - CodeEditor::class.java - ) || - IProjectManager.getInstance().rootProject == null + !data.hasRequiredData( + com.itsaky.androidide.models.Range::class.java, + CodeEditor::class.java + ) || + IProjectManager.getInstance().rootProject == null ) { markInvisible() return @@ -78,7 +81,7 @@ abstract class FieldBasedAction : BaseJavaCodeAction() { val fields = triple.third val fieldNames = fields.map { "${it.name}: ${it.type}" } // Get the names - log.debug("Found ${fieldNames.size} fields in class ${type.simpleName}") + log.debug("Found {} fields in class {}", fieldNames.size, type.simpleName) return@get fieldNames } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/CommentAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/CommentAction.kt index 88175f163..30344559d 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/CommentAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/CommentAction.kt @@ -18,8 +18,8 @@ package com.itsaky.androidide.lsp.java.actions.common import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.requireEditor -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction +import com.itsaky.androidide.resources.R /** @author Akash Yadav */ class CommentAction : BaseJavaCodeAction() { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/FindReferencesAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/FindReferencesAction.kt index 119d4eb6b..e4b69433b 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/FindReferencesAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/FindReferencesAction.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.lsp.java.actions.common import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.hasRequiredData import com.itsaky.androidide.actions.markInvisible -import com.itsaky.androidide.editor.api.IEditor import com.itsaky.androidide.editor.api.ILspEditor import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.resources.R diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/GoToDefinitionAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/GoToDefinitionAction.kt index d781a35e7..64c9aeadf 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/GoToDefinitionAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/GoToDefinitionAction.kt @@ -19,11 +19,9 @@ package com.itsaky.androidide.lsp.java.actions.common import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.hasRequiredData import com.itsaky.androidide.actions.markInvisible -import com.itsaky.androidide.editor.api.IEditor import com.itsaky.androidide.editor.api.ILspEditor import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.resources.R -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.widget.CodeEditor import java.io.File @@ -34,11 +32,11 @@ import java.io.File * @author Akash Yadav */ class GoToDefinitionAction : BaseJavaCodeAction() { + override val titleTextRes: Int = R.string.action_goto_definition override val id: String = "ide.editor.lsp.java.gotoDefinition" override var label: String = "" override var requiresUIThread: Boolean = true - private val log = ILogger.newInstance(javaClass.simpleName) override fun prepare(data: ActionData) { super.prepare(data) diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/OrganizeImportsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/OrganizeImportsAction.kt index f027b44d0..713680768 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/OrganizeImportsAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/OrganizeImportsAction.kt @@ -11,16 +11,20 @@ import com.itsaky.androidide.lsp.java.JavaLanguageServer import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.JavaServerSettings import com.itsaky.androidide.resources.R.string -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.widget.CodeEditor +import org.slf4j.LoggerFactory class OrganizeImportsAction : BaseJavaCodeAction() { - private val log = ILogger.newInstance(javaClass.simpleName) override val id: String = "lsp_java_organizeImports" override var label: String = "" override val titleTextRes: Int = string.action_organize_imports + companion object { + + private val log = LoggerFactory.getLogger(OrganizeImportsAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) if (!visible) { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/RemoveUnusedImportsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/RemoveUnusedImportsAction.kt index d74cbcc7a..d3403bab2 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/RemoveUnusedImportsAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/RemoveUnusedImportsAction.kt @@ -6,18 +6,22 @@ import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.hasRequiredData import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireEditor -import com.itsaky.androidide.resources.R.string import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R.string import io.github.rosemoe.sora.widget.CodeEditor +import org.slf4j.LoggerFactory class RemoveUnusedImportsAction : BaseJavaCodeAction() { - private val log = ILogger.newInstance(javaClass.simpleName) override val id: String = "ide.editor.lsp.java.removeUnusedImports" override var label: String = "" override val titleTextRes: Int = string.action_remove_unused_imports + companion object { + + private val log = LoggerFactory.getLogger(RemoveUnusedImportsAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) if (!visible) { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/UncommentAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/UncommentAction.kt index 8d4b906fa..57333f45d 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/UncommentAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/common/UncommentAction.kt @@ -18,8 +18,8 @@ package com.itsaky.androidide.lsp.java.actions.common import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.requireEditor -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction +import com.itsaky.androidide.resources.R /** @author Akash Yadav */ class UncommentAction : BaseJavaCodeAction() { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AddImportAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AddImportAction.kt index 3e84df56b..2dcd73c0e 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AddImportAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AddImportAction.kt @@ -33,9 +33,9 @@ import com.itsaky.androidide.lsp.models.CodeActionItem import com.itsaky.androidide.lsp.models.DiagnosticItem import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R -import com.itsaky.androidide.utils.ILogger import jdkx.tools.Diagnostic import jdkx.tools.JavaFileObject +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class AddImportAction : BaseJavaCodeAction() { @@ -43,10 +43,14 @@ class AddImportAction : BaseJavaCodeAction() { override val id: String = "ide.editor.lsp.java.diagnostics.addImport" override var label: String = "" private val diagnosticCode = DiagnosticCode.NOT_IMPORTED.id - private val log = ILogger.newInstance("AddImportAction") override val titleTextRes: Int = R.string.action_import_classes + companion object { + + private val log = LoggerFactory.getLogger(AddImportAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AddThrowsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AddThrowsAction.kt index ea25ee54d..f52e48134 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AddThrowsAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AddThrowsAction.kt @@ -29,17 +29,22 @@ import com.itsaky.androidide.lsp.java.utils.CodeActionUtils import com.itsaky.androidide.lsp.models.DiagnosticItem import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class AddThrowsAction : BaseJavaCodeAction() { + override val id = "ide.editor.lsp.java.diagnostics.addThrows" override var label: String = "" private val diagnosticCode = DiagnosticCode.NOT_THROWN.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_add_throws + companion object { + + private val log = LoggerFactory.getLogger(AddThrowsAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AutoFixImportsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AutoFixImportsAction.kt index 928c298ef..b8d097c2e 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AutoFixImportsAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/AutoFixImportsAction.kt @@ -19,7 +19,6 @@ package com.itsaky.androidide.lsp.java.actions.diagnostics import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.requireContext -import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction @@ -32,8 +31,8 @@ import com.itsaky.androidide.lsp.models.DocumentChange import com.itsaky.androidide.lsp.models.TextEdit import com.itsaky.androidide.models.Range import com.itsaky.androidide.utils.DialogUtils -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashInfo +import org.slf4j.LoggerFactory import java.nio.file.Path /** @@ -43,11 +42,15 @@ import java.nio.file.Path */ class AutoFixImportsAction : BaseJavaCodeAction() { - private val log = ILogger.newInstance("AutoFixImportsAction") override val titleTextRes: Int = R.string.title_fix_imports override val id: String = "ide.editor.lsp.java.diagnostics.autoFixImports" override var label: String = "" + companion object { + + private val log = LoggerFactory.getLogger(AutoFixImportsAction::class.java) + } + override suspend fun execAction(data: ActionData): Result { val path = data.requirePath() val compiler = data.requireCompiler() @@ -78,7 +81,7 @@ class AutoFixImportsAction : BaseJavaCodeAction() { override fun postExec(data: ActionData, result: Any) { if (result !is Result) { - log.error("Invalid result returned from execAction", result) + log.error("Invalid result returned from execAction: {}", result) return } @@ -182,7 +185,7 @@ class AutoFixImportsAction : BaseJavaCodeAction() { try { docContents ?: diagnostic.source.getCharContent(true).also { docContents = it } } catch (e: Exception) { - log.error("Failed to get contents of file $file", e) + log.error("Failed to get contents of file {}", file, e) continue } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/CreateMissingMethodAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/CreateMissingMethodAction.kt index 7181b8ccc..75181aeac 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/CreateMissingMethodAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/CreateMissingMethodAction.kt @@ -22,29 +22,34 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.JavaCompilerProvider -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.CreateMissingMethod import com.itsaky.androidide.lsp.java.utils.CodeActionUtils.findPosition import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class CreateMissingMethodAction : BaseJavaCodeAction() { + override val id: String = "ide.editor.lsp.java.diagnostics.createMissingMethod" override var label: String = "" private val diagnosticCode = DiagnosticCode.MISSING_METHOD.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_create_missing_method + companion object { + + private val log = LoggerFactory.getLogger(CreateMissingMethodAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) if ( !visible || - !data.hasRequiredData( com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) + !data.hasRequiredData(com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) ) { markInvisible() return diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/FieldToBlockAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/FieldToBlockAction.kt index db3344ba8..1ce0af1ea 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/FieldToBlockAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/FieldToBlockAction.kt @@ -22,14 +22,14 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.JavaCompilerProvider -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.ConvertFieldToBlock import com.itsaky.androidide.lsp.java.utils.CodeActionUtils.findPosition import com.itsaky.androidide.lsp.models.DiagnosticItem import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class FieldToBlockAction : BaseJavaCodeAction() { @@ -37,10 +37,14 @@ class FieldToBlockAction : BaseJavaCodeAction() { override val id: String = "ide.editor.lsp.java.diagnostics.fieldToBlock" override var label: String = "" private val diagnosticCode = DiagnosticCode.UNUSED_FIELD.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_convert_to_block + companion object { + + private val log = LoggerFactory.getLogger(FieldToBlockAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) @@ -48,7 +52,7 @@ class FieldToBlockAction : BaseJavaCodeAction() { return } - if (!data.hasRequiredData( DiagnosticItem::class.java)) { + if (!data.hasRequiredData(DiagnosticItem::class.java)) { markInvisible() return } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/ImplementAbstractMethodsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/ImplementAbstractMethodsAction.kt index 6766089c3..3b6a921b8 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/ImplementAbstractMethodsAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/ImplementAbstractMethodsAction.kt @@ -20,23 +20,28 @@ import com.itsaky.androidide.actions.ActionData import com.itsaky.androidide.actions.hasRequiredData import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.javac.services.util.JavaDiagnosticUtils -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.ImplementAbstractMethods -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R import jdkx.tools.Diagnostic import jdkx.tools.JavaFileObject +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class ImplementAbstractMethodsAction : BaseJavaCodeAction() { + override val id: String = "ide.editor.lsp.java.diagnostics.implementAbstractMethods" override var label: String = "" private var diagnosticCode = DiagnosticCode.DOES_NOT_OVERRIDE_ABSTRACT.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_implement_abstract_methods + companion object { + + private val log = LoggerFactory.getLogger(ImplementAbstractMethodsAction::class.java) + } + @Suppress("UNCHECKED_CAST") override fun prepare(data: ActionData) { super.prepare(data) @@ -45,7 +50,7 @@ class ImplementAbstractMethodsAction : BaseJavaCodeAction() { return } - if (!data.hasRequiredData( com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)) { + if (!data.hasRequiredData(com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)) { markInvisible() return } @@ -70,7 +75,8 @@ class ImplementAbstractMethodsAction : BaseJavaCodeAction() { override suspend fun execAction(data: ActionData): Any { val diagnostic = JavaDiagnosticUtils.asJCDiagnostic( - data.get(com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)!!.extra as Diagnostic + data.get( + com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)!!.extra as Diagnostic ) return ImplementAbstractMethods(diagnostic!!) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveClassAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveClassAction.kt index 948f2b5f4..221e5354e 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveClassAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveClassAction.kt @@ -22,27 +22,34 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.JavaCompilerProvider -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.RemoveClass import com.itsaky.androidide.lsp.java.utils.CodeActionUtils.findPosition import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class RemoveClassAction : BaseJavaCodeAction() { + override val id: String = "ide.editor.lsp.java.diagnostics.removeClass" override var label: String = "" private val diagnosticCode = DiagnosticCode.UNUSED_CLASS.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_remove_class + companion object { + + private val log = LoggerFactory.getLogger(RemoveClassAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) - if (!visible || !data.hasRequiredData( com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)) { + if (!visible || !data.hasRequiredData( + com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) + ) { markInvisible() return } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveMethodAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveMethodAction.kt index 115711126..b0aa7ef5a 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveMethodAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveMethodAction.kt @@ -22,27 +22,34 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.JavaCompilerProvider -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.RemoveMethod import com.itsaky.androidide.lsp.java.utils.CodeActionUtils.findMethod import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class RemoveMethodAction : BaseJavaCodeAction() { + override val id: String = "ide.editor.lsp.java.diagnostics.removeMethod" override var label: String = "" private val diagnosticCode = DiagnosticCode.UNUSED_METHOD.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_remove_method + companion object { + + private val log = LoggerFactory.getLogger(RemoveMethodAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) - if (!visible || !data.hasRequiredData( com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)) { + if (!visible || !data.hasRequiredData( + com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) + ) { markInvisible() return } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveUnusedThrowsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveUnusedThrowsAction.kt index 59695bd8b..b1c3d35c3 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveUnusedThrowsAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/RemoveUnusedThrowsAction.kt @@ -22,29 +22,34 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.JavaCompilerProvider -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.RemoveException import com.itsaky.androidide.lsp.java.utils.CodeActionUtils import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class RemoveUnusedThrowsAction : BaseJavaCodeAction() { + override val id: String = "ide.editor.lsp.java.diagnostics.removeUnusedThrows" override var label: String = "" private val diagnosticCode = DiagnosticCode.UNUSED_THROWS.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_remove_unused_throws + companion object { + + private val log = LoggerFactory.getLogger(RemoveUnusedThrowsAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) if ( !visible || - !data.hasRequiredData( com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) + !data.hasRequiredData(com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) ) { markInvisible() return diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/SuppressUncheckedWarningAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/SuppressUncheckedWarningAction.kt index b67047e2e..b831e43de 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/SuppressUncheckedWarningAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/SuppressUncheckedWarningAction.kt @@ -22,27 +22,34 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.JavaCompilerProvider -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.AddSuppressWarningAnnotation import com.itsaky.androidide.lsp.java.utils.CodeActionUtils import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class SuppressUncheckedWarningAction : BaseJavaCodeAction() { + override val id = "ide.editor.lsp.java.diagnostics.suppressUncheckedWarning" override var label: String = "" private val diagnosticCode = DiagnosticCode.UNCHECKED.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_suppress_unchecked_warning + companion object { + + private val log = LoggerFactory.getLogger(SuppressUncheckedWarningAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) - if (!visible || !data.hasRequiredData( com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)) { + if (!visible || !data.hasRequiredData( + com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) + ) { markInvisible() return } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/VariableToStatementAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/VariableToStatementAction.kt index 5fff3e8c1..32b1e0aa9 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/VariableToStatementAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/diagnostics/VariableToStatementAction.kt @@ -22,23 +22,28 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.JavaCompilerProvider -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.ConvertVariableToStatement import com.itsaky.androidide.lsp.java.utils.CodeActionUtils.findPosition import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class VariableToStatementAction : BaseJavaCodeAction() { + override val id: String = "ide.editor.lsp.java.diagnostics.variableToStatement" override var label: String = "" private val diagnosticCode = DiagnosticCode.UNUSED_LOCAL.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_convert_to_statement + companion object { + + private val log = LoggerFactory.getLogger(VariableToStatementAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) @@ -46,7 +51,7 @@ class VariableToStatementAction : BaseJavaCodeAction() { return } - if (!data.hasRequiredData( com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)) { + if (!data.hasRequiredData(com.itsaky.androidide.lsp.models.DiagnosticItem::class.java)) { markInvisible() return } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateConstructorAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateConstructorAction.kt index 873cad1d5..2c07578d8 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateConstructorAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateConstructorAction.kt @@ -33,8 +33,8 @@ import com.itsaky.androidide.lsp.java.utils.ShortTypePrinter.NO_PACKAGE import com.itsaky.androidide.preferences.utils.indentationString import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R.string -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError +import io.github.rosemoe.sora.widget.CodeEditor import openjdk.source.tree.ClassTree import openjdk.source.tree.VariableTree import openjdk.source.util.TreePath @@ -45,7 +45,7 @@ import openjdk.tools.javac.code.Type import openjdk.tools.javac.tree.JCTree import openjdk.tools.javac.tree.TreeInfo import openjdk.tools.javac.util.ListBuffer -import io.github.rosemoe.sora.widget.CodeEditor +import org.slf4j.LoggerFactory import java.util.concurrent.CompletableFuture /** @@ -58,6 +58,15 @@ import java.util.concurrent.CompletableFuture */ class GenerateConstructorAction : FieldBasedAction() { + override val titleTextRes: Int = string.action_generate_constructor + override val id: String = "ide.editor.lsp.java.generator.constructor" + override var label: String = "" + + companion object { + + private val log = LoggerFactory.getLogger(GenerateConstructorAction::class.java) + } + override fun onGetFields(fields: List, data: ActionData) { showFieldSelector(fields, data) { selected -> CompletableFuture.runAsync { generateConstructor(data, selected) } @@ -85,7 +94,7 @@ class GenerateConstructorAction : FieldBasedAction() { fields.removeIf { !selected.contains("${it.name}: ${it.type}") } - log.debug("Creating toString() method with fields: ", fields.map { it.name }) + log.debug("Creating toString() method with fields: {}", fields.map { it.name }) generateForFields(data, task, type, fields.map { TreePath(typeFinder.path, it) }) } @@ -105,7 +114,7 @@ class GenerateConstructorAction : FieldBasedAction() { if (paths.isEmpty() || trees.findConstructor(sym, varTypes) != null) { log.warn( - "A constructor with same parameter types is already available in class ${type.simpleName}" + "A constructor with same parameter types is already available in class {}", type.simpleName ) flashError(data[Context::class.java]!!.getString(string.msg_constructor_available)) return @@ -164,9 +173,4 @@ class GenerateConstructorAction : FieldBasedAction() { return buffer.toList() } - - override val titleTextRes: Int = string.action_generate_constructor - override val id: String = "ide.editor.lsp.java.generator.constructor" - override var label: String = "" - private val log = ILogger.newInstance(javaClass.simpleName) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateMissingConstructorAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateMissingConstructorAction.kt index bae13cad8..3e9484ae3 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateMissingConstructorAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateMissingConstructorAction.kt @@ -22,28 +22,33 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.actions.requireFile import com.itsaky.androidide.actions.requirePath import com.itsaky.androidide.lsp.java.JavaCompilerProvider -import com.itsaky.androidide.resources.R import com.itsaky.androidide.lsp.java.actions.BaseJavaCodeAction import com.itsaky.androidide.lsp.java.models.DiagnosticCode import com.itsaky.androidide.lsp.java.rewrite.GenerateRecordConstructor import com.itsaky.androidide.lsp.java.utils.CodeActionUtils import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.resources.R +import org.slf4j.LoggerFactory /** @author Akash Yadav */ class GenerateMissingConstructorAction : BaseJavaCodeAction() { + override val id = "ide.editor.lsp.java.generator.missingConstructor" override var label: String = "" private val diagnosticCode = DiagnosticCode.MISSING_CONSTRUCTOR.id - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_generate_missing_constructor + companion object { + + private val log = LoggerFactory.getLogger(GenerateMissingConstructorAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) if ( !visible || - !data.hasRequiredData( com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) + !data.hasRequiredData(com.itsaky.androidide.lsp.models.DiagnosticItem::class.java) ) { markInvisible() return diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateSettersAndGettersAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateSettersAndGettersAction.kt index 90279ac10..4d2fac1cd 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateSettersAndGettersAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateSettersAndGettersAction.kt @@ -38,7 +38,6 @@ import com.itsaky.androidide.preferences.internal.tabSize import com.itsaky.androidide.preferences.utils.indentationString import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import io.github.rosemoe.sora.widget.CodeEditor import jdkx.lang.model.element.Modifier.FINAL @@ -46,6 +45,7 @@ import jdkx.lang.model.element.VariableElement import openjdk.source.tree.ClassTree import openjdk.source.util.TreePath import openjdk.source.util.Trees +import org.slf4j.LoggerFactory import java.util.concurrent.CompletableFuture /** @@ -55,17 +55,23 @@ import java.util.concurrent.CompletableFuture * @author Akash Yadav */ class GenerateSettersAndGettersAction : FieldBasedAction() { + override val id: String = "ide.editor.lsp.java.generator.settersAndGetters" override var label: String = "" - private val log = ILogger.newInstance(javaClass.simpleName) override val titleTextRes: Int = R.string.action_generate_setters_getters + companion object { + + private val log = LoggerFactory.getLogger(GenerateSettersAndGettersAction::class.java) + } + override fun onGetFields(fields: List, data: ActionData) { showFieldSelector(fields, data) { checkedNames -> CompletableFuture.runAsync { generateForFields(data, checkedNames) } - .whenComplete { _, error, + .whenComplete { + _, error, -> if (error != null) { log.error("Unable to generate setters and getters", error) @@ -95,7 +101,7 @@ class GenerateSettersAndGettersAction : FieldBasedAction() { fields.removeIf { !names.contains("${it.name}: ${it.type}") } - log.debug("Creating setters/getters for fields", fields.map { it.name }) + log.debug("Creating setters/getters for fields: {}", fields.map { it.name }) generateForFields(data, task, type, fields.map { TreePath(typeFinder.path, it) }) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateToStringMethodAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateToStringMethodAction.kt index 24b4b0185..f67a13d10 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateToStringMethodAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/GenerateToStringMethodAction.kt @@ -34,10 +34,8 @@ import com.itsaky.androidide.preferences.utils.indentationString import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R import com.itsaky.androidide.resources.R.string -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import io.github.rosemoe.sora.widget.CodeEditor -import java.util.concurrent.CompletableFuture import jdkx.lang.model.element.VariableElement import openjdk.source.tree.ClassTree import openjdk.source.tree.VariableTree @@ -48,6 +46,8 @@ import openjdk.tools.javac.code.Symbol.MethodSymbol import openjdk.tools.javac.tree.JCTree import openjdk.tools.javac.tree.TreeInfo import openjdk.tools.javac.util.Names +import org.slf4j.LoggerFactory +import java.util.concurrent.CompletableFuture /** * Generates the `toString()` method for the current class. @@ -55,11 +55,14 @@ import openjdk.tools.javac.util.Names * @author Akash Yadav */ class GenerateToStringMethodAction : FieldBasedAction() { + override val titleTextRes: Int = R.string.action_generate_toString override val id: String = "ide.editor.lsp.java.generator.toString" override var label: String = "" - private val log = ILogger.newInstance(javaClass.simpleName) + companion object { + private val log = LoggerFactory.getLogger(GenerateToStringMethodAction::class.java) + } override fun onGetFields(fields: List, data: ActionData) { showFieldSelector(fields, data) { selected -> @@ -93,7 +96,7 @@ class GenerateToStringMethodAction : FieldBasedAction() { fields.removeIf { !selected.contains("${it.name}: ${it.type}") } - log.debug("Creating toString() method with fields: ", fields.map { it.name }) + log.debug("Creating toString() method with fields: {}", fields.map { it.name }) generateForFields(data, task, type, fields.map { TreePath(typeFinder.path, it) }) } @@ -109,7 +112,7 @@ class GenerateToStringMethodAction : FieldBasedAction() { ThreadUtils.runOnUiThread { flashError(data[Context::class.java]!!.getString(string.msg_toString_overridden)) } - log.warn("toString() method has already been overridden in class ${type.simpleName}") + log.warn("toString() method has already been overridden in class {}", type.simpleName) return } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/OverrideSuperclassMethodsAction.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/OverrideSuperclassMethodsAction.kt index a4b45720a..e0b8ef4fa 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/OverrideSuperclassMethodsAction.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/actions/generators/OverrideSuperclassMethodsAction.kt @@ -40,7 +40,6 @@ import com.itsaky.androidide.preferences.internal.tabSize import com.itsaky.androidide.preferences.utils.indentationString import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import io.github.rosemoe.sora.widget.CodeEditor import jdkx.lang.model.element.ElementKind @@ -52,6 +51,7 @@ import jdkx.lang.model.type.ExecutableType import jdkx.tools.JavaFileObject import openjdk.source.tree.MethodTree import openjdk.source.util.Trees +import org.slf4j.LoggerFactory import java.util.Arrays import java.util.Optional import java.util.concurrent.CompletableFuture @@ -66,9 +66,13 @@ class OverrideSuperclassMethodsAction : BaseJavaCodeAction() { override val titleTextRes: Int = R.string.action_override_superclass_methods override val id: String = "ide.editor.lsp.java.generator.overrideSuperclassMethods" override var label: String = "" - private val log = ILogger.newInstance(javaClass.simpleName) private var position: Long = -1 + companion object { + + private val log = LoggerFactory.getLogger(OverrideSuperclassMethodsAction::class.java) + } + override fun prepare(data: ActionData) { super.prepare(data) diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/CompileTask.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/CompileTask.java index b99914b6c..dac24ba96 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/CompileTask.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/CompileTask.java @@ -18,16 +18,13 @@ package com.itsaky.androidide.lsp.java.compiler; import androidx.annotation.NonNull; - import com.itsaky.androidide.javac.services.partial.DiagnosticListenerImpl; -import openjdk.source.tree.CompilationUnitTree; -import openjdk.tools.javac.api.JavacTaskImpl; - import java.nio.file.Path; import java.util.List; - import jdkx.tools.Diagnostic; import jdkx.tools.JavaFileObject; +import openjdk.source.tree.CompilationUnitTree; +import openjdk.tools.javac.api.JavacTaskImpl; public class CompileTask implements AutoCloseable { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/CompilerProvider.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/CompilerProvider.java index 983c07b29..db23b4ee7 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/CompilerProvider.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/CompilerProvider.java @@ -19,7 +19,6 @@ package com.itsaky.androidide.lsp.java.compiler; import com.itsaky.androidide.lsp.java.models.CompilationRequest; import com.itsaky.androidide.lsp.java.parser.ParseTask; - import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; @@ -28,7 +27,6 @@ import java.util.List; import java.util.Optional; import java.util.TreeSet; import java.util.stream.Collectors; - import jdkx.tools.JavaFileObject; public interface CompilerProvider { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerImpl.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerImpl.kt index 238b85595..d39eca4f4 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerImpl.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerImpl.kt @@ -22,15 +22,14 @@ import com.itsaky.androidide.javac.services.compiler.ReusableJavaCompiler import com.itsaky.androidide.lsp.java.parser.ts.TSJavaParser import com.itsaky.androidide.lsp.java.parser.ts.TSMethodPruner.prune import com.itsaky.androidide.projects.FileManager -import com.itsaky.androidide.utils.StopWatch import com.itsaky.androidide.utils.VMUtils import com.itsaky.androidide.utils.withStopWatch import jdkx.tools.JavaFileObject import jdkx.tools.JavaFileObject.Kind.SOURCE -import kotlin.io.path.name import openjdk.tools.javac.api.ClientCodeWrapper import openjdk.tools.javac.tree.JCTree.JCCompilationUnit import openjdk.tools.javac.util.Context +import kotlin.io.path.name class JavaCompilerImpl(context: Context?) : ReusableJavaCompiler(context) { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerService.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerService.java index 6930d3ae4..f4e0202a1 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerService.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/JavaCompilerService.java @@ -20,7 +20,6 @@ package com.itsaky.androidide.lsp.java.compiler; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.util.Pair; - import com.itsaky.androidide.eventbus.events.editor.DocumentChangeEvent; import com.itsaky.androidide.javac.services.compiler.ReusableCompiler; import com.itsaky.androidide.javac.services.partial.CompilationInfo; @@ -41,15 +40,8 @@ import com.itsaky.androidide.projects.util.BootClasspathProvider; import com.itsaky.androidide.projects.util.StringSearch; import com.itsaky.androidide.utils.Cache; import com.itsaky.androidide.utils.Environment; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.utils.SourceClassTrie; import com.itsaky.androidide.utils.StopWatch; -import openjdk.source.tree.CompilationUnitTree; -import openjdk.source.tree.MethodTree; -import openjdk.source.util.SourcePositions; -import openjdk.source.util.TreePath; -import openjdk.source.util.Trees; - import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -68,17 +60,23 @@ import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; - import jdkx.tools.Diagnostic; import jdkx.tools.JavaFileObject; import jdkx.tools.StandardLocation; +import openjdk.source.tree.CompilationUnitTree; +import openjdk.source.tree.MethodTree; +import openjdk.source.util.SourcePositions; +import openjdk.source.util.TreePath; +import openjdk.source.util.Trees; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class JavaCompilerService implements CompilerProvider { public static final JavaCompilerService NO_MODULE_COMPILER = new JavaCompilerService(null); private static final Cache cacheContainsWord = new Cache<>(); private static final Cache> cacheContainsType = new Cache<>(); - private static final ILogger LOG = ILogger.newInstance("JavaCompilerService"); + private static final Logger LOG = LoggerFactory.getLogger(JavaCompilerService.class); protected final Set classPathClasses; protected final List> diagnostics = new ArrayList<>(); protected final Map cachedModified = new HashMap<>(); @@ -290,7 +288,7 @@ public class JavaCompilerService implements CompilerProvider { private synchronized void reparseOrRecompile(CompilationRequest request) { // if (needsRecompilation(request)) { // LOG.warn("Cannot reparse. Recompilation is required"); - recompile(request); + recompile(request); // } else { // LOG.debug("Trying to perform a reparse..."); // tryReparse(request); @@ -309,7 +307,7 @@ public class JavaCompilerService implements CompilerProvider { private boolean isChangeValidForReparse() { return this.lastReparsePosition == Position.NONE || (this.newCursorPosition != Position.NONE - && this.lastReparsePosition.getLine() == this.newCursorPosition.getLine()); + && this.lastReparsePosition.getLine() == this.newCursorPosition.getLine()); } private void tryReparse(@NonNull final CompilationRequest request) { @@ -339,7 +337,7 @@ public class JavaCompilerService implements CompilerProvider { } final MethodTree methodTree = (MethodTree) currentMethod.second.getLeaf(); - LOG.debug("Trying to reparse method:", methodTree.getName()); + LOG.debug("Trying to reparse method: {}", methodTree.getName()); final CompilationInfo info = new CompilationInfo( @@ -352,12 +350,11 @@ public class JavaCompilerService implements CompilerProvider { if (start < 0 || end < 0 || start > end || end >= partialRequest.contents.length()) { LOG.warn( - "Cannot reparse. Invalid change delta. end:", + "Cannot reparse. Invalid change delta. end: {} changeDelta: {} content.length: {}", end, - "changeDelta:", this.changeDelta, - "content.length:", - partialRequest.contents.length()); + partialRequest.contents.length() + ); recompile(request); return; } @@ -375,7 +372,7 @@ public class JavaCompilerService implements CompilerProvider { } watch.log(); - LOG.info("Successfully reparsed method", methodTree.getName()); + LOG.info("Successfully reparsed method: {}", methodTree.getName()); updateModificationCache(request); cachedCompile.updatePositions(info.cu, true); this.changeDelta = 0; @@ -440,7 +437,7 @@ public class JavaCompilerService implements CompilerProvider { } // If the compiler needs additional source files that contain package-private files - LOG.info("...need to recompile with " + addFiles); + LOG.info("...need to recompile with {}", addFiles); firstAttempt.close(); firstAttempt.borrow.close(); diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/SourceFileManager.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/SourceFileManager.java index 0ae8165fe..872820958 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/SourceFileManager.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/compiler/SourceFileManager.java @@ -21,7 +21,6 @@ import static java.util.Collections.emptyList; import static java.util.Collections.emptySet; import androidx.annotation.NonNull; - import com.blankj.utilcode.util.CloseUtils; import com.itsaky.androidide.javac.config.JavacConfigProvider; import com.itsaky.androidide.javac.services.fs.AndroidFsProviderImpl; @@ -30,9 +29,7 @@ import com.itsaky.androidide.projects.api.ModuleProject; import com.itsaky.androidide.projects.util.StringSearch; import com.itsaky.androidide.utils.ClassTrie; import com.itsaky.androidide.utils.Environment; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.utils.SourceClassTrie; - import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -45,7 +42,6 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Stream; - import jdkx.tools.FileObject; import jdkx.tools.ForwardingJavaFileManager; import jdkx.tools.JavaFileObject; @@ -53,18 +49,19 @@ import jdkx.tools.StandardLocation; import openjdk.tools.javac.api.JavacTool; import openjdk.tools.javac.file.JavacFileManager; import openjdk.tools.javac.util.Context; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SourceFileManager extends ForwardingJavaFileManager { - public static final String ANDROIDIDE_CACHE_LOCATION = "ANDROIDIDE_CACHE_LOCATION"; public static final SourceFileManager NO_MODULE; - private static final ILogger LOG; + private static final Logger LOG; private static final Map cachedFileManagers = new ConcurrentHashMap<>(); static { // Initialize LOG first to prevent NPE - LOG = ILogger.newInstance("SourceFileManager"); + LOG = LoggerFactory.getLogger(SourceFileManager.class); NO_MODULE = new SourceFileManager(null); } @@ -81,8 +78,9 @@ public class SourceFileManager extends ForwardingJavaFileManager LOG.debug(String.valueOf(msg)), Locale.getDefault(), + StandardCharsets.UTF_8); } public void setLocationLogError(Location location, Iterable searchPath) { @@ -121,7 +120,7 @@ public class SourceFileManager extends ForwardingJavaFileManager it instanceof SourceClassTrie.SourceNode) .map(it -> asJavaFileObject((SourceClassTrie.SourceNode) it)); - + return stream::iterator; } @@ -164,7 +163,9 @@ public class SourceFileManager extends ForwardingJavaFileManager Unit) { try { semaphore.acquire() @@ -123,13 +129,7 @@ class SynchronizedTask { * **FOR INTERNAL USE ONLY!** */ fun logStats() { - log.warn("[SynchronizedTask] isCompiling =", isCompiling) - log.warn("[SynchronizedTask] queuedLength =", semaphore.queueLength) - } - - companion object { - - @PublishedApi - internal val log: ILogger = ILogger.newInstance("SynchronizedTask") + log.warn("[SynchronizedTask] isCompiling={} queuedLength={}", isCompiling, + semaphore.queueLength) } } \ No newline at end of file diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/edits/MultipleClassImportEditHandler.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/edits/MultipleClassImportEditHandler.kt index 02da367fe..8b9886bb3 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/edits/MultipleClassImportEditHandler.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/edits/MultipleClassImportEditHandler.kt @@ -17,10 +17,10 @@ package com.itsaky.androidide.lsp.java.edits -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.lsp.java.compiler.JavaCompilerService import com.itsaky.androidide.lsp.java.utils.EditHelper import io.github.rosemoe.sora.widget.CodeEditor +import org.slf4j.LoggerFactory import java.nio.file.Path /** @@ -36,7 +36,10 @@ class MultipleClassImportEditHandler( file: Path ) : AdvancedJavaEditHandler(file) { - private val log = ILogger.newInstance(javaClass.simpleName) + companion object { + + private val log = LoggerFactory.getLogger(MultipleClassImportEditHandler::class.java) + } override fun performEdits( compiler: JavaCompilerService, @@ -48,7 +51,7 @@ class MultipleClassImportEditHandler( try { edits.addAll(EditHelper.addImportIfNeeded(compiler, file, imported, className)) } catch (err: Throwable) { - log.error("Unable to compute edits to perform import for class:", className) + log.error("Unable to compute edits to perform import for class: {}", className) } } com.itsaky.androidide.lsp.util.RewriteHelper.performEdits(edits, editor) diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/CompilationRequest.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/CompilationRequest.kt index f57dcbe8e..e50cf4ef3 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/CompilationRequest.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/CompilationRequest.kt @@ -19,9 +19,9 @@ package com.itsaky.androidide.lsp.java.models import com.itsaky.androidide.lsp.java.compiler.CompilationTaskProcessor import com.itsaky.androidide.lsp.java.compiler.DefaultCompilationTaskProcessor -import java.util.function.Consumer import jdkx.tools.JavaFileObject import openjdk.tools.javac.util.Context +import java.util.function.Consumer /** * Data sent to compiler to request a compilation. diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/JavaServerConfiguration.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/JavaServerConfiguration.java index 061892daf..5d6bad8df 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/JavaServerConfiguration.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/models/JavaServerConfiguration.java @@ -18,7 +18,6 @@ package com.itsaky.androidide.lsp.java.models; import androidx.annotation.NonNull; - import java.nio.file.Path; import java.util.Collections; import java.util.Objects; 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 b7b4666e7..7b1fb9857 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 @@ -20,7 +20,6 @@ import static com.itsaky.androidide.preferences.internal.JavaPreferencesKt.GOOGL import static com.itsaky.androidide.preferences.internal.JavaPreferencesKt.isJavaDiagnosticsEnabled; import androidx.annotation.NonNull; - import com.google.googlejavaformat.java.JavaFormatterOptions; import com.itsaky.androidide.lsp.util.PrefBasedServerSettings; import com.itsaky.androidide.managers.PreferenceManager; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/Parser.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/Parser.java index 0ac349068..8a6ba9cc7 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/Parser.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/Parser.java @@ -23,7 +23,6 @@ import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; import com.itsaky.androidide.projects.IProjectManager; import com.itsaky.androidide.projects.api.ModuleProject; -import com.itsaky.androidide.utils.ILogger; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; @@ -43,12 +42,14 @@ import openjdk.source.util.SourcePositions; import openjdk.source.util.TreePath; import openjdk.source.util.Trees; import openjdk.tools.javac.api.JavacTool; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Parser { private static final JavaCompiler COMPILER = JavacTool.create(); private static SourceFileManager FILE_MANAGER = SourceFileManager.NO_MODULE; - private static final ILogger LOG = ILogger.newInstance("JavaParser"); + private static final Logger LOG = LoggerFactory.getLogger(Parser.class); private static Parser cachedParse; private static long cachedModified = -1; public final JavaFileObject file; @@ -136,7 +137,7 @@ public class Parser { // If start is -1, give up if (start == -1) { - LOG.warn(String.format("Couldn't locate `%s`", path.getLeaf())); + LOG.warn("Couldn't locate `{}`", path.getLeaf()); return Range.NONE; } // If end is bad, guess based on start @@ -156,7 +157,7 @@ public class Parser { String name = cls.getSimpleName().toString(); start = indexOf(contents, name, start); if (start == -1) { - LOG.warn(String.format("Couldn't find identifier `%s` in `%s`", name, path.getLeaf())); + LOG.warn("Couldn't find identifier `{}` in `{}`", name, path.getLeaf()); return Range.NONE; } end = start + name.length(); @@ -176,7 +177,7 @@ public class Parser { } start = indexOf(contents, name, start); if (start == -1) { - LOG.warn(String.format("Couldn't find identifier `%s` in `%s`", name, path.getLeaf())); + LOG.warn("Couldn't find identifier `{}` in `{}`", name, path.getLeaf()); return Range.NONE; } end = start + name.length(); @@ -193,7 +194,7 @@ public class Parser { String name = field.getName().toString(); start = indexOf(contents, name, start); if (start == -1) { - LOG.warn(String.format("Couldn't find identifier `%s` in `%s`", name, path.getLeaf())); + LOG.warn("Couldn't find identifier `{}` in `{}`", name, path.getLeaf()); return Range.NONE; } end = start + name.length(); @@ -203,7 +204,7 @@ public class Parser { String name = member.getIdentifier().toString(); start = indexOf(contents, name, start); if (start == -1) { - LOG.warn(String.format("Couldn't find identifier `%s` in `%s`", name, path.getLeaf())); + LOG.warn("Couldn't find identifier `{}` in `{}`", name, path.getLeaf()); return Range.NONE; } end = start + name.length(); diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSJavaParser.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSJavaParser.kt index 8036ba41b..9f9f277c2 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSJavaParser.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/parser/ts/TSJavaParser.kt @@ -22,12 +22,12 @@ import com.itsaky.androidide.eventbus.events.file.FileRenameEvent import com.itsaky.androidide.lsp.java.parser.IJavaParser import com.itsaky.androidide.treesitter.TSParser import com.itsaky.androidide.treesitter.java.TSLanguageJava -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.StopWatch import jdkx.tools.JavaFileObject import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.slf4j.LoggerFactory /** * [IJavaParser] which uses tree sitter to parse source files. @@ -36,7 +36,6 @@ import org.greenrobot.eventbus.ThreadMode */ object TSJavaParser : IJavaParser { - private val log = ILogger.newInstance("TSJavaParser") private val cache = TSParseCache(15) // cache 15 results at max private var isClosed = false @@ -46,6 +45,8 @@ object TSJavaParser : IJavaParser { return field } + private val log = LoggerFactory.getLogger(TSJavaParser::class.java) + init { EventBus.getDefault().register(this) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/BaseJavaServiceProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/BaseJavaServiceProvider.kt index e52ec8dce..b66a34385 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/BaseJavaServiceProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/BaseJavaServiceProvider.kt @@ -21,7 +21,6 @@ import com.itsaky.androidide.lookup.Lookup import com.itsaky.androidide.lsp.api.IServerSettings import com.itsaky.androidide.lsp.java.compiler.JavaCompilerService import com.itsaky.androidide.progress.ICancelChecker -import com.itsaky.androidide.utils.ILogger import java.nio.file.Path /** @@ -35,8 +34,6 @@ abstract class BaseJavaServiceProvider( protected val settings: IServerSettings ) { - private val log = ILogger.newInstance(javaClass.simpleName) - /** Abort the completion if cancelled. */ fun abortCompletionIfCancelled() { val checker = Lookup.getDefault().lookup(ICancelChecker::class.java) diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/CodeFormatProvider.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/CodeFormatProvider.java index 827f5ff0c..f73e2ab3c 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/CodeFormatProvider.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/CodeFormatProvider.java @@ -20,7 +20,6 @@ package com.itsaky.androidide.lsp.java.providers; import static com.google.common.collect.Range.closedOpen; import androidx.annotation.NonNull; - import com.google.common.collect.ImmutableList; import com.google.googlejavaformat.java.Formatter; import com.google.googlejavaformat.java.FormatterException; @@ -31,10 +30,10 @@ import com.itsaky.androidide.lsp.models.CodeFormatResult; import com.itsaky.androidide.lsp.models.FormatCodeParams; import com.itsaky.androidide.lsp.models.IndexedTextEdit; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.utils.StopWatch; - import java.util.Collection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Formats Java code using Google Java Format. @@ -43,7 +42,7 @@ import java.util.Collection; */ public class CodeFormatProvider { - private static final ILogger LOG = ILogger.newInstance("JavaCodeFormatProvider"); + private static final Logger LOG = LoggerFactory.getLogger(CodeFormatProvider.class); private final JavaServerSettings settings; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/CompletionProvider.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/CompletionProvider.java index 971932d66..7bfc0dca4 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/CompletionProvider.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/CompletionProvider.java @@ -47,22 +47,22 @@ import com.itsaky.androidide.lsp.java.visitors.FindCompletionsAt; import com.itsaky.androidide.lsp.models.CompletionParams; import com.itsaky.androidide.lsp.models.CompletionResult; import com.itsaky.androidide.utils.DocumentUtils; -import com.itsaky.androidide.utils.ILogger; import io.github.rosemoe.sora.lang.completion.snippet.CodeSnippet; import java.nio.file.Path; import java.time.Duration; import java.time.Instant; import java.util.Collections; -import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import openjdk.source.tree.Tree; import openjdk.source.util.TreePath; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class CompletionProvider extends AbstractServiceProvider implements ICompletionProvider { public static final int MAX_COMPLETION_ITEMS = CompletionResult.MAX_ITEMS; - private static final ILogger LOG = ILogger.newInstance("JavaCompletionProvider"); + private static final Logger LOG = LoggerFactory.getLogger(CompletionProvider.class); private final AtomicBoolean completing = new AtomicBoolean(false); private JavaCompilerService compiler; private CachedCompletion cache; @@ -73,8 +73,8 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp } public synchronized CompletionProvider reset(JavaCompilerService compiler, - IServerSettings settings, CachedCompletion cache, - Consumer nextCacheConsumer + IServerSettings settings, CachedCompletion cache, + Consumer nextCacheConsumer ) { this.compiler = compiler; this.cache = cache; @@ -121,7 +121,7 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp Path file = params.getFile(); int line = params.getPosition().getLine(); int column = params.getPosition().getColumn(); - LOG.info("Complete at " + file.getFileName() + "(" + line + "," + column + ")..."); + LOG.info("Complete at {}({},{})...", file.getFileName(), line, column); Instant started = Instant.now(); @@ -129,21 +129,21 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp final String prefix = params.requirePrefix(); final String partial = partialIdentifier(prefix, prefix.length()); final CompletionResult result = CompletionResult.mapAndFilter(this.cache.getResult(), partial, - item -> { - final var description = item.getSnippetDescription(); - var deleteSelected = true; - var allowCommands = false; - CodeSnippet snippet = null; + item -> { + final var description = item.getSnippetDescription(); + var deleteSelected = true; + var allowCommands = false; + CodeSnippet snippet = null; - if (description != null) { - deleteSelected = description.getDeleteSelected(); - allowCommands = description.getAllowCommandExecution(); - snippet = description.getSnippet(); - } + if (description != null) { + deleteSelected = description.getDeleteSelected(); + allowCommands = description.getAllowCommandExecution(); + snippet = description.getSnippet(); + } - item.setSnippetDescription( - describeSnippet(partial, deleteSelected, snippet, allowCommands)); - }); + item.setSnippetDescription( + describeSnippet(partial, deleteSelected, snippet, allowCommands)); + }); result.markCached(); @@ -179,7 +179,7 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp final String contentString = contents.toString(); final PartialReparseRequest partialRequest = new PartialReparseRequest( - cursor - params.requirePrefix().length(), contentString); + cursor - params.requirePrefix().length(), contentString); abortIfCancelled(); abortCompletionIfCancelled(); @@ -212,9 +212,12 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp private void logCompletionDuration(Instant started, @NonNull CompletionResult result) { long elapsedMs = Duration.between(started, Instant.now()).toMillis(); - LOG.info(String.format(Locale.US, "Found %d items%s%sin %,d ms", result.getItems().size(), - result.isIncomplete() ? " (incomplete) " : "", result.isCached() ? " (cached) " : " ", - elapsedMs)); + LOG.info("Found {} items{}{}in {} ms", + result.getItems().size(), + result.isIncomplete() ? " (incomplete) " : "", + result.isCached() ? " (cached) " : " ", + elapsedMs + ); } private int endOfLine(@NonNull CharSequence contents, int cursor) { @@ -229,7 +232,7 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp } private CompletionResult compileAndComplete(String contents, CompletionParams params, - PartialReparseRequest partialRequest + PartialReparseRequest partialRequest ) { final long cursor = params.getPosition().requireIndex(); final var file = params.getFile(); @@ -242,7 +245,7 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp abortCompletionIfCancelled(); final CompilationRequest request = new CompilationRequest(Collections.singletonList(source), - partialRequest); + partialRequest); request.configureContext = ctx -> { final var config = JavaCompilerConfig.instance(ctx); config.setCompletionInfo(new CompletionInfo(params.getPosition())); @@ -256,7 +259,7 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp } abortIfCancelled(); abortCompletionIfCancelled(); - LOG.info("...compiled in " + Duration.between(started, Instant.now()).toMillis() + "ms"); + LOG.info("...compiled in {}ms", Duration.between(started, Instant.now()).toMillis()); TreePath path = new FindCompletionsAt(task.task).scan(task.root(), cursor); abortIfCancelled(); @@ -283,8 +286,8 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp @NonNull private CompletionResult doComplete(final Path file, final String contents, final long cursor, - final String partial, final boolean endsWithParen, - final CompileTask task, final TreePath path + final String partial, final boolean endsWithParen, + final CompileTask task, final TreePath path ) { final Class klass; abortIfCancelled(); @@ -311,12 +314,12 @@ public class CompletionProvider extends AbstractServiceProvider implements IComp } final IJavaCompletionProvider provider = ReflectUtils.reflect(klass) - .newInstance(file, cursor, compiler, getSettings()) - .get(); + .newInstance(file, cursor, compiler, getSettings()) + .get(); if (provider instanceof ImportCompletionProvider) { ((ImportCompletionProvider) provider).setImportPath( - qualifiedPartialIdentifier(contents, (int) cursor)); + qualifiedPartialIdentifier(contents, (int) cursor)); } abortIfCancelled(); diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/DefinitionProvider.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/DefinitionProvider.java index ede72705e..ae62e8175 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/DefinitionProvider.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/DefinitionProvider.java @@ -33,7 +33,6 @@ import com.itsaky.androidide.models.Location; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.progress.ICancelChecker; import com.itsaky.androidide.utils.DocumentUtils; -import com.itsaky.androidide.utils.ILogger; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; @@ -43,11 +42,13 @@ import jdkx.lang.model.element.Element; import jdkx.lang.model.element.TypeElement; import jdkx.lang.model.type.TypeKind; import jdkx.tools.JavaFileObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class DefinitionProvider extends CancelableServiceProvider { public static final List NOT_SUPPORTED = Collections.emptyList(); - private static final ILogger LOG = ILogger.newInstance("JavaDefinitionProvider"); + private static final Logger LOG = LoggerFactory.getLogger(DefinitionProvider.class); private final JavaCompilerService compiler; private final IServerSettings settings; private Path file; @@ -71,7 +72,7 @@ public class DefinitionProvider extends CancelableServiceProvider { this.position = new Position(this.line, this.column); final List locations = findDefinition(); - LOG.debug("Found", locations.size(), "definitions..."); + LOG.debug("Found {} definitions...", locations.size()); return new DefinitionResult(locations); } @@ -83,7 +84,7 @@ public class DefinitionProvider extends CancelableServiceProvider { compile.get(task -> NavigationHelper.findElement(task, file, line, column, this)); if (element == null) { - LOG.error("Cannot find element at line:", line, "and column:", column); + LOG.error("Cannot find element at line: {} and column: {}", line, column); return NOT_SUPPORTED; } @@ -98,13 +99,13 @@ public class DefinitionProvider extends CancelableServiceProvider { if (provider == null) { final String className = className(element); if (TextUtils.isEmpty(className)) { - LOG.error("No class name found for element:", element); + LOG.error("No class name found for element: {}", element); return NOT_SUPPORTED; } final Optional optional = compiler.findAnywhere(className); if (!optional.isPresent()) { - LOG.error("Cannot find source file for class:", className); + LOG.error("Cannot find source file for class: {}", className); return NOT_SUPPORTED; } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/DiagnosticsProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/DiagnosticsProvider.kt index 616058da3..abb6a3316 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/DiagnosticsProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/DiagnosticsProvider.kt @@ -28,6 +28,9 @@ import com.itsaky.androidide.models.Range import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled import com.itsaky.androidide.projects.FileManager import com.itsaky.androidide.utils.DocumentUtils.isSameFile +import jdkx.lang.model.element.Element +import jdkx.tools.Diagnostic +import jdkx.tools.JavaFileObject import openjdk.source.tree.BlockTree import openjdk.source.tree.ClassTree import openjdk.source.tree.CompilationUnitTree @@ -40,10 +43,6 @@ import java.nio.file.Path import java.nio.file.Paths import java.util.Locale import java.util.regex.Pattern -import jdkx.lang.model.element.Element -import jdkx.tools.Diagnostic -import jdkx.tools.JavaFileObject -import java.lang.IndexOutOfBoundsException /** * Finds errors and warnings from a compilation task. 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 892782ebc..8448d4401 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 @@ -25,7 +25,7 @@ import com.itsaky.androidide.progress.ProgressManager import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled import com.itsaky.androidide.projects.FileManager import com.itsaky.androidide.projects.IProjectManager -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.nio.file.Path import java.time.Instant import java.util.concurrent.atomic.AtomicBoolean @@ -37,12 +37,16 @@ import java.util.concurrent.atomic.AtomicBoolean */ class JavaDiagnosticProvider { - private val log = ILogger.newInstance(javaClass.simpleName) private val analyzeTimestamps = mutableMapOf() private var cachedDiagnostics = DiagnosticResult.NO_UPDATE private var analyzing = AtomicBoolean(false) private var analyzingThread: AnalyzingThread? = null + companion object { + + private val log = LoggerFactory.getLogger(JavaDiagnosticProvider::class.java) + } + fun analyze(file: Path): DiagnosticResult { val module = IProjectManager.getInstance().findModuleForFile(file, false) @@ -51,7 +55,7 @@ class JavaDiagnosticProvider { abortIfCancelled() - log.debug("Analyzing:", file) + log.debug("Analyzing: {}", file) val modifiedAt = FileManager.getLastModified(file) val analyzedAt = analyzeTimestamps[file] @@ -110,7 +114,7 @@ class JavaDiagnosticProvider { } ) return result.also { - log.info("Analyze file completed. Found ${result.diagnostics.size} diagnostic items") + log.info("Analyze file completed. Found {} diagnostic items", result.diagnostics.size) } } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/JavaSelectionProvider.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/JavaSelectionProvider.java index 1ff21dcfc..aa80b2a45 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/JavaSelectionProvider.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/JavaSelectionProvider.java @@ -18,13 +18,13 @@ package com.itsaky.androidide.lsp.java.providers; import androidx.annotation.NonNull; - -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.visitors.FindBiggerRange; import com.itsaky.androidide.lsp.models.ExpandSelectionParams; import com.itsaky.androidide.models.Range; import openjdk.source.tree.CompilationUnitTree; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Selection provider implementation for Java. @@ -33,7 +33,7 @@ import openjdk.source.tree.CompilationUnitTree; */ public class JavaSelectionProvider { - private static final ILogger LOG = ILogger.newInstance("JavaSelectionProvider"); + private static final Logger LOG = LoggerFactory.getLogger(JavaSelectionProvider.class); private final CompilerProvider compiler; public JavaSelectionProvider(CompilerProvider compiler) { @@ -51,7 +51,7 @@ public class JavaSelectionProvider { final Range range = rangeFinder.scan(root, params.getSelection()); if (range != null) { - LOG.verbose("Expanding selection to range", range); + LOG.info("Expanding selection to range: {}", range); return range; } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ClassNamesCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ClassNamesCompletionProvider.kt index a4bf9a7cb..25dd6b33b 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ClassNamesCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ClassNamesCompletionProvider.kt @@ -108,7 +108,7 @@ class ClassNamesCompletionProvider( } } - log.info("...found " + list.size + " class names") + log.info("...found {} class names", list.size) return CompletionResult(list) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/IJavaCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/IJavaCompletionProvider.kt index 1fe458b49..3af144571 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/IJavaCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/IJavaCompletionProvider.kt @@ -45,8 +45,6 @@ import com.itsaky.androidide.lsp.models.MethodCompletionData import com.itsaky.androidide.lsp.snippets.ISnippet import com.itsaky.androidide.preferences.utils.indentationString import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled -import com.itsaky.androidide.utils.ILogger -import java.nio.file.Path import jdkx.lang.model.element.Element import jdkx.lang.model.element.ElementKind.ANNOTATION_TYPE import jdkx.lang.model.element.ElementKind.CLASS @@ -70,6 +68,9 @@ import jdkx.lang.model.element.TypeElement import jdkx.lang.model.element.VariableElement import openjdk.source.tree.Tree import openjdk.source.util.TreePath +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import java.nio.file.Path /** * Completion provider for Java source code. @@ -82,9 +83,13 @@ abstract class IJavaCompletionProvider( compiler: JavaCompilerService, settings: IServerSettings, ) : BaseJavaServiceProvider(completingFile, compiler, settings) { - protected val log: ILogger = ILogger.newInstance(javaClass.name) protected lateinit var filePackage: String protected lateinit var fileImports: Set + + companion object { + @JvmStatic + protected val log: Logger = LoggerFactory.getLogger(IJavaCompletionProvider::class.java) + } open fun complete( task: CompileTask, diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/IdentifierCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/IdentifierCompletionProvider.kt index ff1393fe6..eddd600d1 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/IdentifierCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/IdentifierCompletionProvider.kt @@ -23,8 +23,8 @@ import com.itsaky.androidide.lsp.java.compiler.JavaCompilerService import com.itsaky.androidide.lsp.models.CompletionItem import com.itsaky.androidide.lsp.models.CompletionResult import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled -import java.nio.file.Path import openjdk.source.util.TreePath +import java.nio.file.Path /** @author Akash Yadav */ class IdentifierCompletionProvider( diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ImportCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ImportCompletionProvider.kt index f49658d60..5daa6d57d 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ImportCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ImportCompletionProvider.kt @@ -30,12 +30,6 @@ import com.itsaky.androidide.projects.api.ModuleProject import com.itsaky.androidide.projects.util.BootClasspathProvider import com.itsaky.androidide.utils.ClassTrie import com.itsaky.androidide.utils.ClassTrie.Node -import openjdk.source.util.TreePath -import openjdk.tools.javac.api.JavacTrees -import openjdk.tools.javac.code.Symbol.MethodSymbol -import openjdk.tools.javac.model.JavacTypes -import openjdk.tools.javac.tree.JCTree.JCImport -import java.nio.file.Path import jdkx.lang.model.element.Element import jdkx.lang.model.element.ElementKind import jdkx.lang.model.element.ElementKind.ANNOTATION_TYPE @@ -50,6 +44,12 @@ import jdkx.lang.model.element.ElementKind.METHOD import jdkx.lang.model.element.ElementKind.STATIC_INIT import jdkx.lang.model.element.Modifier.STATIC import jdkx.lang.model.element.TypeElement +import openjdk.source.util.TreePath +import openjdk.tools.javac.api.JavacTrees +import openjdk.tools.javac.code.Symbol.MethodSymbol +import openjdk.tools.javac.model.JavacTypes +import openjdk.tools.javac.tree.JCTree.JCImport +import java.nio.file.Path /** * Provides completions for imports. @@ -78,7 +78,7 @@ class ImportCompletionProvider( return CompletionResult.EMPTY } - log.info("...complete import for path:", importPath) + log.info("...complete import for path: {}", importPath) val names: MutableSet = HashSet() val list = mutableListOf() diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/MemberReferenceCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/MemberReferenceCompletionProvider.kt index 1cad804f9..c5b53706f 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/MemberReferenceCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/MemberReferenceCompletionProvider.kt @@ -25,11 +25,6 @@ import com.itsaky.androidide.lsp.models.CompletionResult import com.itsaky.androidide.lsp.models.MatchLevel import com.itsaky.androidide.lsp.models.MatchLevel.NO_MATCH import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled -import openjdk.source.tree.MemberReferenceTree -import openjdk.source.tree.Scope -import openjdk.source.util.TreePath -import openjdk.source.util.Trees -import java.nio.file.Path import jdkx.lang.model.element.ElementKind.METHOD import jdkx.lang.model.element.ExecutableElement import jdkx.lang.model.element.Modifier.STATIC @@ -37,6 +32,11 @@ import jdkx.lang.model.element.TypeElement import jdkx.lang.model.type.ArrayType import jdkx.lang.model.type.DeclaredType import jdkx.lang.model.type.TypeVariable +import openjdk.source.tree.MemberReferenceTree +import openjdk.source.tree.Scope +import openjdk.source.util.TreePath +import openjdk.source.util.Trees +import java.nio.file.Path /** * Completions for member reference. @@ -58,7 +58,7 @@ class MemberReferenceCompletionProvider( ): CompletionResult { val trees = Trees.instance(task.task) val select = path.leaf as MemberReferenceTree - log.info("...complete methods of " + select.qualifierExpression) + log.info("...complete methods of {}", select.qualifierExpression) val exprPath = TreePath(path, select.qualifierExpression) val element = trees.getElement(exprPath) diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/MemberSelectCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/MemberSelectCompletionProvider.kt index f49b66322..2c02a267d 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/MemberSelectCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/MemberSelectCompletionProvider.kt @@ -26,12 +26,6 @@ import com.itsaky.androidide.lsp.models.CompletionResult import com.itsaky.androidide.lsp.models.MatchLevel import com.itsaky.androidide.lsp.models.MatchLevel.NO_MATCH import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled -import openjdk.source.tree.MemberSelectTree -import openjdk.source.tree.Scope -import openjdk.source.util.TreePath -import openjdk.source.util.Trees -import openjdk.tools.javac.code.Symbol -import java.nio.file.Path import jdkx.lang.model.element.ElementKind.CONSTRUCTOR import jdkx.lang.model.element.ElementKind.METHOD import jdkx.lang.model.element.ExecutableElement @@ -40,6 +34,12 @@ import jdkx.lang.model.element.TypeElement import jdkx.lang.model.type.ArrayType import jdkx.lang.model.type.DeclaredType import jdkx.lang.model.type.TypeVariable +import openjdk.source.tree.MemberSelectTree +import openjdk.source.tree.Scope +import openjdk.source.util.TreePath +import openjdk.source.util.Trees +import openjdk.tools.javac.code.Symbol +import java.nio.file.Path /** * Completions for member select. @@ -63,11 +63,11 @@ class MemberSelectCompletionProvider( val select = path.leaf as? MemberSelectTree ?: run { - log.error("A member select tree was expected but was ${path.leaf.javaClass}") + log.error("A member select tree was expected but was {}", path.leaf.javaClass) return CompletionResult.EMPTY } - log.info("...complete members of " + select.expression) + log.info("...complete members of {}", select.expression) val exprPath = TreePath(path, select.expression) val isStatic = trees.getElement(exprPath) is TypeElement @@ -79,8 +79,10 @@ class MemberSelectCompletionProvider( is ArrayType -> completeArrayMemberSelect(isStatic, partial) is TypeVariable -> completeTypeVariableMemberSelect(task, scope, type, isStatic, partial, endsWithParen) + is DeclaredType -> completeDeclaredTypeMemberSelect(task, scope, type, isStatic, partial, endsWithParen) + else -> CompletionResult.EMPTY } } @@ -120,6 +122,7 @@ class MemberSelectCompletionProvider( partial, endsWithParen ) + is TypeVariable -> completeTypeVariableMemberSelect( task, @@ -129,6 +132,7 @@ class MemberSelectCompletionProvider( partial, endsWithParen ) + else -> CompletionResult.EMPTY } } @@ -147,7 +151,11 @@ class MemberSelectCompletionProvider( val methods = mutableMapOf>() val matchLevels = mutableMapOf() - log.debug("DeclaredType $typeElement with members ${(typeElement as Symbol).members()} in scope: $scope") + log.debug("DeclaredType {} with members {} in scope: {}", + typeElement, + (typeElement as Symbol).members(), + scope + ) abortIfCancelled() abortCompletionIfCancelled() @@ -176,7 +184,7 @@ class MemberSelectCompletionProvider( } } - log.debug("Found ${list.size} members along with ${methods.size} methods") + log.debug("Found {} members along with {} methods", list.size, methods.size) abortIfCancelled() abortCompletionIfCancelled() @@ -208,13 +216,13 @@ class MemberSelectCompletionProvider( if (method != null && method.modifiers.contains(STATIC)) { return false } - + // If we find the enclosing class val thisElement = s.enclosingClass if (thisElement != null && thisElement.asType() == type) { return true } - + // If the enclosing class is static, stop looking if (thisElement != null && thisElement.modifiers.contains(STATIC)) { return false diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ScopeCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ScopeCompletionProvider.kt index 4a5a917aa..371004abe 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ScopeCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/ScopeCompletionProvider.kt @@ -100,7 +100,7 @@ class ScopeCompletionProvider( } } - log.info("...found " + list.size + " scope members") + log.info("...found {} scope members", list.size) return CompletionResult(list) } @@ -133,19 +133,19 @@ class ScopeCompletionProvider( val parentElement = Trees.instance(task.task).getElement(parentPath) ?: // Can't get further information for overriding this method - return method(task, listOf(method), !endsWithParen, matchLevel, partial) + return method(task, listOf(method), !endsWithParen, matchLevel, partial) val type = parentElement.asType() as DeclaredType val enclosing = method.enclosingElement val isFinalClass = enclosing.modifiers.contains(FINAL) val isNotOverridable = (method.modifiers.contains(STATIC) || - method.modifiers.contains(FINAL) || - method.modifiers.contains(PRIVATE)) + method.modifiers.contains(FINAL) || + method.modifiers.contains(PRIVATE)) if ( isFinalClass || - isNotOverridable || - !types.isAssignable(type, enclosing.asType()) || - parentPath.leaf !is ClassTree + isNotOverridable || + !types.isAssignable(type, enclosing.asType()) || + parentPath.leaf !is ClassTree ) { // Override is not possible return method(task, listOf(method), !endsWithParen, matchLevel, partial) @@ -157,7 +157,7 @@ class ScopeCompletionProvider( try { builder = buildMethod(method, types, type) } catch (error: Throwable) { - log.error("Cannot override method:", method.simpleName, error.message) + log.error("Cannot override method:{} err={}", method.simpleName, error.message) return method(task, listOf(method), !endsWithParen, matchLevel, partial) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/SnippetCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/SnippetCompletionProvider.kt index ec9a4aefb..551e9f056 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/SnippetCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/SnippetCompletionProvider.kt @@ -28,11 +28,11 @@ import com.itsaky.androidide.lsp.models.MatchLevel import com.itsaky.androidide.lsp.snippets.ISnippet import com.itsaky.androidide.preferences.internal.tabSize import io.github.rosemoe.sora.text.TextUtils -import java.nio.file.Path import openjdk.source.tree.ClassTree import openjdk.source.tree.CompilationUnitTree import openjdk.source.tree.MethodTree import openjdk.source.util.TreePath +import java.nio.file.Path /** * Provides snippet completion for Java files. diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/StaticImportCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/StaticImportCompletionProvider.kt index 8e7efebaa..c348a29da 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/StaticImportCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/StaticImportCompletionProvider.kt @@ -26,17 +26,17 @@ import com.itsaky.androidide.lsp.models.CompletionResult import com.itsaky.androidide.lsp.models.MatchLevel import com.itsaky.androidide.lsp.models.MatchLevel.NO_MATCH import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled -import openjdk.source.tree.CompilationUnitTree -import openjdk.source.tree.MemberSelectTree -import openjdk.source.util.TreePath -import openjdk.source.util.Trees -import java.nio.file.Path import jdkx.lang.model.element.Element import jdkx.lang.model.element.ElementKind.METHOD import jdkx.lang.model.element.ExecutableElement import jdkx.lang.model.element.Modifier.STATIC import jdkx.lang.model.element.Name import jdkx.lang.model.element.TypeElement +import openjdk.source.tree.CompilationUnitTree +import openjdk.source.tree.MemberSelectTree +import openjdk.source.util.TreePath +import openjdk.source.util.Trees +import java.nio.file.Path /** * Completes static imports. @@ -113,7 +113,7 @@ class StaticImportCompletionProvider( list.add(method(task, value, !endsWithParen, matchLevel, partial)) } - log.info("...found " + list.size + " static imports") + log.info("...found {} static imports", list.size) return CompletionResult(list) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/SwitchConstantCompletionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/SwitchConstantCompletionProvider.kt index ed4ccf2d8..9ba5bbffc 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/SwitchConstantCompletionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/completion/SwitchConstantCompletionProvider.kt @@ -23,14 +23,14 @@ import com.itsaky.androidide.lsp.java.compiler.JavaCompilerService import com.itsaky.androidide.lsp.models.CompletionResult import com.itsaky.androidide.lsp.models.MatchLevel.NO_MATCH import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled -import openjdk.source.tree.SwitchTree -import openjdk.source.util.TreePath -import openjdk.source.util.Trees -import java.nio.file.Path import jdkx.lang.model.element.ElementKind.ENUM import jdkx.lang.model.element.ElementKind.ENUM_CONSTANT import jdkx.lang.model.element.TypeElement import jdkx.lang.model.type.DeclaredType +import openjdk.source.tree.SwitchTree +import openjdk.source.util.TreePath +import openjdk.source.util.Trees +import java.nio.file.Path /** * Provides completions for switch constants. @@ -71,7 +71,7 @@ class SwitchConstantCompletionProvider( return completeIdentifier(task, exprPath, partial, endsWithParen) } - log.info("...complete constants of type $type") + log.info("...complete constants of type {}", type) val list: MutableList = ArrayList() diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/ErroneousDefinitionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/ErroneousDefinitionProvider.kt index 0a419ea0a..6f01deb22 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/ErroneousDefinitionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/ErroneousDefinitionProvider.kt @@ -26,12 +26,12 @@ import com.itsaky.androidide.models.Location import com.itsaky.androidide.models.Position import com.itsaky.androidide.progress.ICancelChecker import com.itsaky.androidide.utils.DocumentUtils.isSameFile -import openjdk.source.util.Trees -import java.nio.file.Path -import java.nio.file.Paths import jdkx.lang.model.element.Element import jdkx.lang.model.element.TypeElement import jdkx.tools.JavaFileObject +import openjdk.source.util.Trees +import java.nio.file.Path +import java.nio.file.Paths /** * Finds definition for erroneous elements. @@ -57,7 +57,7 @@ class ErroneousDefinitionProvider( val otherFile = compiler.findAnywhere(className) abortIfCancelled() if (!otherFile.isPresent) { - log.error("Cannot find source file for class:", className) + log.error("Cannot find source file for class: {}", className) return emptyList() } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/IJavaDefinitionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/IJavaDefinitionProvider.kt index 0ff806c78..e67720848 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/IJavaDefinitionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/IJavaDefinitionProvider.kt @@ -24,8 +24,9 @@ import com.itsaky.androidide.lsp.java.providers.DefinitionProvider import com.itsaky.androidide.models.Location import com.itsaky.androidide.models.Position import com.itsaky.androidide.progress.ICancelChecker -import com.itsaky.androidide.utils.ILogger import jdkx.lang.model.element.Element +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.nio.file.Path /** @@ -41,11 +42,15 @@ abstract class IJavaDefinitionProvider( cancelChecker: ICancelChecker ) : BaseJavaServiceProvider(completingFile, compiler, settings), ICancelChecker by cancelChecker { - protected val log = ILogger.newInstance(javaClass.simpleName) - protected val line = position.line protected val column = position.column + companion object { + + @JvmStatic + protected val log: Logger = LoggerFactory.getLogger(IJavaDefinitionProvider::class.java) + } + /** * Finds the definition for the given element. * @param element The element to find definition for. diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/LocalDefinitionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/LocalDefinitionProvider.kt index 49e70e408..5102b2eec 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/LocalDefinitionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/LocalDefinitionProvider.kt @@ -23,9 +23,9 @@ import com.itsaky.androidide.lsp.java.utils.FindHelper import com.itsaky.androidide.models.Location import com.itsaky.androidide.models.Position import com.itsaky.androidide.progress.ICancelChecker +import jdkx.lang.model.element.Element import openjdk.source.util.Trees import java.nio.file.Path -import jdkx.lang.model.element.Element /** * Provides definition for local elements. @@ -44,7 +44,7 @@ class LocalDefinitionProvider( val trees = Trees.instance(it.task) val path = trees.getPath(element) if (path == null) { - log.error("TreePath of element is null. Cannot find definition.", "Element is", element) + log.error("TreePath of element is null. Cannot find definition. Element is {}", element) return@get emptyList() } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/RemoteDefinitionProvider.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/RemoteDefinitionProvider.kt index ecccf8ad7..da9a574de 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/RemoteDefinitionProvider.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/providers/definition/RemoteDefinitionProvider.kt @@ -19,14 +19,12 @@ package com.itsaky.androidide.lsp.java.providers.definition import com.itsaky.androidide.lsp.api.IServerSettings import com.itsaky.androidide.lsp.java.compiler.JavaCompilerService -import com.itsaky.androidide.lsp.java.compiler.SourceFileObject -import com.itsaky.androidide.lsp.java.utils.NavigationHelper import com.itsaky.androidide.models.Location import com.itsaky.androidide.models.Position import com.itsaky.androidide.progress.ICancelChecker -import java.nio.file.Path import jdkx.lang.model.element.Element import jdkx.tools.JavaFileObject +import java.nio.file.Path /** * Finds definition of an element in other source locations. diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/AddImport.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/AddImport.java index e882f632a..ae03d08be 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/AddImport.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/AddImport.java @@ -19,14 +19,12 @@ package com.itsaky.androidide.lsp.java.rewrite; import androidx.annotation.NonNull; import androidx.annotation.RestrictTo; - import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.parser.ParseTask; import com.itsaky.androidide.lsp.java.utils.InsertUtilsKt; +import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.lsp.models.TextEdit; - import java.nio.file.Path; import java.util.Collections; import java.util.Map; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ConvertFieldToBlock.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ConvertFieldToBlock.java index dbc14cbb5..536929182 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ConvertFieldToBlock.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ConvertFieldToBlock.java @@ -21,24 +21,21 @@ import static com.itsaky.androidide.lsp.java.rewrite.ConvertVariableToStatement. import static com.itsaky.androidide.lsp.java.rewrite.ConvertVariableToStatement.isExpressionStatement; import androidx.annotation.NonNull; - import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.parser.ParseTask; +import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.lsp.models.TextEdit; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Map; +import jdkx.lang.model.element.Modifier; import openjdk.source.tree.ExpressionTree; import openjdk.source.tree.LineMap; import openjdk.source.tree.VariableTree; import openjdk.source.util.SourcePositions; import openjdk.source.util.Trees; -import java.nio.file.Path; -import java.util.Collections; -import java.util.Map; - -import jdkx.lang.model.element.Modifier; - public class ConvertFieldToBlock extends Rewrite { final Path file; final int position; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ConvertVariableToStatement.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ConvertVariableToStatement.java index ab13762f4..6f23dc1fc 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ConvertVariableToStatement.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ConvertVariableToStatement.java @@ -18,13 +18,15 @@ package com.itsaky.androidide.lsp.java.rewrite; import androidx.annotation.NonNull; - import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.parser.ParseTask; import com.itsaky.androidide.lsp.java.visitors.FindVariableAtCursor; +import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.lsp.models.TextEdit; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Map; import openjdk.source.tree.ExpressionTree; import openjdk.source.tree.LineMap; import openjdk.source.tree.Tree; @@ -32,10 +34,6 @@ import openjdk.source.tree.VariableTree; import openjdk.source.util.SourcePositions; import openjdk.source.util.Trees; -import java.nio.file.Path; -import java.util.Collections; -import java.util.Map; - public class ConvertVariableToStatement extends Rewrite { final Path file; final int position; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/CreateMissingMethod.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/CreateMissingMethod.java index a39c63e3a..3b6ae1935 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/CreateMissingMethod.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/CreateMissingMethod.java @@ -32,7 +32,6 @@ import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; import com.itsaky.androidide.preferences.utils.EditorUtilKt; -import com.itsaky.androidide.utils.ILogger; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; @@ -53,10 +52,12 @@ import openjdk.source.tree.MethodTree; import openjdk.source.tree.Tree; import openjdk.source.util.TreePath; import openjdk.source.util.Trees; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class CreateMissingMethod extends Rewrite { - private static final ILogger LOG = ILogger.newInstance("main"); + private static final Logger LOG = LoggerFactory.getLogger(CreateMissingMethod.class); private static final String TODO_COMMENT = "// TODO: Implement this method"; final Path file; final int position; @@ -189,7 +190,7 @@ public class CreateMissingMethod extends Rewrite { ) { String methodName = extractMethodName(call.getMethodSelect()); String returnType = type == null || "(ERROR)".equals(type) ? "void" : type; - LOG.info("Creating missing method '" + methodName + "' with return type: " + returnType); + LOG.info("Creating missing method '{}' with return type: {}", methodName, returnType); String parameters = printParameters(task, call); String modifiers = isMemberSelect ? "public" : "private"; if (isStatic) { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/GenerateRecordConstructor.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/GenerateRecordConstructor.java index 568f057c4..8181793fa 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/GenerateRecordConstructor.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/GenerateRecordConstructor.java @@ -18,24 +18,15 @@ package com.itsaky.androidide.lsp.java.rewrite; import androidx.annotation.NonNull; - -import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; -import com.itsaky.androidide.preferences.utils.EditorUtilKt; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.lsp.java.compiler.CompileTask; import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.compiler.SynchronizedTask; import com.itsaky.androidide.lsp.java.utils.EditHelper; +import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.lsp.models.TextEdit; -import openjdk.source.tree.ClassTree; -import openjdk.source.tree.MethodTree; -import openjdk.source.tree.Tree; -import openjdk.source.tree.VariableTree; -import openjdk.source.util.SourcePositions; -import openjdk.source.util.Trees; - +import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; +import com.itsaky.androidide.preferences.utils.EditorUtilKt; import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; @@ -44,13 +35,20 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringJoiner; - import jdkx.lang.model.element.Modifier; import jdkx.lang.model.element.TypeElement; +import openjdk.source.tree.ClassTree; +import openjdk.source.tree.MethodTree; +import openjdk.source.tree.Tree; +import openjdk.source.tree.VariableTree; +import openjdk.source.util.SourcePositions; +import openjdk.source.util.Trees; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class GenerateRecordConstructor extends Rewrite { - private static final ILogger LOG = ILogger.newInstance("main"); + private static final Logger LOG = LoggerFactory.getLogger(GenerateRecordConstructor.class); final String className; public GenerateRecordConstructor(String className) { @@ -60,12 +58,12 @@ public class GenerateRecordConstructor extends Rewrite { @NonNull @Override public Map rewrite(@NonNull CompilerProvider compiler) { - LOG.info("Generate default constructor for " + className + "..."); + LOG.info("Generate default constructor for {}...", className); // TODO this needs to fall back on looking for inner classes and package-private classes Path file = compiler.findTypeDeclaration(className); if (file == CompilerProvider.NOT_FOUND) { - LOG.warn("Unable to find source file for class:", this.className); + LOG.warn("Unable to find source file for class: {}", this.className); return CANCELLED; } @@ -155,7 +153,7 @@ public class GenerateRecordConstructor extends Rewrite { if (member.getKind() == Tree.Kind.METHOD) { MethodTree method = (MethodTree) member; if (method.getReturnType() == null) continue; - LOG.info("...insert constructor before " + method.getName()); + LOG.info("...insert constructor before {}", method.getName()); return EditHelper.insertBefore(task.task, task.root(), method); } } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ImplementAbstractMethods.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ImplementAbstractMethods.java index 558bdd819..25f39d898 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ImplementAbstractMethods.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/ImplementAbstractMethods.java @@ -18,10 +18,6 @@ package com.itsaky.androidide.lsp.java.rewrite; import androidx.annotation.NonNull; import androidx.annotation.Nullable; - -import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; -import com.itsaky.androidide.preferences.utils.EditorUtilKt; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.lsp.java.compiler.CompileTask; import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.compiler.SynchronizedTask; @@ -31,17 +27,12 @@ import com.itsaky.androidide.lsp.java.visitors.FindAnonymousTypeDeclaration; import com.itsaky.androidide.lsp.java.visitors.FindTypeDeclarationAt; import com.itsaky.androidide.lsp.models.CodeActionItem; import com.itsaky.androidide.lsp.models.Command; +import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.lsp.models.TextEdit; +import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; +import com.itsaky.androidide.preferences.utils.EditorUtilKt; import com.squareup.javapoet.MethodSpec; -import openjdk.source.tree.ClassTree; -import openjdk.source.tree.CompilationUnitTree; -import openjdk.source.tree.ImportTree; -import openjdk.source.tree.Tree; -import openjdk.source.util.Trees; -import openjdk.tools.javac.util.JCDiagnostic; - import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; @@ -51,17 +42,24 @@ import java.util.Set; import java.util.StringJoiner; import java.util.TreeSet; import java.util.stream.Collectors; - import jdkx.lang.model.element.Element; import jdkx.lang.model.element.ElementKind; import jdkx.lang.model.element.ExecutableElement; import jdkx.lang.model.element.Modifier; import jdkx.lang.model.element.TypeElement; import jdkx.lang.model.util.Elements; +import openjdk.source.tree.ClassTree; +import openjdk.source.tree.CompilationUnitTree; +import openjdk.source.tree.ImportTree; +import openjdk.source.tree.Tree; +import openjdk.source.util.Trees; +import openjdk.tools.javac.util.JCDiagnostic; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ImplementAbstractMethods extends Rewrite { - private static final ILogger LOG = ILogger.newInstance("main"); + private static final Logger LOG = LoggerFactory.getLogger(ImplementAbstractMethods.class); private final String className; private final String classFile; private final long position; @@ -88,8 +86,8 @@ public class ImplementAbstractMethods extends Rewrite { public Map rewrite(@NonNull CompilerProvider compiler) { final Path file = compiler.findTypeDeclaration(this.classFile); if (file == CompilerProvider.NOT_FOUND) { - LOG.warn( - "Unable to find source file for class:", this.className, "classFile=", this.classFile); + LOG.warn("Unable to find source file for class: {} classFile={}", this.className, + this.classFile); return CANCELLED; } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/RemoveClass.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/RemoveClass.java index 3b7a05e7d..0adbf192d 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/RemoveClass.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/RemoveClass.java @@ -18,17 +18,15 @@ package com.itsaky.androidide.lsp.java.rewrite; import androidx.annotation.NonNull; - import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.parser.ParseTask; import com.itsaky.androidide.lsp.java.utils.EditHelper; import com.itsaky.androidide.lsp.java.visitors.FindTypeDeclarationAt; import com.itsaky.androidide.lsp.models.TextEdit; -import openjdk.source.tree.ClassTree; - import java.nio.file.Path; import java.util.Collections; import java.util.Map; +import openjdk.source.tree.ClassTree; public class RemoveClass extends Rewrite { final Path file; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/RemoveException.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/RemoveException.java index 844c6818d..e98aeafcb 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/RemoveException.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/rewrite/RemoveException.java @@ -21,10 +21,17 @@ import androidx.annotation.NonNull; import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.compiler.SynchronizedTask; import com.itsaky.androidide.lsp.java.utils.FindHelper; +import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.lsp.models.TextEdit; -import com.itsaky.androidide.utils.ILogger; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import jdkx.lang.model.element.TypeElement; +import jdkx.lang.model.type.DeclaredType; import openjdk.source.tree.CompilationUnitTree; import openjdk.source.tree.ExpressionTree; import openjdk.source.tree.LineMap; @@ -33,17 +40,8 @@ import openjdk.source.util.JavacTask; import openjdk.source.util.SourcePositions; import openjdk.source.util.TreePath; import openjdk.source.util.Trees; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.Collections; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import jdkx.lang.model.element.ExecutableElement; -import jdkx.lang.model.element.TypeElement; -import jdkx.lang.model.type.DeclaredType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class RemoveException extends Rewrite { @@ -52,7 +50,7 @@ public class RemoveException extends Rewrite { final String[] erasedParameterTypes; final String exceptionType; - private static final ILogger LOG = ILogger.newInstance("RemoveException"); + private static final Logger LOG = LoggerFactory.getLogger(RemoveException.class); public RemoveException( String className, String methodName, String[] erasedParameterTypes, String exceptionType) { @@ -68,7 +66,7 @@ public class RemoveException extends Rewrite { Path file = compiler.findTypeDeclaration(className); if (file == CompilerProvider.NOT_FOUND) { - LOG.warn("Unable to find source file for class:", this.className); + LOG.warn("Unable to find source file for class: {}", this.className); return CANCELLED; } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ASTFixer.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ASTFixer.java index 8ef5a5220..3fbf10daa 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ASTFixer.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ASTFixer.java @@ -18,23 +18,20 @@ package com.itsaky.androidide.lsp.java.utils; import androidx.annotation.NonNull; - import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Ordering; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import openjdk.source.tree.LineMap; import openjdk.tools.javac.parser.Scanner; import openjdk.tools.javac.parser.ScannerFactory; import openjdk.tools.javac.parser.Tokens; import openjdk.tools.javac.parser.Tokens.TokenKind; import openjdk.tools.javac.util.Context; - import org.jetbrains.annotations.Contract; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - /** * @author Akash Yadav */ diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/AnalyzeTimer.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/AnalyzeTimer.java index 00f3db813..f3a7cced4 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/AnalyzeTimer.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/AnalyzeTimer.java @@ -18,9 +18,7 @@ package com.itsaky.androidide.lsp.java.utils; import android.os.Handler; - import androidx.annotation.NonNull; - import java.util.Objects; /** diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/CodeActionUtils.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/CodeActionUtils.java index 5f9969483..e7267416c 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/CodeActionUtils.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/CodeActionUtils.java @@ -17,13 +17,9 @@ package com.itsaky.androidide.lsp.java.utils; -import static com.itsaky.androidide.utils.ILogger.newInstance; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.itsaky.androidide.javac.services.util.JavaDiagnosticUtils; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.lsp.java.compiler.CompileTask; import com.itsaky.androidide.lsp.java.compiler.CompilerProvider; import com.itsaky.androidide.lsp.java.rewrite.Rewrite; @@ -32,6 +28,13 @@ import com.itsaky.androidide.lsp.java.visitors.FindTypeDeclarationAt; import com.itsaky.androidide.lsp.models.CodeActionItem; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import jdkx.lang.model.element.ExecutableElement; +import jdkx.lang.model.element.TypeElement; +import jdkx.tools.Diagnostic; +import jdkx.tools.JavaFileObject; import openjdk.source.tree.ClassTree; import openjdk.source.tree.CompilationUnitTree; import openjdk.source.tree.LineMap; @@ -40,17 +43,9 @@ import openjdk.source.tree.Tree; import openjdk.source.util.TreePath; import openjdk.source.util.Trees; import openjdk.tools.javac.util.JCDiagnostic; - import org.jetbrains.annotations.Contract; - -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import jdkx.lang.model.element.ExecutableElement; -import jdkx.lang.model.element.TypeElement; -import jdkx.tools.Diagnostic; -import jdkx.tools.JavaFileObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Akash Yadav @@ -61,7 +56,7 @@ public class CodeActionUtils { Pattern.compile("^'((\\w+\\.)*\\w+)' is not thrown"); private static final Pattern UNREPORTED_EXCEPTION = Pattern.compile("unreported exception ((\\w+\\.)*\\w+)"); - private static final ILogger LOG = newInstance("JavaCodeActionUtils"); + private static final Logger LOG = LoggerFactory.getLogger(CodeActionUtils.class); public static CodeActionItem createQuickFix( final CompilerProvider compiler, String title, Rewrite rewrite) { @@ -104,7 +99,9 @@ public class CodeActionUtils { @Nullable public static String findClassNeedingConstructor(CompileTask task, Range range) { final ClassTree type = findClassTree(task, range); - if (type == null || hasConstructor(task, type)) return null; + if (type == null || hasConstructor(task, type)) { + return null; + } return qualifiedName(task, type); } @@ -167,7 +164,7 @@ public class CodeActionUtils { public static String extractNotThrownExceptionName(String message) { final Matcher matcher = NOT_THROWN_EXCEPTION.matcher(message); if (!matcher.find()) { - LOG.warn(String.format("`%s` doesn't match `%s`", message, NOT_THROWN_EXCEPTION)); + LOG.warn("`{}` doesn't match `{}`", message, NOT_THROWN_EXCEPTION); return ""; } return matcher.group(1); @@ -176,7 +173,7 @@ public class CodeActionUtils { public static String extractExceptionName(String message) { final Matcher matcher = UNREPORTED_EXCEPTION.matcher(message); if (!matcher.find()) { - LOG.warn(String.format("`%s` doesn't match `%s`", message, UNREPORTED_EXCEPTION)); + LOG.warn("`{}` doesn't match `{}`", message, UNREPORTED_EXCEPTION); return ""; } return matcher.group(1); diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/Extractors.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/Extractors.java index 43d61cb32..2d277a0fd 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/Extractors.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/Extractors.java @@ -18,7 +18,6 @@ package com.itsaky.androidide.lsp.java.utils; import androidx.annotation.NonNull; - import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/JavaParserUtils.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/JavaParserUtils.kt index 5d8c130df..7f0c5c83f 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/JavaParserUtils.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/JavaParserUtils.kt @@ -78,7 +78,14 @@ import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration import com.github.javaparser.printer.configuration.PrinterConfiguration import com.itsaky.androidide.lsp.java.utils.TypeUtils.toType import com.itsaky.androidide.lsp.java.visitors.PrettyPrintingVisitor -import com.itsaky.androidide.utils.ILogger +import jdkx.lang.model.element.ExecutableElement +import jdkx.lang.model.element.Modifier +import jdkx.lang.model.element.TypeParameterElement +import jdkx.lang.model.element.VariableElement +import jdkx.lang.model.type.ExecutableType +import jdkx.lang.model.type.TypeKind +import jdkx.lang.model.type.TypeMirror +import jdkx.lang.model.type.TypeVariable import openjdk.source.tree.AnnotationTree import openjdk.source.tree.AssignmentTree import openjdk.source.tree.BlockTree @@ -98,24 +105,14 @@ import openjdk.source.tree.StatementTree import openjdk.source.tree.Tree import openjdk.source.tree.TypeParameterTree import openjdk.source.tree.VariableTree -import java.util.* -import java.util.function.* -import java.util.stream.* -import jdkx.lang.model.element.ExecutableElement -import jdkx.lang.model.element.Modifier -import jdkx.lang.model.element.TypeParameterElement -import jdkx.lang.model.element.VariableElement -import jdkx.lang.model.type.ExecutableType -import jdkx.lang.model.type.TypeKind -import jdkx.lang.model.type.TypeMirror -import jdkx.lang.model.type.TypeVariable -import kotlin.jvm.optionals.getOrNull import org.jetbrains.annotations.Contract +import java.util.function.Predicate +import java.util.stream.IntStream +import java.util.stream.Stream +import kotlin.jvm.optionals.getOrNull object JavaParserUtils { - private val log = ILogger.newInstance(javaClass.simpleName) - /** * Collects all the type names from the given node. * @@ -128,8 +125,8 @@ object JavaParserUtils { if (returnType != null) { if ( returnType.kind != TypeKind.VOID && - returnType.kind != TypeKind.TYPEVAR && - !returnType.kind.isPrimitive + returnType.kind != TypeKind.TYPEVAR && + !returnType.kind.isPrimitive ) { val fqn = getTypeToImport(returnType) if (fqn != null) { @@ -242,6 +239,7 @@ object JavaParserUtils { LONG, FLOAT, INT -> IntegerLiteralExpr("0") + else -> NullLiteralExpr() } } @@ -572,8 +570,8 @@ object JavaParserUtils { methodDeclaration.parameters = IntStream.range(0, method.parameters.size) .mapToObj { - return@mapToObj toParameter(type!!.parameterTypes[it], method.parameters[it]).also { - parameter -> + return@mapToObj toParameter(type!!.parameterTypes[it], + method.parameters[it]).also { parameter -> val firstType = getTypeWithoutBounds(parameter.type) parameter.type = firstType } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/JavaPoetUtils.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/JavaPoetUtils.kt index 2ab7aacd9..4a2ec418e 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/JavaPoetUtils.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/JavaPoetUtils.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.lsp.java.utils -import com.itsaky.androidide.preferences.internal.tabSize import com.itsaky.androidide.preferences.utils.indentationString import com.squareup.javapoet.AnnotationSpec import com.squareup.javapoet.ImportCollectingCodeWriter diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/MarkdownHelper.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/MarkdownHelper.java index 6735a2c85..fa687be4c 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/MarkdownHelper.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/MarkdownHelper.java @@ -19,15 +19,6 @@ package com.itsaky.androidide.lsp.java.utils; import com.itsaky.androidide.lsp.models.MarkupContent; import com.itsaky.androidide.lsp.models.MarkupKind; -import openjdk.source.doctree.DocCommentTree; -import openjdk.source.doctree.DocTree; - -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; @@ -38,7 +29,6 @@ import java.util.function.Function; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -48,6 +38,13 @@ import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import openjdk.source.doctree.DocCommentTree; +import openjdk.source.doctree.DocTree; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; public class MarkdownHelper { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/MethodPtr.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/MethodPtr.java index bf7e5580d..803a3c1fb 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/MethodPtr.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/MethodPtr.java @@ -18,21 +18,18 @@ package com.itsaky.androidide.lsp.java.utils; import androidx.annotation.NonNull; - import com.squareup.javapoet.ImportCollectingCodeWriter; import com.squareup.javapoet.TypeName; -import openjdk.source.util.JavacTask; - import java.io.IOException; import java.util.Arrays; import java.util.Objects; - import jdkx.lang.model.element.ExecutableElement; import jdkx.lang.model.element.TypeElement; import jdkx.lang.model.element.VariableElement; import jdkx.lang.model.type.TypeKind; import jdkx.lang.model.type.TypeMirror; import jdkx.lang.model.util.Types; +import openjdk.source.util.JavacTask; /** * @author Akash Yadav diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/NavigationHelper.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/NavigationHelper.java index cff8a7919..309d5fe1f 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/NavigationHelper.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/NavigationHelper.java @@ -38,15 +38,13 @@ import androidx.annotation.Nullable; import com.itsaky.androidide.lsp.java.compiler.CompileTask; import com.itsaky.androidide.lsp.java.visitors.FindNameAt; import com.itsaky.androidide.progress.ICancelChecker; +import java.nio.file.Path; +import jdkx.lang.model.element.Element; +import jdkx.lang.model.element.Modifier; import openjdk.source.tree.CompilationUnitTree; import openjdk.source.util.TreePath; import openjdk.source.util.Trees; -import java.nio.file.Path; - -import jdkx.lang.model.element.Element; -import jdkx.lang.model.element.Modifier; - public class NavigationHelper { @Nullable diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ScopeHelper.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ScopeHelper.java index 97613e6aa..b7990091e 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ScopeHelper.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ScopeHelper.java @@ -18,18 +18,16 @@ package com.itsaky.androidide.lsp.java.utils; import com.itsaky.androidide.lsp.java.compiler.CompileTask; -import openjdk.source.tree.Scope; -import openjdk.source.util.Trees; - import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; - import jdkx.lang.model.element.Element; import jdkx.lang.model.element.Modifier; import jdkx.lang.model.element.TypeElement; import jdkx.lang.model.type.DeclaredType; import jdkx.lang.model.util.Elements; +import openjdk.source.tree.Scope; +import openjdk.source.util.Trees; public class ScopeHelper { public static List scopeMembers( diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ShortTypePrinter.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ShortTypePrinter.java index 5d9ee3a31..14a63d33b 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ShortTypePrinter.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/ShortTypePrinter.java @@ -1,7 +1,6 @@ package com.itsaky.androidide.lsp.java.utils; import java.util.stream.Collectors; - import jdkx.lang.model.type.ArrayType; import jdkx.lang.model.type.DeclaredType; import jdkx.lang.model.type.ErrorType; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/TypeUtils.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/TypeUtils.java index b08a17aec..3c5385c9d 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/TypeUtils.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/utils/TypeUtils.java @@ -36,6 +36,15 @@ import com.github.javaparser.printer.DefaultPrettyPrinter; import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration; import com.github.javaparser.printer.configuration.PrinterConfiguration; import com.itsaky.androidide.lsp.java.visitors.PrettyPrintingVisitor; +import java.nio.file.Path; +import java.util.Objects; +import java.util.function.Predicate; +import jdkx.lang.model.element.TypeElement; +import jdkx.lang.model.type.DeclaredType; +import jdkx.lang.model.type.NoType; +import jdkx.lang.model.type.TypeKind; +import jdkx.lang.model.type.TypeMirror; +import jdkx.lang.model.type.TypeVariable; import openjdk.source.tree.IdentifierTree; import openjdk.source.tree.ParameterizedTypeTree; import openjdk.source.tree.PrimitiveTypeTree; @@ -45,17 +54,6 @@ import openjdk.source.tree.WildcardTree; import openjdk.tools.javac.code.BoundKind; import openjdk.tools.javac.tree.JCTree; -import java.nio.file.Path; -import java.util.Objects; -import java.util.function.Predicate; - -import jdkx.lang.model.element.TypeElement; -import jdkx.lang.model.type.DeclaredType; -import jdkx.lang.model.type.NoType; -import jdkx.lang.model.type.TypeKind; -import jdkx.lang.model.type.TypeMirror; -import jdkx.lang.model.type.TypeVariable; - public class TypeUtils { // trees diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/DiagnosticVisitor.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/DiagnosticVisitor.kt index ec076c3bf..bf9d3383c 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/DiagnosticVisitor.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/DiagnosticVisitor.kt @@ -17,7 +17,13 @@ package com.itsaky.androidide.lsp.java.visitors import com.itsaky.androidide.progress.ProgressManager.Companion.abortIfCancelled -import com.itsaky.androidide.utils.ILogger +import jdkx.lang.model.element.Element +import jdkx.lang.model.element.ExecutableElement +import jdkx.lang.model.element.Modifier +import jdkx.lang.model.element.TypeElement +import jdkx.lang.model.type.DeclaredType +import jdkx.lang.model.type.TypeKind +import jdkx.lang.model.type.TypeMirror import openjdk.source.tree.BlockTree import openjdk.source.tree.ClassTree import openjdk.source.tree.CompilationUnitTree @@ -39,18 +45,11 @@ import openjdk.source.util.TreePath import openjdk.source.util.TreeScanner import openjdk.source.util.Trees import openjdk.tools.javac.api.JavacTaskImpl -import java.util.* -import jdkx.lang.model.element.Element -import jdkx.lang.model.element.ExecutableElement -import jdkx.lang.model.element.Modifier -import jdkx.lang.model.element.TypeElement -import jdkx.lang.model.type.DeclaredType -import jdkx.lang.model.type.TypeKind -import jdkx.lang.model.type.TypeMirror +import java.util.Objects class DiagnosticVisitor(task: JavacTaskImpl?) : TreeScanner>() { - private val log = ILogger.newInstance(javaClass.simpleName) + private val trees = Trees.instance(task) private val privateDeclarations = mutableMapOf() private val localVariables = mutableMapOf() @@ -170,9 +169,9 @@ class DiagnosticVisitor(task: JavacTaskImpl?) : return true } } - + abortIfCancelled() - + // Check if t has been referenced by a reachable element val el = trees.getElement(path) return used.contains(el) @@ -224,6 +223,7 @@ class DiagnosticVisitor(task: JavacTaskImpl?) : foundLocalVariable() super.visitVariable(t, notThrown) } + isReachable(path!!) -> super.visitVariable(t, notThrown) else -> foundPrivateDeclaration() } @@ -241,12 +241,12 @@ class DiagnosticVisitor(task: JavacTaskImpl?) : val pushObserved = observedExceptions declaredExceptions = declared(t) observedExceptions = HashSet() - + abortIfCancelled() // Recursively scan for 'throw' and method calls super.visitMethod(t, notThrown) abortIfCancelled() - + // Check for exceptions that were never thrown for (exception in declaredExceptions.keys) { if (!observedExceptions.contains(exception)) { diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindBiggerRange.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindBiggerRange.java index 0843edca4..fc973ac11 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindBiggerRange.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindBiggerRange.java @@ -21,7 +21,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.utils.ILogger; import openjdk.source.tree.ClassTree; import openjdk.source.tree.CompilationUnitTree; import openjdk.source.tree.LineMap; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindMethodCallAt.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindMethodCallAt.java index 21ff747b0..734b11948 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindMethodCallAt.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindMethodCallAt.java @@ -17,7 +17,11 @@ package com.itsaky.androidide.lsp.java.visitors; -import com.itsaky.androidide.utils.ILogger; +import jdkx.lang.model.element.Element; +import jdkx.lang.model.element.NestingKind; +import jdkx.lang.model.element.TypeElement; +import jdkx.lang.model.type.TypeKind; +import jdkx.lang.model.type.TypeMirror; import openjdk.source.tree.AssignmentTree; import openjdk.source.tree.ClassTree; import openjdk.source.tree.CompilationUnitTree; @@ -31,14 +35,8 @@ import openjdk.source.util.TreePath; import openjdk.source.util.TreePathScanner; import openjdk.source.util.Trees; -import jdkx.lang.model.element.Element; -import jdkx.lang.model.element.NestingKind; -import jdkx.lang.model.element.TypeElement; -import jdkx.lang.model.type.TypeKind; -import jdkx.lang.model.type.TypeMirror; - public class FindMethodCallAt extends TreePathScanner { - private static final ILogger LOG = ILogger.newInstance("main"); + private final Trees trees; private final SourcePositions pos; private CompilationUnitTree root; @@ -94,7 +92,9 @@ public class FindMethodCallAt extends TreePathScanner { private final JavacTask task; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindReferences.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindReferences.java index b2a1d5dd3..1c843344c 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindReferences.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindReferences.java @@ -17,6 +17,8 @@ package com.itsaky.androidide.lsp.java.visitors; +import java.util.List; +import jdkx.lang.model.element.Element; import openjdk.source.tree.IdentifierTree; import openjdk.source.tree.MemberReferenceTree; import openjdk.source.tree.MemberSelectTree; @@ -26,10 +28,6 @@ import openjdk.source.util.TreePath; import openjdk.source.util.TreePathScanner; import openjdk.source.util.Trees; -import java.util.List; - -import jdkx.lang.model.element.Element; - public class FindReferences extends TreePathScanner> { final JavacTask task; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindTypeDeclarationNamed.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindTypeDeclarationNamed.java index d5f5e615b..00df0274f 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindTypeDeclarationNamed.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindTypeDeclarationNamed.java @@ -17,13 +17,12 @@ package com.itsaky.androidide.lsp.java.visitors; -import openjdk.source.tree.ClassTree; -import openjdk.source.tree.CompilationUnitTree; -import openjdk.source.util.TreeScanner; - import java.util.ArrayList; import java.util.List; import java.util.Objects; +import openjdk.source.tree.ClassTree; +import openjdk.source.tree.CompilationUnitTree; +import openjdk.source.util.TreeScanner; public class FindTypeDeclarationNamed extends TreeScanner { private List qualifiedName = new ArrayList<>(); diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindTypeDeclarations.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindTypeDeclarations.java index 2ca611a85..0838d33ee 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindTypeDeclarations.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindTypeDeclarations.java @@ -17,13 +17,12 @@ package com.itsaky.androidide.lsp.java.visitors; -import openjdk.source.tree.ClassTree; -import openjdk.source.tree.CompilationUnitTree; -import openjdk.source.util.TreeScanner; - import java.util.ArrayList; import java.util.List; import java.util.Objects; +import openjdk.source.tree.ClassTree; +import openjdk.source.tree.CompilationUnitTree; +import openjdk.source.util.TreeScanner; public class FindTypeDeclarations extends TreeScanner> { private List qualifiedName = new ArrayList<>(); diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindVariablesBetween.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindVariablesBetween.java index 22c8e0ec1..5098e4035 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindVariablesBetween.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/FindVariablesBetween.java @@ -18,7 +18,8 @@ package com.itsaky.androidide.lsp.java.visitors; import androidx.annotation.NonNull; - +import java.util.ArrayList; +import java.util.List; import openjdk.source.tree.CompilationUnitTree; import openjdk.source.tree.VariableTree; import openjdk.source.util.JavacTask; @@ -27,9 +28,6 @@ import openjdk.source.util.TreePath; import openjdk.source.util.TreePathScanner; import openjdk.source.util.Trees; -import java.util.ArrayList; -import java.util.List; - /** * Finds variables between the given start and end indexes. * diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/MethodRangeScanner.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/MethodRangeScanner.kt index 2e2908c40..9313f2ccb 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/MethodRangeScanner.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/MethodRangeScanner.kt @@ -20,7 +20,6 @@ package com.itsaky.androidide.lsp.java.visitors import androidx.core.util.Pair import com.itsaky.androidide.models.Position import com.itsaky.androidide.models.Range -import com.itsaky.androidide.utils.ILogger import openjdk.source.tree.CompilationUnitTree import openjdk.source.tree.LineMap import openjdk.source.tree.MethodTree @@ -28,6 +27,7 @@ import openjdk.source.util.TreePath import openjdk.source.util.TreePathScanner import openjdk.source.util.Trees import openjdk.tools.javac.api.JavacTaskImpl +import org.slf4j.LoggerFactory /** * Visits all methods and adds them to the given list of pair of method range and its tree. @@ -37,12 +37,15 @@ import openjdk.tools.javac.api.JavacTaskImpl class MethodRangeScanner(val task: JavacTaskImpl) : TreePathScanner>>() { - private val log = ILogger.newInstance(javaClass.simpleName) - var root: CompilationUnitTree? = null var lines: LineMap? = null val pos = Trees.instance(task).sourcePositions + companion object { + + private val log = LoggerFactory.getLogger(MethodRangeScanner::class.java) + } + override fun visitCompilationUnit( node: CompilationUnitTree?, p: MutableList>? @@ -63,7 +66,7 @@ class MethodRangeScanner(val task: JavacTaskImpl) : val end = getEndPosition(node) if (start == null || end == null) { - log.warn("Method '${node.name}' skipped. Invalid position.") + log.warn("Method '{}' skipped. Invalid position.", node.name) return } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PrettyPrintingVisitor.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PrettyPrintingVisitor.java index 0fdba7065..ecb1ef593 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PrettyPrintingVisitor.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PrettyPrintingVisitor.java @@ -31,7 +31,6 @@ import com.github.javaparser.printer.configuration.ConfigurationOption; import com.github.javaparser.printer.configuration.DefaultConfigurationOption; import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration; import com.github.javaparser.printer.configuration.PrinterConfiguration; - import java.util.ArrayList; import java.util.List; import java.util.Optional; diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PrintingVisitor.kt b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PrintingVisitor.kt index 3f81be020..5094206c4 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PrintingVisitor.kt +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PrintingVisitor.kt @@ -17,10 +17,10 @@ package com.itsaky.androidide.lsp.java.visitors -import com.itsaky.androidide.utils.ILogger import openjdk.tools.javac.tree.JCTree import openjdk.tools.javac.tree.JCTree.JCErroneous import openjdk.tools.javac.tree.TreeScanner +import org.slf4j.LoggerFactory /** * Prints all the trees it visits. For debugging/testing purposes only. @@ -29,10 +29,13 @@ import openjdk.tools.javac.tree.TreeScanner */ class PrintingVisitor : TreeScanner() { - private val log = ILogger.newInstance(javaClass.simpleName) + companion object { + + private val log = LoggerFactory.getLogger(PrintingVisitor::class.java) + } override fun scan(tree: JCTree?) { - log.debug(if (tree != null) tree::class.java else "NullClass", tree) + log.debug(if (tree != null) tree::class.java.name else "NullClass", tree) super.scan(tree) } diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PruneMethodBodies.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PruneMethodBodies.java index 5745a21e9..f4e72ef22 100644 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PruneMethodBodies.java +++ b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/PruneMethodBodies.java @@ -17,6 +17,7 @@ package com.itsaky.androidide.lsp.java.visitors; +import java.io.IOException; import openjdk.source.tree.CompilationUnitTree; import openjdk.source.tree.MethodTree; import openjdk.source.util.JavacTask; @@ -24,8 +25,6 @@ import openjdk.source.util.SourcePositions; import openjdk.source.util.TreeScanner; import openjdk.source.util.Trees; -import java.io.IOException; - public class PruneMethodBodies extends TreeScanner { private final JavacTask task; private final StringBuilder buf = new StringBuilder(); diff --git a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/SemanticHighlighter.java b/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/SemanticHighlighter.java deleted file mode 100644 index 7346f59a4..000000000 --- a/lsp/java/src/main/java/com/itsaky/androidide/lsp/java/visitors/SemanticHighlighter.java +++ /dev/null @@ -1,231 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.lsp.java.visitors; - -import static android.text.TextUtils.substring; - -import androidx.annotation.NonNull; - -import com.itsaky.androidide.lsp.java.compiler.CompileTask; -import com.itsaky.androidide.lsp.models.HighlightToken; -import com.itsaky.androidide.lsp.models.HighlightTokenKind; -import com.itsaky.androidide.models.Position; -import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.projects.FileManager; -import com.itsaky.androidide.utils.ILogger; -import openjdk.source.tree.ClassTree; -import openjdk.source.tree.CompilationUnitTree; -import openjdk.source.tree.ExpressionTree; -import openjdk.source.tree.IdentifierTree; -import openjdk.source.tree.LineMap; -import openjdk.source.tree.MemberSelectTree; -import openjdk.source.tree.MethodInvocationTree; -import openjdk.source.tree.MethodTree; -import openjdk.source.tree.Tree; -import openjdk.source.tree.VariableTree; -import openjdk.source.util.SourcePositions; -import openjdk.source.util.TreePath; -import openjdk.source.util.TreePathScanner; -import openjdk.source.util.Trees; - -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; - -import jdkx.lang.model.element.Element; -import jdkx.lang.model.element.ElementKind; -import jdkx.lang.model.element.Modifier; -import jdkx.lang.model.element.Name; - -public class SemanticHighlighter extends TreePathScanner> { - - private static final ILogger LOG = ILogger.newInstance("JavaSemanticHighlighter"); - private final Trees trees; - private final CompileTask task; - - public SemanticHighlighter(CompileTask task) { - this.task = task; - this.trees = Trees.instance(task.task); - } - - @Override - public Void visitClass(ClassTree t, List colors) { - putSemantics(t.getSimpleName(), colors); - return super.visitClass(t, colors); - } - - @Override - public Void visitMethod(MethodTree tree, List colors) { - putSemantics(tree.getName(), colors); - return super.visitMethod(tree, colors); - } - - @Override - public Void visitVariable(VariableTree t, List colors) { - putSemantics(t.getName(), colors); - return super.visitVariable(t, colors); - } - - @Override - public Void visitMethodInvocation(MethodInvocationTree tree, List colors) { - Name name = null; - ExpressionTree select = tree.getMethodSelect(); - if (select instanceof MemberSelectTree) { - name = ((MemberSelectTree) select).getIdentifier(); - } else if (select instanceof IdentifierTree) { - name = ((IdentifierTree) select).getName(); - } - - if (name != null) { - Range range = find(getCurrentPath(), name); - if (range != null) { - colors.add(new HighlightToken(range, HighlightTokenKind.METHOD_INVOCATION)); - } - } - return super.visitMethodInvocation(tree, colors); - } - - @Override - public Void visitMemberSelect(MemberSelectTree t, List colors) { - putSemantics(t.getIdentifier(), colors); - return super.visitMemberSelect(t, colors); - } - - @Override - public Void visitIdentifier(IdentifierTree t, List colors) { - putSemantics(t.getName(), colors); - return super.visitIdentifier(t, colors); - } - - private void putSemantics(Name name, List tokens) { - if (name.contentEquals("this") || name.contentEquals("super") || name.contentEquals("class")) { - return; - } - final TreePath fromPath = getCurrentPath(); - - // Cancel the visit in case a task was cancelled/closed - if (task == null || task.task == null) { - throw new RuntimeException("Task is null"); - } - - Element toEl = trees.getElement(fromPath); - if (toEl == null) { - return; - } - - Range range = find(fromPath, name); - if (range == Range.NONE) return; - - ElementKind kind = toEl.getKind(); - HighlightTokenKind tokenKind = HighlightTokenKind.TEXT_NORMAL; - - switch (kind) { - case PACKAGE: - tokenKind = HighlightTokenKind.PACKAGE_NAME; - break; - case ENUM: - tokenKind = HighlightTokenKind.ENUM_TYPE; - break; - case CLASS: - tokenKind = HighlightTokenKind.TYPE_NAME; - break; - case ANNOTATION_TYPE: - tokenKind = HighlightTokenKind.ANNOTATION; - break; - case INTERFACE: - tokenKind = HighlightTokenKind.INTERFACE; - break; - case ENUM_CONSTANT: - tokenKind = HighlightTokenKind.ENUM; - break; - case FIELD: - if (toEl.getModifiers().contains(Modifier.STATIC)) { - tokenKind = HighlightTokenKind.STATIC_FIELD; - } else { - tokenKind = HighlightTokenKind.FIELD; - } - break; - case METHOD: - tokenKind = HighlightTokenKind.METHOD_DECLARATION; - break; - case PARAMETER: - tokenKind = HighlightTokenKind.PARAMETER; - break; - case LOCAL_VARIABLE: - tokenKind = HighlightTokenKind.LOCAL_VARIABLE; - break; - case EXCEPTION_PARAMETER: - tokenKind = HighlightTokenKind.EXCEPTION_PARAMETER; - break; - case CONSTRUCTOR: - tokenKind = HighlightTokenKind.CONSTRUCTOR; - break; - case STATIC_INIT: - tokenKind = HighlightTokenKind.STATIC_INIT; - break; - case INSTANCE_INIT: - tokenKind = HighlightTokenKind.INSTANCE_INIT; - break; - case TYPE_PARAMETER: - tokenKind = HighlightTokenKind.TYPE_PARAMETER; - break; - case RESOURCE_VARIABLE: - tokenKind = HighlightTokenKind.RESOURCE_VARIABLE; - break; - } - - tokens.add(new HighlightToken(range, tokenKind)); - } - - private Range find(TreePath path, Name name) { - // Find region containing name - SourcePositions pos = trees.getSourcePositions(); - CompilationUnitTree root = path.getCompilationUnit(); - Tree leaf = path.getLeaf(); - int start = (int) pos.getStartPosition(root, leaf); - int end = (int) pos.getEndPosition(root, leaf); - // Adjust start to remove LHS of declarations and member selections - if (leaf instanceof MemberSelectTree) { - MemberSelectTree select = (MemberSelectTree) leaf; - start = (int) pos.getEndPosition(root, select.getExpression()); - } else if (leaf instanceof VariableTree) { - VariableTree declaration = (VariableTree) leaf; - start = (int) pos.getEndPosition(root, declaration.getType()); - } - // If no position, give up - if (start == -1 || end == -1) { - return Range.NONE; - } - // Find name inside expression - Path file = Paths.get(root.getSourceFile().toUri()); - CharSequence contents = FileManager.INSTANCE.getDocumentContents(file); - String region = substring(contents, start, end); - start += region.indexOf(name.toString()); - end = start + name.length(); - return new Range(getPosition(start, root.getLineMap()), getPosition(end, root.getLineMap())); - } - - @NonNull - private static Position getPosition(long position, @NonNull LineMap lines) { - // decrement the numbers - // to convert 1-based indexes to 0-based - final int line = (int) lines.getLineNumber(position) - 1; - final int column = (int) lines.getColumnNumber(position) - 1; - return new Position(line, column); - } -} diff --git a/lsp/java/src/test/java/com/itsaky/androidide/lsp/java/compiler/CompilerTest.kt b/lsp/java/src/test/java/com/itsaky/androidide/lsp/java/compiler/CompilerTest.kt index 60ff4ccc0..0de93074b 100644 --- a/lsp/java/src/test/java/com/itsaky/androidide/lsp/java/compiler/CompilerTest.kt +++ b/lsp/java/src/test/java/com/itsaky/androidide/lsp/java/compiler/CompilerTest.kt @@ -19,12 +19,12 @@ package com.itsaky.androidide.lsp.java.compiler import com.google.common.truth.Truth.assertThat import com.itsaky.androidide.lsp.java.JavaLSPTest -import java.time.Instant import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config +import java.time.Instant /** @author Akash Yadav */ @RunWith(RobolectricTestRunner::class) diff --git a/lsp/java/src/test/java/com/itsaky/androidide/lsp/java/partial/PartialReparserImplTest.kt b/lsp/java/src/test/java/com/itsaky/androidide/lsp/java/partial/PartialReparserImplTest.kt index f2723bf21..75ad2cb63 100644 --- a/lsp/java/src/test/java/com/itsaky/androidide/lsp/java/partial/PartialReparserImplTest.kt +++ b/lsp/java/src/test/java/com/itsaky/androidide/lsp/java/partial/PartialReparserImplTest.kt @@ -26,6 +26,7 @@ import com.itsaky.androidide.lsp.java.models.CompilationRequest import com.itsaky.androidide.lsp.java.models.PartialReparseRequest import com.itsaky.androidide.lsp.java.visitors.PrintingVisitor import com.itsaky.androidide.models.Range +import jdkx.lang.model.type.ArrayType import openjdk.source.tree.ExpressionStatementTree import openjdk.source.tree.LiteralTree import openjdk.source.tree.Tree @@ -40,7 +41,6 @@ import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config -import jdkx.lang.model.type.ArrayType /** @author Akash Yadav */ @RunWith(RobolectricTestRunner::class) diff --git a/lsp/models/src/main/java/com/itsaky/androidide/lsp/edits/DefaultEditHandler.kt b/lsp/models/src/main/java/com/itsaky/androidide/lsp/edits/DefaultEditHandler.kt index 83558884a..9665847f6 100644 --- a/lsp/models/src/main/java/com/itsaky/androidide/lsp/edits/DefaultEditHandler.kt +++ b/lsp/models/src/main/java/com/itsaky/androidide/lsp/edits/DefaultEditHandler.kt @@ -23,10 +23,10 @@ import com.itsaky.androidide.lsp.models.Command import com.itsaky.androidide.lsp.models.CompletionItem import com.itsaky.androidide.lsp.models.InsertTextFormat.SNIPPET import com.itsaky.androidide.lsp.util.RewriteHelper -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.lang.completion.snippet.parser.CodeSnippetParser import io.github.rosemoe.sora.text.Content import io.github.rosemoe.sora.widget.CodeEditor +import org.slf4j.LoggerFactory /** * Default edit handler for completion items. @@ -35,7 +35,10 @@ import io.github.rosemoe.sora.widget.CodeEditor */ open class DefaultEditHandler : IEditHandler { - private val log = ILogger.newInstance(javaClass.simpleName) + companion object { + + private val log = LoggerFactory.getLogger(DefaultEditHandler::class.java) + } override fun performEdits( item: CompletionItem, diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/models/XMLFormattingOptions.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/models/XMLFormattingOptions.kt index 6c6bef194..b0d28ad78 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/models/XMLFormattingOptions.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/models/XMLFormattingOptions.kt @@ -19,9 +19,9 @@ package com.itsaky.androidide.lsp.xml.models import com.itsaky.androidide.lsp.xml.providers.format.FormatElementCategory import com.itsaky.androidide.lsp.xml.providers.format.FormatElementCategory.PreserveSpace -import org.eclipse.lemminx.dom.builder.EmptyElements -import org.eclipse.lemminx.dom.builder.BaseXmlFormattingOptions import org.eclipse.lemminx.dom.DOMElement +import org.eclipse.lemminx.dom.builder.BaseXmlFormattingOptions +import org.eclipse.lemminx.dom.builder.EmptyElements /** * Options for XML code formatting. diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/CodeFormatProvider.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/CodeFormatProvider.java index ceed2d6aa..1fd4fe39d 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/CodeFormatProvider.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/CodeFormatProvider.java @@ -3,15 +3,15 @@ package com.itsaky.androidide.lsp.xml.providers; import com.itsaky.androidide.lsp.models.CodeFormatResult; import com.itsaky.androidide.lsp.models.FormatCodeParams; import com.itsaky.androidide.lsp.xml.providers.format.XMLFormatter; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.utils.StopWatch; - import org.eclipse.lemminx.dom.DOMParser; import org.eclipse.lemminx.uriresolver.URIResolverExtensionManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class CodeFormatProvider { - private static final ILogger LOG = ILogger.newInstance("XmlCodeFormatProvider"); + private static final Logger LOG = LoggerFactory.getLogger(CodeFormatProvider.class); public CodeFormatResult format(FormatCodeParams params) { final CharSequence input = params.getContent(); diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/XmlCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/XmlCompletionProvider.kt index cef5aee5e..9a3e4c2a8 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/XmlCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/XmlCompletionProvider.kt @@ -57,11 +57,11 @@ import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.TAG import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.UNKNOWN import com.itsaky.androidide.lsp.xml.utils.forTransitionAttr import com.itsaky.androidide.utils.CharSequenceReader -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.StopWatch import io.github.rosemoe.sora.text.ContentReference import org.eclipse.lemminx.dom.DOMParser import org.eclipse.lemminx.uriresolver.URIResolverExtensionManager +import org.slf4j.LoggerFactory import java.io.Reader import kotlin.io.path.name @@ -73,12 +73,15 @@ import kotlin.io.path.name class XmlCompletionProvider(settings: IServerSettings) : AbstractServiceProvider(), ICompletionProvider { + companion object { + + private val log = LoggerFactory.getLogger(XmlCompletionProvider::class.java) + } + init { super.applySettings(settings) } - private val log = ILogger.newInstance(javaClass.simpleName) - override fun complete(params: CompletionParams): CompletionResult { return try { val watch = @@ -95,7 +98,8 @@ class XmlCompletionProvider(settings: IServerSettings) : private fun doComplete(params: CompletionParams): CompletionResult { val contents = toString(contents = params.requireContents()) val document = - DOMParser.getInstance().parse(contents, "http://schemas.android.com/apk/res/android", URIResolverExtensionManager()) + DOMParser.getInstance().parse(contents, "http://schemas.android.com/apk/res/android", + URIResolverExtensionManager()) val type = XmlUtils.getNodeType(document, params.position.requireIndex()) if (type == UNKNOWN) { @@ -114,7 +118,7 @@ class XmlCompletionProvider(settings: IServerSettings) : getCompleter(pathData, type) ?: run { log.error( - "No completer available for resource type '${pathData.type}' and node type '$type'" + "No completer available for resource type '{}' and node type '{}'", pathData.type, type ) return EMPTY } @@ -146,6 +150,7 @@ class XmlCompletionProvider(settings: IServerSettings) : return when (type) { ATTRIBUTE -> InheritingAttrCompletionProvider(::forTransitionAttr, TransitionTagTransformer, this) + ATTRIBUTE_VALUE -> AttrValueCompletionProvider(this) else -> null } diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrCompletionProvider.kt index e3430f7bf..329f8b3c4 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrCompletionProvider.kt @@ -98,12 +98,12 @@ open class AttrCompletionProvider(provider: ICompletionProvider) : list: MutableList ) { if (namespace == null) { - log.warn("Namespace is null. Cannot compute completions for namespace prefix: $nsPrefix.") + log.warn("Namespace is null. Cannot compute completions for namespace prefix: {}.", nsPrefix) return } val tables = findResourceTables(namespace) if (tables.isEmpty()) { - log.warn("No resource tables found for namespace; $namespace") + log.warn("No resource tables found for namespace: {}", namespace) return } @@ -343,7 +343,7 @@ open class AttrCompletionProvider(provider: ICompletionProvider) : protected open fun findStyleableEntry(styleables: ResourceGroup, name: String): Styleable? { val value = styleables.findEntry(name)?.findValue(ConfigDescription())?.value if (value !is Styleable) { - log.warn("Cannot find styleable for $name") + log.warn("Cannot find styleable for {}", name) return null } return value diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrValueCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrValueCompletionProvider.kt index c17d4ebeb..c69ea2f96 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrValueCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/AttrValueCompletionProvider.kt @@ -78,7 +78,7 @@ open class AttrValueCompletionProvider(provider: ICompletionProvider) : val attrName = attrAtCursor.localName ?: run { - log.warn("Cannot find attribute at index ${params.position.index}") + log.warn("Cannot find attribute at index {}", params.position.index) return EMPTY } @@ -89,7 +89,7 @@ open class AttrValueCompletionProvider(provider: ICompletionProvider) : val namespace = attrAtCursor.namespaceURI ?: run { - log.warn("Unknown namespace for attribute", attrAtCursor) + log.warn("Unknown namespace for attribute: {}", attrAtCursor) return EMPTY } @@ -123,7 +123,8 @@ open class AttrValueCompletionProvider(provider: ICompletionProvider) : findAttr(tables, namespace, pck, attrName) ?: run { log.warn( - "No attribute found with name '$attrName' in package '${if (namespace == NAMESPACE_AUTO) "" else pck}'" + "No attribute found with name '{}' in package '{}'", attrName, + if (namespace == NAMESPACE_AUTO) "" else pck ) return EMPTY } @@ -360,9 +361,9 @@ open class AttrValueCompletionProvider(provider: ICompletionProvider) : return@mapNotNull null } pck.name to - pck.findGroup(type)?.findEntries { entryName -> - matchLevel(entryName, prefix) != NO_MATCH - } + pck.findGroup(type)?.findEntries { entryName -> + matchLevel(entryName, prefix) != NO_MATCH + } } } .toHashSet() @@ -390,7 +391,7 @@ open class AttrValueCompletionProvider(provider: ICompletionProvider) : } tables.addAll(super.findResourceTables(nsUri)) - log.info("Found ${tables.size} resource tables for namespace: $nsUri") + log.info("Found {} resource tables for namespace: {}", tables.size, nsUri) return tables } diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/IXmlCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/IXmlCompletionProvider.kt index 82ea92eaa..31a36f130 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/IXmlCompletionProvider.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/IXmlCompletionProvider.kt @@ -41,11 +41,12 @@ import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.ATTRIBUTE import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.ATTRIBUTE_VALUE import com.itsaky.androidide.utils.DocumentUtils -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.xml.resources.ResourceTableRegistry import org.eclipse.lemminx.dom.DOMAttr import org.eclipse.lemminx.dom.DOMDocument import org.eclipse.lemminx.dom.DOMNode +import org.slf4j.Logger +import org.slf4j.LoggerFactory /** * Base class for all XML completion providers. @@ -53,14 +54,15 @@ import org.eclipse.lemminx.dom.DOMNode * @author Akash Yadav */ abstract class IXmlCompletionProvider(private val provider: ICompletionProvider) { - - protected val log: ILogger = ILogger.newInstance("XmlCompletionProvider") + protected lateinit var nodeAtCursor: DOMNode protected lateinit var attrAtCursor: DOMAttr protected lateinit var allNamespaces: Set> companion object { - + @JvmStatic + protected val log: Logger = LoggerFactory.getLogger(IXmlCompletionProvider::class.java) + const val NAMESPACE_PREFIX = "http://schemas.android.com/apk/res/" const val NAMESPACE_AUTO = "http://schemas.android.com/apk/res-auto" } @@ -260,7 +262,7 @@ abstract class IXmlCompletionProvider(private val provider: ICompletionProvider) val pck = nsUri.substringAfter(NAMESPACE_PREFIX) if (pck.isBlank()) { - log.warn("Invalid namespace: $nsUri") + log.warn("Invalid namespace: {}", nsUri) return emptySet() } diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt index d4bdb240b..b6a9c8219 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/QualifiedTagCompleter.kt @@ -28,8 +28,8 @@ import com.itsaky.androidide.lsp.xml.providers.completion.match import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType import com.itsaky.androidide.projects.api.ModuleProject import com.itsaky.androidide.utils.ClassTrie -import com.itsaky.androidide.xml.widgets.WidgetTable import com.itsaky.androidide.xml.internal.widgets.DefaultWidgetTable +import com.itsaky.androidide.xml.widgets.WidgetTable import org.eclipse.lemminx.dom.DOMDocument /** diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/xmlCompletions.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/xmlCompletions.kt index 29af13141..0dc735727 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/xmlCompletions.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/xmlCompletions.kt @@ -23,8 +23,8 @@ import com.itsaky.androidide.lsp.models.CompletionItem.Companion.matchLevel import com.itsaky.androidide.lsp.models.MatchLevel import com.itsaky.androidide.lsp.models.MatchLevel.NO_MATCH import com.itsaky.androidide.xml.resources.ResourceTableRegistry -import kotlin.math.min import org.eclipse.lemminx.dom.DOMNode +import kotlin.math.min fun match(simpleName: String, qualifiedName: String, prefix: String): MatchLevel { val simpleNameMatchLevel = matchLevel(simpleName, prefix) diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMAttributeFormatter.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMAttributeFormatter.java index e6e552ea4..b34ebe717 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMAttributeFormatter.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMAttributeFormatter.java @@ -29,12 +29,10 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; - +import java.util.List; import org.eclipse.lemminx.dom.DOMAttr; import org.eclipse.lemminx.utils.StringUtils; -import java.util.List; - /** * DOM attribute formatter. * diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCDATAFormatter.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCDATAFormatter.java index 6aed9c1da..d544a322a 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCDATAFormatter.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCDATAFormatter.java @@ -30,10 +30,8 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; - -import org.eclipse.lemminx.dom.DOMCDATASection; - import java.util.List; +import org.eclipse.lemminx.dom.DOMCDATASection; /** DOM CDATA section formatter. */ public class DOMCDATAFormatter { diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCommentFormatter.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCommentFormatter.java index f46d64ecc..f23939751 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCommentFormatter.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMCommentFormatter.java @@ -30,10 +30,8 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; - -import org.eclipse.lemminx.dom.DOMComment; - import java.util.List; +import org.eclipse.lemminx.dom.DOMComment; /** DOM comment formatter. */ public class DOMCommentFormatter { diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMDocTypeFormatter.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMDocTypeFormatter.java index 7fb004dab..f50d1de5f 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMDocTypeFormatter.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMDocTypeFormatter.java @@ -29,7 +29,7 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; - +import java.util.List; import org.eclipse.lemminx.dom.DOMDocumentType; import org.eclipse.lemminx.dom.DOMNode; import org.eclipse.lemminx.dom.DTDAttlistDecl; @@ -38,8 +38,6 @@ import org.eclipse.lemminx.dom.DTDDeclParameter; import org.eclipse.lemminx.utils.StringUtils; import org.w3c.dom.Node; -import java.util.List; - /** * DOM docType formatter. * diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMElementFormatter.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMElementFormatter.java index 7b423c8ee..a1a68fe1a 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMElementFormatter.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMElementFormatter.java @@ -29,15 +29,13 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; - -import org.eclipse.lemminx.dom.builder.EmptyElements; +import java.util.List; import org.eclipse.lemminx.commons.BadLocationException; import org.eclipse.lemminx.dom.DOMAttr; import org.eclipse.lemminx.dom.DOMElement; +import org.eclipse.lemminx.dom.builder.EmptyElements; import org.eclipse.lemminx.utils.StringUtils; -import java.util.List; - /** * DOM element formatter. * diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMProcessingInstructionFormatter.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMProcessingInstructionFormatter.java index 099bf33ea..9f364f5d0 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMProcessingInstructionFormatter.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMProcessingInstructionFormatter.java @@ -29,12 +29,10 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; - +import java.util.List; import org.eclipse.lemminx.dom.DOMAttr; import org.eclipse.lemminx.dom.DOMProcessingInstruction; -import java.util.List; - /** * DOM processing instruction formatter. * diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMTextFormatter.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMTextFormatter.java index de6c227dc..30ff4365f 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMTextFormatter.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/DOMTextFormatter.java @@ -29,10 +29,8 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; - -import org.eclipse.lemminx.dom.DOMText; - import java.util.List; +import org.eclipse.lemminx.dom.DOMText; /** * DOM text formatter. diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/TextEditUtils.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/TextEditUtils.java index b91483344..9d387eaaa 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/TextEditUtils.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/TextEditUtils.java @@ -31,16 +31,14 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; - -import org.eclipse.lemminx.commons.BadLocationException; -import org.eclipse.lemminx.commons.TextDocument; - import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; +import org.eclipse.lemminx.commons.BadLocationException; +import org.eclipse.lemminx.commons.TextDocument; /** * Utilities for {@link TextEdit}. diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatter.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatter.java index a5ffc1893..a0148d944 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatter.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatter.java @@ -19,16 +19,18 @@ package com.itsaky.androidide.lsp.xml.providers.format; import com.itsaky.androidide.lsp.models.TextEdit; import com.itsaky.androidide.models.Range; -import com.itsaky.androidide.utils.ILogger; - +import java.util.List; import org.eclipse.lemminx.commons.BadLocationException; import org.eclipse.lemminx.dom.DOMDocument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.util.List; - -/** XML formatter support. */ +/** + * XML formatter support. + */ public class XMLFormatter { - private static final ILogger LOG = ILogger.newInstance("XMLFormatter"); + + private static final Logger LOG = LoggerFactory.getLogger(XMLFormatter.class); /** * Returns a List containing a single TextEdit, containing the newly formatted changes of the diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocument.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocument.java index f0311abdd..a391d34ef 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocument.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocument.java @@ -33,8 +33,8 @@ import com.itsaky.androidide.lsp.xml.utils.XMLBuilder; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; - -import org.eclipse.lemminx.dom.builder.EmptyElements; +import java.util.ArrayList; +import java.util.List; import org.eclipse.lemminx.commons.BadLocationException; import org.eclipse.lemminx.commons.TextDocument; import org.eclipse.lemminx.dom.DOMAttr; @@ -50,9 +50,7 @@ import org.eclipse.lemminx.dom.DOMText; import org.eclipse.lemminx.dom.DTDAttlistDecl; import org.eclipse.lemminx.dom.DTDDeclNode; import org.eclipse.lemminx.dom.DTDDeclParameter; - -import java.util.ArrayList; -import java.util.List; +import org.eclipse.lemminx.dom.builder.EmptyElements; /** * Default XML formatter which generates one text edit by rewriting the DOM node which must be diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocumentNew.java b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocumentNew.java index 0a8282051..a9c08c8f6 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocumentNew.java +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/format/XMLFormatterDocumentNew.java @@ -34,7 +34,10 @@ import com.itsaky.androidide.lsp.xml.models.XMLServerSettings; import com.itsaky.androidide.models.Position; import com.itsaky.androidide.models.Range; import com.itsaky.androidide.preferences.internal.EditorPreferencesKt; - +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import org.eclipse.lemminx.commons.BadLocationException; import org.eclipse.lemminx.commons.TextDocument; import org.eclipse.lemminx.dom.DOMAttr; @@ -51,11 +54,6 @@ import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.w3c.dom.Node; import org.w3c.dom.Text; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - /** * Experimental XML formatter which generates several text edit to remove, add, update spaces / * indent. diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/utils/XmlUtils.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/utils/XmlUtils.kt index 06ee0fdc7..3daea605a 100644 --- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/utils/XmlUtils.kt +++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/utils/XmlUtils.kt @@ -21,17 +21,17 @@ import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.ATTRIBUTE import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.ATTRIBUTE_VALUE import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.TAG import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.UNKNOWN -import com.itsaky.androidide.utils.ILogger import org.antlr.v4.runtime.CharStreams import org.antlr.v4.runtime.Token import org.eclipse.lemminx.dom.DOMDocument import org.eclipse.lemminx.dom.DOMElement import org.eclipse.lemminx.dom.DOMNode +import org.slf4j.LoggerFactory /** @author Akash Yadav */ object XmlUtils { - private val log = ILogger.newInstance("XmlUtils") + private val log = LoggerFactory.getLogger(XmlUtils::class.java) fun isTag(node: DOMNode, index: Int): Boolean { var name = node.nodeName @@ -76,14 +76,14 @@ object XmlUtils { return when (type) { TAG -> { val nodeAt = parsed.findNodeAt(index) ?: run { - log.warn("Unable to find node at index $index") + log.warn("Unable to find node at index {}", index) return null } text.substring(nodeAt.start, index) } ATTRIBUTE -> { val attr = parsed.findAttrAt(index) ?: run { - log.warn("Unable to find attribute at index $index") + log.warn("Unable to find attribute at index {}", index) return null } @@ -91,7 +91,7 @@ object XmlUtils { } ATTRIBUTE_VALUE -> { val attrAt = parsed.findAttrAt(index) ?: run { - log.warn("Unable to find attribute at index $index") + log.warn("Unable to find attribute at index {}", index) return null } @@ -107,7 +107,7 @@ object XmlUtils { fun getNodeType(parsed: DOMDocument, cursor: Int): NodeType { val nodeAt = parsed.findNodeAt(cursor) ?: run { - log.warn("Unable to find node at index $cursor") + log.warn("Unable to find node at index {}", cursor) return UNKNOWN } diff --git a/shared/src/main/java/com/itsaky/androidide/utils/Cache.java b/shared/src/main/java/com/itsaky/androidide/utils/Cache.java index eac3b402a..335049345 100644 --- a/shared/src/main/java/com/itsaky/androidide/utils/Cache.java +++ b/shared/src/main/java/com/itsaky/androidide/utils/Cache.java @@ -23,13 +23,15 @@ import java.time.Instant; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Cache maps a file + an arbitrary key to a value. When the file is modified, the mapping expires. */ public class Cache { - private static final ILogger LOG = ILogger.newInstance("Cache"); + private static final Logger LOG = LoggerFactory.getLogger(Cache.class); // Cannot access FileManager from this module private static Object FileManager_INSTANCE; private static Method FileManager_getLastModified; diff --git a/shared/src/main/java/com/itsaky/androidide/utils/ClassTrie.kt b/shared/src/main/java/com/itsaky/androidide/utils/ClassTrie.kt index b2ff08041..d42853f52 100644 --- a/shared/src/main/java/com/itsaky/androidide/utils/ClassTrie.kt +++ b/shared/src/main/java/com/itsaky/androidide/utils/ClassTrie.kt @@ -18,7 +18,7 @@ package com.itsaky.androidide.utils import java.util.concurrent.ConcurrentHashMap -import java.util.function.* +import java.util.function.Predicate /** * Maps classes with their package name segments. diff --git a/shared/src/main/java/com/itsaky/androidide/utils/RecyclableObjectPool.kt b/shared/src/main/java/com/itsaky/androidide/utils/RecyclableObjectPool.kt index 32748f2f4..20c8d8aef 100644 --- a/shared/src/main/java/com/itsaky/androidide/utils/RecyclableObjectPool.kt +++ b/shared/src/main/java/com/itsaky/androidide/utils/RecyclableObjectPool.kt @@ -17,6 +17,7 @@ package com.itsaky.androidide.utils +import org.slf4j.LoggerFactory import java.util.concurrent.ArrayBlockingQueue import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicLong @@ -52,7 +53,7 @@ class RecyclableObjectPool @JvmOv private const val CACHE_HIT_WARNING_THRESHOLD = 50f private val log by lazy { - ILogger.newInstance("RecyclableObjectPool") + LoggerFactory.getLogger(RecyclableObjectPool::class.java) } const val CAPACITY_DEFAULT: Int = 4096 @@ -96,7 +97,7 @@ class RecyclableObjectPool @JvmOv */ fun recycle(obj: RecyclableT): Boolean { if (obj.isRecycled) { - log.warn("Trying to recyle already recycled object: $obj") + log.warn("Trying to recyle already recycled object: {}", obj) return false } @@ -156,7 +157,7 @@ class RecyclableObjectPool @JvmOv } fun logMetrics() { - if ( !(metricsEnabled && DEBUG) || System.currentTimeMillis() - lastMetricsLog.get() < 1000) { + if (!(metricsEnabled && DEBUG) || System.currentTimeMillis() - lastMetricsLog.get() < 1000) { return } @@ -167,24 +168,24 @@ class RecyclableObjectPool @JvmOv val cacheHitRate = cacheHitRate() val simpleName = objName.let { if (it.contains('.')) it.substringAfterLast('.') else it } - log.debug("${javaClass.simpleName}: $simpleName($objName)") - log.debug(" Recycle count : $rec") - log.debug(" Access count : $access") - log.debug(" Cache hit count : $cacheHit") - log.debug(" Cache hit rate : $cacheHitRate%") - log.debug(" Cache miss rate : ${cacheMissRate()}%") - log.debug(" Recycle rate : ${recycleRate()}%") - log.debug(" Cache utilization rate : ${cacheUtilization()}%") - log.debug(" Objects in cache : ${cache.size}") - log.debug(" Total capacity : $capacity") + log.debug("{}: {}({})", javaClass.simpleName, simpleName, objName) + log.debug(" Recycle count : {}", rec) + log.debug(" Access count : {}", access) + log.debug(" Cache hit count : {}", cacheHit) + log.debug(" Cache hit rate : {}%", cacheHitRate) + log.debug(" Cache miss rate : {}%", cacheMissRate()) + log.debug(" Recycle rate : {}%", recycleRate()) + log.debug(" Cache utilization rate : {}%", cacheUtilization()) + log.debug(" Objects in cache : {}", cache.size) + log.debug(" Total capacity : {}", capacity) if (cacheHitRate < CACHE_HIT_WARNING_THRESHOLD) { // Cache hit rate is less than threshold // something might be wrong // log an error log.error("!!!!!!!!!!!!!!!!!!!!! CRITICAL ERROR !!!!!!!!!!!!!!!!!!!!!") - log.error("Cache-hit rate for '${simpleName}' is less than ${CACHE_HIT_WARNING_THRESHOLD}%!!") - log.error("Make sure that instances of $objName are obtained using the object pool") + log.error("Cache-hit rate for '{}' is less than {}%!!", simpleName, CACHE_HIT_WARNING_THRESHOLD) + log.error("Make sure that instances of {} are obtained using the object pool", objName) log.error("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") } diff --git a/shared/src/main/java/com/itsaky/androidide/utils/ServiceNotFoundException.java b/shared/src/main/java/com/itsaky/androidide/utils/ServiceNotFoundException.java index b87d7a890..ada3f6a7b 100644 --- a/shared/src/main/java/com/itsaky/androidide/utils/ServiceNotFoundException.java +++ b/shared/src/main/java/com/itsaky/androidide/utils/ServiceNotFoundException.java @@ -17,8 +17,6 @@ package com.itsaky.androidide.utils; -import java.util.Objects; - /** * Exception thrown when a service cannot be loaded by {@link ServiceLoader}. * diff --git a/shared/src/main/java/com/itsaky/androidide/utils/StopWatch.kt b/shared/src/main/java/com/itsaky/androidide/utils/StopWatch.kt index c0856a1b9..a5f1a9557 100644 --- a/shared/src/main/java/com/itsaky/androidide/utils/StopWatch.kt +++ b/shared/src/main/java/com/itsaky/androidide/utils/StopWatch.kt @@ -17,6 +17,9 @@ package com.itsaky.androidide.utils +import org.slf4j.LoggerFactory +import java.io.PrintStream + /** * A stop watch helps to log duration between the time when the instance of the stopwatch instance * was created and the time when [StopWatch.log] or [StopWatch.lap] method is called. @@ -32,21 +35,28 @@ constructor( var lastLap: Long = start ) { - private val log = ILogger.newInstance(javaClass.simpleName) + companion object { + + private val log = LoggerFactory.getLogger(StopWatch::class.java) + } fun log() { - log.debug("$label completed in ${System.currentTimeMillis() - start}ms") + log.debug("{} completed in {}ms", label, System.currentTimeMillis() - start) } fun lap(message: String) { - log.debug("$message in ${System.currentTimeMillis() - start}ms") + log.debug("{} in {}ms", message, System.currentTimeMillis() - start) lastLap = System.currentTimeMillis() } fun lapFromLast(message: String) { - log.debug("$message in ${System.currentTimeMillis() - lastLap}ms") + log.debug("{} in {}ms", message, System.currentTimeMillis() - lastLap) lastLap = System.currentTimeMillis() } + + fun writeTo(stream: PrintStream) { + stream.println("$label completed in ${System.currentTimeMillis() - start}ms") + } } /** diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBAttr.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBAttr.java index 98033c92d..bd3931182 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBAttr.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBAttr.java @@ -35,6 +35,8 @@ */ package com.itsaky.androidide.javac.services; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import openjdk.tools.javac.code.Type; import openjdk.tools.javac.comp.Attr; import openjdk.tools.javac.comp.AttrContext; @@ -50,9 +52,6 @@ import openjdk.tools.javac.tree.TreeMaker; import openjdk.tools.javac.util.Context; import openjdk.tools.javac.util.List; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; - /** * @author lahvac */ diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBClassFinder.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBClassFinder.java index dfad771f7..d9fa7d4e7 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBClassFinder.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBClassFinder.java @@ -35,6 +35,13 @@ */ package com.itsaky.androidide.javac.services; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Locale; +import java.util.function.Supplier; +import java.util.logging.Level; +import java.util.logging.Logger; +import jdkx.tools.JavaFileObject; import openjdk.tools.javac.code.ClassFinder; import openjdk.tools.javac.code.Flags; import openjdk.tools.javac.code.Kinds.Kind; @@ -49,15 +56,6 @@ import openjdk.tools.javac.util.JCDiagnostic.SimpleDiagnosticPosition; import openjdk.tools.javac.util.Log; import openjdk.tools.javac.util.Names; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.Locale; -import java.util.function.Supplier; -import java.util.logging.Level; -import java.util.logging.Logger; - -import jdkx.tools.JavaFileObject; - /** * @author lahvac */ diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBClassReader.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBClassReader.java index 901ebd68e..60703a2eb 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBClassReader.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBClassReader.java @@ -38,8 +38,15 @@ package com.itsaky.androidide.javac.services; import static openjdk.tools.javac.jvm.ClassFile.Version.V45_3; import android.text.TextUtils; - -import com.itsaky.androidide.utils.ILogger; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import jdkx.tools.ForwardingJavaFileObject; +import jdkx.tools.JavaFileObject; import openjdk.tools.javac.code.ClassFinder.BadClassFile; import openjdk.tools.javac.code.Symbol; import openjdk.tools.javac.code.Symbol.ClassSymbol; @@ -50,24 +57,14 @@ import openjdk.tools.javac.resources.CompilerProperties.Warnings; import openjdk.tools.javac.util.Context; import openjdk.tools.javac.util.Log; import openjdk.tools.javac.util.Name; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -import jdkx.tools.ForwardingJavaFileObject; -import jdkx.tools.JavaFileObject; +import org.slf4j.LoggerFactory; /** * @author lahvac */ public class NBClassReader extends ClassReader { - private static final ILogger LOG = ILogger.newInstance("NBClassReader"); + private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(NBClassReader.class); private final NBNames nbNames; private final Log log; @@ -82,14 +79,14 @@ public class NBClassReader extends ClassReader { log = Log.instance(context); NBAttributeReader[] readers = { - new NBAttributeReader( - nbNames._org_netbeans_EnclosingMethod, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) { - public void read(Symbol sym, int attrLen) { - int newbp = bp + attrLen; - readEnclosingMethodAttr(sym); - bp = newbp; - } - }, + new NBAttributeReader( + nbNames._org_netbeans_EnclosingMethod, V45_3, CLASS_OR_MEMBER_ATTRIBUTE) { + public void read(Symbol sym, int attrLen) { + int newbp = bp + attrLen; + readEnclosingMethodAttr(sym); + bp = newbp; + } + }, }; for (NBAttributeReader r : readers) { @@ -99,7 +96,7 @@ public class NBClassReader extends ClassReader { @Override public BadClassFile badClassFile(final String key, final Object... args) { - LOG.debug("Bad class file", key, TextUtils.join(", ", args), new RuntimeException()); + LOG.debug("Bad class file {} {}", key, TextUtils.join(", ", args), new RuntimeException()); return super.badClassFile(key, args); } diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBJavaCompiler.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBJavaCompiler.java index 568edfea8..72107cb28 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBJavaCompiler.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBJavaCompiler.java @@ -35,6 +35,10 @@ */ package com.itsaky.androidide.javac.services; +import java.util.Collection; +import java.util.Collections; +import java.util.Queue; +import java.util.function.Consumer; import openjdk.tools.javac.comp.AttrContext; import openjdk.tools.javac.comp.Env; import openjdk.tools.javac.main.JavaCompiler; @@ -43,11 +47,6 @@ import openjdk.tools.javac.util.Context; import openjdk.tools.javac.util.List; import openjdk.tools.javac.util.Pair; -import java.util.Collection; -import java.util.Collections; -import java.util.Queue; -import java.util.function.Consumer; - /** * @author lahvac */ diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBJavacTrees.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBJavacTrees.java index 20510052d..556fb630e 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBJavacTrees.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBJavacTrees.java @@ -35,6 +35,9 @@ */ package com.itsaky.androidide.javac.services; +import java.util.HashMap; +import java.util.Map; +import jdkx.lang.model.element.Element; import openjdk.source.tree.VariableTree; import openjdk.source.util.TreePath; import openjdk.tools.javac.api.JavacTrees; @@ -46,11 +49,6 @@ import openjdk.tools.javac.tree.TreeInfo; import openjdk.tools.javac.tree.TreeMaker; import openjdk.tools.javac.util.Context; -import java.util.HashMap; -import java.util.Map; - -import jdkx.lang.model.element.Element; - /** * @author lahvac */ diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBLog.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBLog.java index 686c75ee5..246b906a2 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBLog.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBLog.java @@ -35,11 +35,6 @@ */ package com.itsaky.androidide.javac.services; -import openjdk.tools.javac.code.Symbol; -import openjdk.tools.javac.util.Context; -import openjdk.tools.javac.util.JCDiagnostic; -import openjdk.tools.javac.util.Log; - import java.io.PrintWriter; import java.net.URI; import java.util.ArrayList; @@ -48,9 +43,12 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; - import jdkx.tools.Diagnostic; import jdkx.tools.JavaFileObject; +import openjdk.tools.javac.code.Symbol; +import openjdk.tools.javac.util.Context; +import openjdk.tools.javac.util.JCDiagnostic; +import openjdk.tools.javac.util.Log; /** * @author Tomas Zezula diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBParserFactory.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBParserFactory.java index 0e680ffd4..e61f4f299 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBParserFactory.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/NBParserFactory.java @@ -35,7 +35,6 @@ */ package com.itsaky.androidide.javac.services; -import com.itsaky.androidide.utils.ILogger; import openjdk.tools.javac.parser.JavacParser; import openjdk.tools.javac.parser.Lexer; import openjdk.tools.javac.parser.ParserFactory; @@ -65,8 +64,6 @@ public class NBParserFactory extends ParserFactory { public static final String KEEP_COMMENTS_OVERRIDE_KEEP = "keep"; public static final String KEEP_COMMENTS_OVERRIDE_IGNORE = "ignore"; - private static final ILogger LOG = ILogger.newInstance("NBParserFactory"); - protected final ScannerFactory scannerFactory; protected final Names names; protected final CancelService cancelService; diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/CancelServiceImpl.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/CancelServiceImpl.kt index ae8bc53cd..366f6c0ec 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/CancelServiceImpl.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/CancelServiceImpl.kt @@ -19,14 +19,13 @@ package com.itsaky.androidide.javac.services.compiler import com.itsaky.androidide.javac.services.CancelService import com.itsaky.androidide.utils.ILogger -import java.util.concurrent.atomic.* +import java.util.concurrent.atomic.AtomicBoolean /** * Cancel service implementation for the java compiler. * @author Akash Yadav */ class CancelServiceImpl : CancelService() { - private val log = ILogger.newInstance(javaClass.simpleName) val cancelled = AtomicBoolean(false) /** @@ -36,11 +35,8 @@ class CancelServiceImpl : CancelService() { * otherwise. */ fun cancel(): Boolean { - log.info("...requesting compilation cancellation") - if (cancelled.getAndSet(true)) { - return false - } - return true + ILogger.ROOT.info("...requesting compilation cancellation") + return !cancelled.getAndSet(true) } override fun isCanceled(): Boolean = cancelled.get() diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/JavacFlowListener.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/JavacFlowListener.java index 18b170f0b..eecfd1fae 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/JavacFlowListener.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/JavacFlowListener.java @@ -18,10 +18,8 @@ package com.itsaky.androidide.javac.services.compiler; import androidx.annotation.NonNull; - -import openjdk.tools.javac.util.Context; - import jdkx.tools.JavaFileObject; +import openjdk.tools.javac.util.Context; /** * @author Akash Yadav diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/ReusableContext.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/ReusableContext.kt index e41c50f5a..050e0c959 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/ReusableContext.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/ReusableContext.kt @@ -31,7 +31,6 @@ import com.itsaky.androidide.javac.services.fs.CacheFSInfoSingleton import com.itsaky.androidide.javac.services.fs.JarPackageProviderImpl import com.itsaky.androidide.utils.VMUtils import com.itsaky.androidide.zipfs2.JarPackageProvider -import java.net.URI import jdkx.tools.DiagnosticListener import jdkx.tools.JavaFileManager import jdkx.tools.JavaFileObject @@ -57,6 +56,7 @@ import openjdk.tools.javac.util.Context import openjdk.tools.javac.util.DefinedBy import openjdk.tools.javac.util.DefinedBy.Api.COMPILER_TREE import openjdk.tools.javac.util.Log +import java.net.URI /** * Reusable [Context] for [ReusableCompiler]. diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/ReusableLog.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/ReusableLog.kt index 7b102f632..6bf08fba1 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/ReusableLog.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/compiler/ReusableLog.kt @@ -17,14 +17,14 @@ package com.itsaky.androidide.javac.services.compiler import com.itsaky.androidide.javac.services.NBLog +import jdkx.tools.Diagnostic +import jdkx.tools.DiagnosticListener +import jdkx.tools.JavaFileObject import openjdk.tools.javac.util.Context import openjdk.tools.javac.util.DefinedBy import openjdk.tools.javac.util.DefinedBy.Api.COMPILER import openjdk.tools.javac.util.Log import java.io.PrintWriter -import jdkx.tools.Diagnostic -import jdkx.tools.DiagnosticListener -import jdkx.tools.JavaFileObject /** * Reusable Log; exposes a method to clean up the component from leftovers associated with diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/CachedJarFileSystem.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/CachedJarFileSystem.kt index be24bda86..4a09dfe2e 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/CachedJarFileSystem.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/CachedJarFileSystem.kt @@ -19,10 +19,10 @@ package com.itsaky.androidide.javac.services.fs import com.itsaky.androidide.zipfs2.ZipFileSystem import com.itsaky.androidide.zipfs2.ZipFileSystemProvider +import jdkx.lang.model.SourceVersion import openjdk.tools.javac.file.RelativePath.RelativeDirectory import java.io.IOException import java.nio.file.Path -import jdkx.lang.model.SourceVersion /** * A cached file system for JAR files. diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/CachingJarFileSystemProvider.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/CachingJarFileSystemProvider.kt index 0654fc89f..8edfaf87a 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/CachingJarFileSystemProvider.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/CachingJarFileSystemProvider.kt @@ -17,9 +17,9 @@ package com.itsaky.androidide.javac.services.fs -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.zipfs2.JarFileSystemProvider import com.itsaky.androidide.zipfs2.ZipFileSystem +import org.slf4j.LoggerFactory import java.nio.file.FileSystem import java.nio.file.Path import java.nio.file.Paths @@ -34,7 +34,8 @@ import kotlin.io.path.pathString */ object CachingJarFileSystemProvider : JarFileSystemProvider() { private val cachedFs = ConcurrentHashMap() - private val log = ILogger.newInstance("CachingJarFileSystemProvider") + + private val log = LoggerFactory.getLogger(CachingJarFileSystemProvider::class.java) override fun createFs(path: Path, env: MutableMap?): ZipFileSystem { val cached = cachedFs[path.normalize().pathString] @@ -77,7 +78,7 @@ object CachingJarFileSystemProvider : JarFileSystemProvider() { fun clearCache(path: String) { val fs = cachedFs.remove(path) if (fs != null) { - log.debug("Clearing cached JAR file system for path:", path) + log.debug("Clearing cached JAR file system for path: {}", path) closeFs(fs) } } @@ -86,7 +87,7 @@ object CachingJarFileSystemProvider : JarFileSystemProvider() { try { fs.doClose() } catch (err: Throwable) { - log.error("Failed to close cached zip file system: $fs", err) + log.error("Failed to close cached zip file system: {}", fs, err) } } diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/JarPackageProviderImpl.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/JarPackageProviderImpl.kt index 8bbe8fdb4..0606a5b52 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/JarPackageProviderImpl.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/fs/JarPackageProviderImpl.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.javac.services.fs -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.zipfs2.JarPackageProvider import openjdk.tools.javac.file.RelativePath.RelativeDirectory import java.nio.file.Path diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/CompilationInfo.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/CompilationInfo.kt index cf109a6f1..95be6cf3b 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/CompilationInfo.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/CompilationInfo.kt @@ -17,11 +17,11 @@ package com.itsaky.androidide.javac.services.partial +import jdkx.tools.DiagnosticListener +import jdkx.tools.JavaFileObject import openjdk.source.tree.CompilationUnitTree import openjdk.tools.javac.api.JavacTaskImpl import openjdk.tools.javac.api.JavacTrees -import jdkx.tools.DiagnosticListener -import jdkx.tools.JavaFileObject /** * Information about a compilation. diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/DiagnosticListenerImpl.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/DiagnosticListenerImpl.java index f781c0c05..293359eeb 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/DiagnosticListenerImpl.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/DiagnosticListenerImpl.java @@ -18,10 +18,6 @@ package com.itsaky.androidide.javac.services.partial; import androidx.annotation.Nullable; - -import openjdk.tools.javac.api.ClientCodeWrapper; -import openjdk.tools.javac.util.JCDiagnostic; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -33,10 +29,11 @@ import java.util.Locale; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; - import jdkx.tools.Diagnostic; import jdkx.tools.DiagnosticListener; import jdkx.tools.JavaFileObject; +import openjdk.tools.javac.api.ClientCodeWrapper; +import openjdk.tools.javac.util.JCDiagnostic; /** * @author Akash Yadav diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/PartialReparserImpl.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/PartialReparserImpl.kt index 8fe22362b..b64a12cbf 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/PartialReparserImpl.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/PartialReparserImpl.kt @@ -21,7 +21,6 @@ import com.itsaky.androidide.javac.services.compiler.JavacFlowListener import com.itsaky.androidide.javac.services.util.ReparserUtils import com.itsaky.androidide.javac.services.visitors.FindAnonymousVisitor import com.itsaky.androidide.javac.services.visitors.TranslateMethodPositionsVisitor -import com.itsaky.androidide.utils.ILogger import openjdk.source.tree.BlockTree import openjdk.source.tree.ClassTree import openjdk.source.tree.CompilationUnitTree @@ -54,8 +53,9 @@ import openjdk.tools.javac.util.Context import openjdk.tools.javac.util.List import openjdk.tools.javac.util.Log import openjdk.tools.javac.util.Names +import org.slf4j.LoggerFactory import java.nio.CharBuffer -import java.util.* +import java.util.Arrays /** * Partial reparser implementation. @@ -64,9 +64,12 @@ import java.util.* */ class PartialReparserImpl : PartialReparser { - private val log = ILogger.newInstance(javaClass.simpleName) private var allowPartialReparse: Boolean = ReparserUtils.canReparse() + companion object { + private val log = LoggerFactory.getLogger(PartialReparserImpl::class.java) + } + override fun reparseMethod( ci: CompilationInfo, methodPath: TreePath, @@ -93,19 +96,19 @@ class PartialReparserImpl : PartialReparser { val origStartPos = jt.sourcePositions.getStartPosition(cu, method.body).toInt() val origEndPos = jt.sourcePositions.getEndPosition(cu, method.body).toInt() if (origStartPos < 0) { - log.warn("Javac returned start position $origStartPos < 0") + log.warn("Javac returned start position {} < 0", origStartPos) return false } if (origStartPos > origEndPos) { - log.warn("Java returned start position: $origStartPos > end position: $origEndPos") + log.warn("Java returned start position: {} > end position: {}", origStartPos, origEndPos) return false } val fav = FindAnonymousVisitor() fav.scan(method.body, null) if (fav.hasLocalClass) { - log.debug("Skipped reparse method. Old local classes.", fo) + log.debug("Skipped reparse method. Old local classes: {}", fo) return false } @@ -126,7 +129,7 @@ class PartialReparserImpl : PartialReparser { block = reparseMethodBody(context, cu, method, newBody, docComments) val endPosTable = (cu as JCCompilationUnit).endPositions if (block == null) { - log.debug("Skipped reparse method. Invalid position, newBody: $newBody") + log.debug("Skipped reparse method. Invalid position, newBody: {}", newBody) return false } @@ -142,7 +145,7 @@ class PartialReparserImpl : PartialReparser { val newNoInner = fav.noInner if (fav.hasLocalClass || noInner != newNoInner) { - log.debug("Skipped method reparse (new local class): $fo") + log.debug("Skipped method reparse (new local class): {}", fo) return false } diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/RichDiagnostic.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/RichDiagnostic.java index 061c24676..20c7775a7 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/RichDiagnostic.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/partial/RichDiagnostic.java @@ -17,13 +17,11 @@ package com.itsaky.androidide.javac.services.partial; +import java.util.Locale; +import jdkx.tools.Diagnostic; import openjdk.tools.javac.api.DiagnosticFormatter; import openjdk.tools.javac.util.JCDiagnostic; -import java.util.Locale; - -import jdkx.tools.Diagnostic; - /** * @author Akash Yadav */ diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/util/JavaDiagnosticUtils.kt b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/util/JavaDiagnosticUtils.kt index cfe66a06f..360c53439 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/util/JavaDiagnosticUtils.kt +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/util/JavaDiagnosticUtils.kt @@ -17,10 +17,10 @@ package com.itsaky.androidide.javac.services.util -import openjdk.tools.javac.api.ClientCodeWrapper -import openjdk.tools.javac.util.JCDiagnostic import jdkx.tools.Diagnostic import jdkx.tools.JavaFileObject +import openjdk.tools.javac.api.ClientCodeWrapper +import openjdk.tools.javac.util.JCDiagnostic /** @author Akash Yadav */ class JavaDiagnosticUtils { diff --git a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/util/ReparserUtils.java b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/util/ReparserUtils.java index 4d79c69cf..38f91b421 100644 --- a/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/util/ReparserUtils.java +++ b/subprojects/javac-services/src/main/java/com/itsaky/androidide/javac/services/util/ReparserUtils.java @@ -18,10 +18,11 @@ package com.itsaky.androidide.javac.services.util; import androidx.annotation.Nullable; - import com.itsaky.androidide.javac.services.visitors.UnEnter; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.utils.VMUtils; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Map; import openjdk.tools.javac.comp.Enter; import openjdk.tools.javac.parser.JavacParser; import openjdk.tools.javac.parser.LazyDocCommentTable; @@ -29,17 +30,15 @@ import openjdk.tools.javac.tree.DocCommentTable; import openjdk.tools.javac.tree.JCTree; import openjdk.tools.javac.util.Context; import openjdk.tools.javac.util.Position; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Akash Yadav */ public class ReparserUtils { - private static final ILogger LOG = ILogger.newInstance("ReparserUtils"); + private static final Logger LOG = LoggerFactory.getLogger(ReparserUtils.class); private static final boolean isAndroid = !VMUtils.isJvm(); private static boolean needUnenterScanner = true; diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/CachingProject.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/CachingProject.kt index e87080907..f623d75bf 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/CachingProject.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/CachingProject.kt @@ -28,8 +28,8 @@ import com.itsaky.androidide.tooling.api.ProjectType import com.itsaky.androidide.tooling.api.models.BasicProjectMetadata import com.itsaky.androidide.tooling.api.models.params.StringParameter import com.itsaky.androidide.tooling.api.models.result.SelectProjectResult -import com.itsaky.androidide.utils.ILogger -import java.util.concurrent.* +import org.slf4j.LoggerFactory +import java.util.concurrent.CompletableFuture /** * A project which lazily caches some required properties of the given project. @@ -39,11 +39,14 @@ import java.util.concurrent.* @RestrictTo(LIBRARY) open class CachingProject(val project: IProject) : IProject { - private val log = ILogger.newInstance(javaClass.simpleName) - private val projects = mutableListOf() private var syncIssues: DefaultProjectSyncIssues? = null + companion object { + + private val log = LoggerFactory.getLogger(CachingProject::class.java) + } + override fun getProjects(): CompletableFuture> { return if (this.projects.isNotEmpty()) { log.info("Using cached project metadata...") diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/FileManager.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/FileManager.kt index 4aad21601..2a6c95cd1 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/FileManager.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/FileManager.kt @@ -24,8 +24,8 @@ import com.itsaky.androidide.eventbus.events.file.FileDeletionEvent import com.itsaky.androidide.eventbus.events.file.FileRenameEvent import com.itsaky.androidide.progress.ProgressManager import com.itsaky.androidide.projects.models.ActiveDocument -import com.itsaky.androidide.utils.ILogger import org.apache.commons.io.FileUtils +import org.slf4j.LoggerFactory import java.io.BufferedReader import java.io.InputStream import java.net.URI @@ -44,7 +44,7 @@ import java.util.concurrent.ConcurrentHashMap */ object FileManager { - private val log = ILogger.newInstance(javaClass.simpleName) + private val log = LoggerFactory.getLogger(FileManager::class.java) private val activeDocuments = ConcurrentHashMap() fun isActive(uri: URI): Boolean { @@ -110,7 +110,7 @@ object FileManager { // create document if not already created // this should not happen under normal circumstances activeDocuments[event.changedFile.normalize()] = createDocument(event) - log.warn("Document change event received before open event for file ${event.changedFile}") + log.warn("Document change event received before open event for file {}", event.changedFile) return } diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt index 079017d44..cb086cc0d 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/ProjectManagerImpl.kt @@ -41,7 +41,6 @@ import com.itsaky.androidide.tooling.api.ProjectType import com.itsaky.androidide.tooling.api.messages.result.InitializeResult import com.itsaky.androidide.tooling.api.models.BuildVariantInfo import com.itsaky.androidide.utils.DocumentUtils -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import com.itsaky.androidide.utils.withStopWatch import kotlinx.coroutines.CoroutineScope @@ -55,6 +54,7 @@ import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.slf4j.LoggerFactory import java.io.File import java.nio.file.Files import java.nio.file.Path @@ -90,7 +90,7 @@ class ProjectManagerImpl : IProjectManager, EventReceiver { companion object { - private val log = ILogger.newInstance("ProjectManagerImpl") + private val log = LoggerFactory.getLogger(ProjectManagerImpl::class.java) @JvmStatic @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @@ -113,7 +113,8 @@ class ProjectManagerImpl : IProjectManager, EventReceiver { androidBuildVariants = buildVariants } - log.info("Found ${rootProject.projectSyncIssues.syncIssues.size} project sync issues: ${rootProject.projectSyncIssues.syncIssues}") + log.info("Found {} project sync issues: {}", rootProject.projectSyncIssues.syncIssues.size, + rootProject.projectSyncIssues.syncIssues) withStopWatch("Setup project") { val indexerScope = CoroutineScope(Dispatchers.Default) @@ -226,7 +227,7 @@ class ProjectManagerImpl : IProjectManager, EventReceiver { val variant = module.getSelectedVariant() if (variant == null) { log.error( - "Selected build variant for project '${module.path}' not found") + "Selected build variant for project '{}' not found", module.path) return@flatMap emptyList() } @@ -249,7 +250,7 @@ class ProjectManagerImpl : IProjectManager, EventReceiver { .whenComplete { result, taskErr -> if (result == null || !result.isSuccessful || taskErr != null) { log.warn( - "Execution for tasks failed: $tasks", + "Execution for tasks failed: {} {}", tasks, taskErr ?: "" ) } else { diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt index cdb3de241..06973daa5 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/AndroidModule.kt @@ -35,7 +35,6 @@ import com.itsaky.androidide.tooling.api.ProjectType.Android import com.itsaky.androidide.tooling.api.models.BasicAndroidVariantMetadata import com.itsaky.androidide.tooling.api.models.GradleTask import com.itsaky.androidide.tooling.api.util.findPackageName -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.withStopWatch import com.itsaky.androidide.xml.resources.ResourceTableRegistry import com.itsaky.androidide.xml.versions.ApiVersions @@ -50,6 +49,7 @@ import kotlinx.coroutines.awaitAll import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.toList +import org.slf4j.LoggerFactory import java.io.File import java.util.concurrent.CompletableFuture @@ -120,7 +120,10 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this.. tasks ) { - private val log = ILogger.newInstance(javaClass.simpleName) + companion object { + + private val log = LoggerFactory.getLogger(AndroidModule::class.java) + } init { type = Android @@ -140,7 +143,7 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this.. fun getResourceDirectories(): Set { if (mainSourceSet == null) { - log.error("No main source set found in application module: $name") + log.error("No main source set found in application module: {}", name) return emptySet() } @@ -160,7 +163,8 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this.. override fun getSourceDirectories(): Set { if (mainSourceSet == null) { - log.warn("No main source set is available for project $name. Cannot get source directories.") + log.warn("No main source set is available for project {}. Cannot get source directories.", + name) return mutableSetOf() } @@ -375,7 +379,7 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this.. } ) - log.info("Created ${it.size} resource tables for $deps dependencies of module '$path'") + log.info("Created {} resource tables for {} dependencies of module '{}'", it.size, deps, path) } } @@ -489,14 +493,14 @@ open class AndroidModule( // Class must be open because BaseXMLTest mocks this.. val info = projectManager.androidBuildVariants[this.path] if (info == null) { log.error( - "Failed to find selected build variant for module: '${this.path}'") + "Failed to find selected build variant for module: '{}'", this.path) return null } val variant = this.getVariant(info.selectedVariant) if (variant == null) { log.error( - "Build variant with name '${info.selectedVariant}' not found.") + "Build variant with name '{}' not found.", info.selectedVariant) return null } diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/GradleProject.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/GradleProject.kt index f74675eed..8778c6889 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/GradleProject.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/GradleProject.kt @@ -17,11 +17,9 @@ package com.itsaky.androidide.projects.api -import com.android.builder.model.v2.ide.ProjectType.APPLICATION import com.itsaky.androidide.tooling.api.ProjectType import com.itsaky.androidide.tooling.api.models.GradleTask import java.io.File -import java.nio.file.Path import java.util.concurrent.CompletableFuture /** diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/JavaModule.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/JavaModule.kt index 7c63f87a1..dab924af2 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/JavaModule.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/JavaModule.kt @@ -20,11 +20,11 @@ package com.itsaky.androidide.projects.api import com.itsaky.androidide.builder.model.IJavaCompilerSettings import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.tooling.api.ProjectType.Java -import com.itsaky.androidide.tooling.api.models.JavaModuleExternalDependency -import com.itsaky.androidide.tooling.api.models.JavaModuleProjectDependency import com.itsaky.androidide.tooling.api.models.GradleTask import com.itsaky.androidide.tooling.api.models.JavaContentRoot import com.itsaky.androidide.tooling.api.models.JavaModuleDependency +import com.itsaky.androidide.tooling.api.models.JavaModuleExternalDependency +import com.itsaky.androidide.tooling.api.models.JavaModuleProjectDependency import java.io.File /** diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/ModuleProject.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/ModuleProject.kt index 08b8f49b6..5b12e0a89 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/ModuleProject.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/api/ModuleProject.kt @@ -27,10 +27,10 @@ import com.itsaky.androidide.projects.util.BootClasspathProvider import com.itsaky.androidide.tooling.api.models.GradleTask import com.itsaky.androidide.utils.ClassTrie import com.itsaky.androidide.utils.DocumentUtils -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.SourceClassTrie import com.itsaky.androidide.utils.SourceClassTrie.SourceNode import com.itsaky.androidide.utils.StopWatch +import org.slf4j.LoggerFactory import java.io.File import java.nio.file.Path import kotlin.io.path.pathString @@ -51,12 +51,12 @@ abstract class ModuleProject( ) : GradleProject(name, description, path, projectDir, buildDir, buildScript, tasks) { - private val log = ILogger.newInstance(javaClass.simpleName) - abstract val compilerSettings: IJavaCompilerSettings companion object { + private val log = LoggerFactory.getLogger(ModuleProject::class.java) + @JvmStatic val COMPLETION_MODULE_KEY = Lookup.Key() } @@ -122,7 +122,7 @@ abstract class ModuleProject( /** Finds the source files and classes from source directories and classpaths and indexes them. */ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) fun indexSourcesAndClasspaths() { - log.info("Indexing sources and classpaths for project:", path) + log.info("Indexing sources and classpaths for project: {}", path) indexSources() indexClasspaths() } @@ -145,7 +145,7 @@ abstract class ModuleProject( topLevelClasses.forEach { this.compileClasspathClasses.append(it.name) } watch.log() - log.debug("Found ${topLevelClasses.size} classpaths.") + log.debug("Found {} classpaths.", topLevelClasses.size) if (this is AndroidModule) { BootClasspathProvider.update(bootClassPaths.map { it.path }) @@ -172,7 +172,7 @@ abstract class ModuleProject( } watch.log() - log.debug("Found $count source files.") + log.debug("Found {} source files.", count) } fun getSourceFilesInDir(dir: Path): List = diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/classpath/ZipFileClasspathReader.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/classpath/ZipFileClasspathReader.kt index ba630709f..3847308c0 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/classpath/ZipFileClasspathReader.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/classpath/ZipFileClasspathReader.kt @@ -19,7 +19,7 @@ package com.itsaky.androidide.projects.classpath import com.google.common.collect.ImmutableSet import java.io.File -import java.util.zip.* +import java.util.zip.ZipFile /** * Lists all classes from classpath(s). diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/BootClasspathProvider.java b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/BootClasspathProvider.java index 9f05b97d5..3203decfa 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/BootClasspathProvider.java +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/BootClasspathProvider.java @@ -18,11 +18,8 @@ package com.itsaky.androidide.projects.util; import com.itsaky.androidide.projects.classpath.JarFsClasspathReader; -import com.itsaky.androidide.projects.classpath.ZipFileClasspathReader; import com.itsaky.androidide.utils.ClassTrie; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.utils.StopWatch; - import java.io.File; import java.util.Collection; import java.util.Collections; @@ -30,6 +27,8 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Provides class names from the boot classpath (i.e. android.jar). @@ -39,26 +38,26 @@ import java.util.concurrent.ConcurrentHashMap; public class BootClasspathProvider { private static final Map bootClasspathClasses = new ConcurrentHashMap<>(); - private static final ILogger LOG = ILogger.newInstance("BootClassProvider"); + private static final Logger LOG = LoggerFactory.getLogger(BootClasspathProvider.class); /** * Updates the boot classpath cache. If a classpath is already indexed, it is skipped. * * @param classpaths The full file paths of JAR files to index. * @return true if the the classpath cache was updated. false otherwise. - *

This method true if and only if any new classpath classes are added into - * the cache. + *

This method true if and only if any new classpath classes are added into + * the cache. */ public static synchronized boolean update(Collection classpaths) { final var watch = new StopWatch("Indexing " + classpaths.size() + " bootclasspaths"); var count = 0; for (final var classpath : classpaths) { if (bootClasspathClasses.containsKey(classpath)) { - LOG.info("Skipping indexing for boot classpath as it is already indexed:", classpath); + LOG.info("Skipping indexing for boot classpath as it is already indexed: {}", classpath); continue; } - LOG.debug("Indexing boot classpath:", classpath); + LOG.debug("Indexing boot classpath: {}", classpath); final var classes = new JarFsClasspathReader().listClasses(Collections.singleton(new File(classpath))); final var trie = new ClassTrie(); diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt index d3fbafd74..31d2db7c7 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/ProjectTransformer.kt @@ -30,7 +30,7 @@ import com.itsaky.androidide.tooling.api.models.AndroidProjectMetadata import com.itsaky.androidide.tooling.api.models.BasicProjectMetadata import com.itsaky.androidide.tooling.api.models.JavaProjectMetadata import com.itsaky.androidide.tooling.api.models.params.StringParameter -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.util.concurrent.CopyOnWriteArrayList /** @@ -40,7 +40,9 @@ import java.util.concurrent.CopyOnWriteArrayList */ class ProjectTransformer { - private val log = ILogger.newInstance(javaClass.simpleName) + companion object { + private val log = LoggerFactory.getLogger(ProjectTransformer::class.java) + } fun transform(project: IProject): Project? { try { diff --git a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/StringSearch.java b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/StringSearch.java index 4a51dbc8b..63cd643a9 100644 --- a/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/StringSearch.java +++ b/subprojects/projects/src/main/java/com/itsaky/androidide/projects/util/StringSearch.java @@ -18,11 +18,9 @@ package com.itsaky.androidide.projects.util; import androidx.annotation.Nullable; - import com.itsaky.androidide.projects.FileManager; import com.itsaky.androidide.projects.models.ActiveJavaDocument; import com.itsaky.androidide.utils.Cache; - import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; diff --git a/subprojects/projects/src/test/java/com/itsaky/androidide/projects/api/ModuleProjectTest.kt b/subprojects/projects/src/test/java/com/itsaky/androidide/projects/api/ModuleProjectTest.kt index e6c0898d5..7c7306ac8 100644 --- a/subprojects/projects/src/test/java/com/itsaky/androidide/projects/api/ModuleProjectTest.kt +++ b/subprojects/projects/src/test/java/com/itsaky/androidide/projects/api/ModuleProjectTest.kt @@ -25,17 +25,17 @@ import com.itsaky.androidide.lookup.Lookup import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.projects.ProjectManagerImpl import com.itsaky.androidide.projects.builder.BuildService -import com.itsaky.androidide.tooling.api.IAndroidProject import com.itsaky.androidide.testing.tooling.ToolingApiTestLauncher +import com.itsaky.androidide.tooling.api.IAndroidProject import com.itsaky.androidide.utils.FileProvider import kotlinx.coroutines.runBlocking -import java.io.File -import java.nio.file.Files -import kotlin.io.path.writeText import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config +import java.io.File +import java.nio.file.Files +import kotlin.io.path.writeText /** @author Akash Yadav */ @RunWith(RobolectricTestRunner::class) diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/Main.java b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/Main.java index ec3e8566c..316a3b095 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/Main.java +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/Main.java @@ -17,16 +17,12 @@ package com.itsaky.androidide.tooling.impl; -import static com.itsaky.androidide.utils.ILogger.newInstance; - +import com.itsaky.androidide.logging.JvmStdErrAppender; import com.itsaky.androidide.tooling.api.IToolingApiClient; -import com.itsaky.androidide.tooling.api.messages.LogMessageParams; import com.itsaky.androidide.tooling.api.util.ToolingApiLauncher; import com.itsaky.androidide.tooling.impl.internal.ProjectImpl; +import com.itsaky.androidide.tooling.impl.logging.ToolingApiAppender; import com.itsaky.androidide.tooling.impl.progress.ForwardingProgressListener; -import com.itsaky.androidide.utils.ILogger; -import com.itsaky.androidide.utils.ILogger.Level; -import com.itsaky.androidide.utils.JvmLogger; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; import java.util.HashSet; @@ -37,18 +33,22 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import org.gradle.tooling.ConfigurableLauncher; import org.gradle.tooling.events.OperationType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class Main { - private static final ILogger LOG = newInstance("ToolingApiMain"); + private static final Logger LOG = LoggerFactory.getLogger(Main.class); public static IToolingApiClient client; public static Future future; - static { - JvmLogger.interceptor = Main::onLog; - } + private static ToolingApiAppender toolingApiLogAppender; public static void main(String[] args) { + + // disable the JVM std.err appender + System.setProperty(JvmStdErrAppender.PROP_JVM_STDERR_APPENDER_ENABLED, "false"); + LOG.debug("Starting Tooling API server..."); final var project = new ProjectImpl(); final var server = new ToolingApiServerImpl(project); @@ -58,8 +58,11 @@ public class Main { Main.client = (IToolingApiClient) launcher.getRemoteProxy(); server.connect(client); + Main.toolingApiLogAppender = new ToolingApiAppender(client); + Main.toolingApiLogAppender.attachToRoot(); + LOG.debug("Server started. Will run until shutdown message is received..."); - LOG.debug("Running on Java version:", System.getProperty("java.version", "")); + LOG.debug("Running on Java version: {}", System.getProperty("java.version", "")); try { Main.future.get(); @@ -84,9 +87,11 @@ public class Main { } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { - future = null; - client = null; - JvmLogger.interceptor = null; + Main.future = null; + Main.client = null; + + Main.toolingApiLogAppender.detachFromRoot(); + Main.toolingApiLogAppender = null; LOG.info("Tooling API server shutdown complete"); } @@ -125,7 +130,7 @@ public class Main { args.removeIf(Objects::isNull); args.removeIf(String::isBlank); - LOG.debug("Arguments from tooling client:", args); + LOG.debug("Arguments from tooling client: {}", args); launcher.addArguments(args); } catch (Throwable e) { LOG.error("Unable to get build arguments from tooling client", e); @@ -133,12 +138,6 @@ public class Main { } } - private static void onLog(Level level, String tag, String message) { - if (client != null) { - client.logMessage(new LogMessageParams(level.levelChar, tag, message)); - } - } - public static Set progressUpdateTypes() { final Set types = new HashSet<>(); diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt index 46a58c39a..f0d8a8c87 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/ToolingApiServerImpl.kt @@ -47,8 +47,7 @@ import com.itsaky.androidide.tooling.impl.internal.ProjectImpl import com.itsaky.androidide.tooling.impl.sync.ModelBuilderException import com.itsaky.androidide.tooling.impl.sync.RootModelBuilder import com.itsaky.androidide.tooling.impl.sync.RootProjectModelBuilderParams -import com.itsaky.androidide.tooling.impl.util.StopWatch -import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.utils.StopWatch import org.gradle.tooling.BuildCancelledException import org.gradle.tooling.BuildException import org.gradle.tooling.CancellationTokenSource @@ -59,6 +58,7 @@ import org.gradle.tooling.UnsupportedVersionException import org.gradle.tooling.exceptions.UnsupportedBuildArgumentException import org.gradle.tooling.exceptions.UnsupportedOperationConfigurationException import org.gradle.tooling.internal.consumer.DefaultGradleConnector +import org.slf4j.LoggerFactory import java.io.File import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletionException @@ -78,7 +78,6 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : private var connection: ProjectConnection? = null private var lastInitParams: InitializeProjectParams? = null private var _buildCancellationToken: CancellationTokenSource? = null - private val log = ILogger.newInstance(javaClass.simpleName) private val cancellationTokenAccessLock = ReentrantLock(/* fair = */ true) private var buildCancellationToken: CancellationTokenSource? @@ -104,6 +103,8 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : companion object { + private val log = LoggerFactory.getLogger(ToolingApiServerImpl::class.java) + /** * Time duration for which the the Tooling API server waits after calling * [DefaultGradleConnector.close] and before exiting the server's process. @@ -117,7 +118,7 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : override fun initialize(params: InitializeProjectParams): CompletableFuture { return runBuild { try { - log.debug("Got initialize request", params) + log.debug("Received project initialization request with params: {}", params) Main.checkGradleWrapper() @@ -129,7 +130,7 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : val failureReason = validateProjectDirectory(projectDirectory) if (failureReason != null) { - log.error("Cannot initialize project: $failureReason") + log.error("Cannot initialize project: {}", failureReason) return@runBuild InitializeResult(false, failureReason) } @@ -222,7 +223,7 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : override fun executeTasks(message: TaskExecutionMessage): CompletableFuture { return runBuild { if (!isServerInitialized().get()) { - log.error("Cannot execute tasks: $PROJECT_NOT_INITIALIZED") + log.error("Cannot execute tasks: {}", PROJECT_NOT_INITIALIZED) return@runBuild TaskExecutionResult(false, PROJECT_NOT_INITIALIZED) } @@ -231,12 +232,12 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : val projectDirectory = File(lastInitParams.directory) val failureReason = validateProjectDirectory(projectDirectory) if (failureReason != null) { - log.error("Cannot execute tasks: $failureReason") + log.error("Cannot execute tasks: {}", failureReason) return@runBuild TaskExecutionResult(isSuccessful = false, failureReason) } } - log.debug("Received request to run tasks.", message) + log.debug("Received request to run tasks: {}", message) Main.checkGradleWrapper() @@ -284,16 +285,16 @@ internal class ToolingApiServerImpl(private val project: ProjectImpl) : GradleDistributionType.GRADLE_INSTALLATION -> { val file = File(params.value) if (!file.exists() || !file.isDirectory) { - log.error("Specified Gradle installation does not exist:", params) + log.error("Specified Gradle installation does not exist: {}", params) return } - log.info("Using Gradle installation:", file.canonicalPath) + log.info("Using Gradle installation: {}", file.canonicalPath) connector.useInstallation(file) } GradleDistributionType.GRADLE_VERSION -> { - log.info("Using Gradle version '${params.value}'") + log.info("Using Gradle version '{}'", params.value) connector.useGradleVersion(params.value) } } diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/logging/ToolingApiAppender.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/logging/ToolingApiAppender.kt new file mode 100644 index 000000000..2f32645e4 --- /dev/null +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/logging/ToolingApiAppender.kt @@ -0,0 +1,65 @@ +/* + * This file is part of AndroidIDE. + * + * AndroidIDE is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * AndroidIDE is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with AndroidIDE. If not, see . + */ + +package com.itsaky.androidide.tooling.impl.logging + +import ch.qos.logback.classic.Logger +import ch.qos.logback.classic.LoggerContext +import ch.qos.logback.classic.spi.ILoggingEvent +import ch.qos.logback.core.AppenderBase +import com.itsaky.androidide.tooling.api.IToolingApiClient +import com.itsaky.androidide.tooling.api.messages.LogMessageParams +import org.slf4j.LoggerFactory + +/** + * [AppenderBase] implementation which forwards all logs to the tooling API client. + * + * @author Akash Yadav + */ +class ToolingApiAppender( + private val client: IToolingApiClient +) : AppenderBase() { + + fun attachToRoot() { + val rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME) as Logger + setContext(LoggerFactory.getILoggerFactory() as LoggerContext) + start() + + rootLogger.addAppender(this) + } + + fun detachFromRoot() { + stop() + + val rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME) as Logger + rootLogger.detachAppender(this) + } + + override fun append(eventObject: ILoggingEvent?) { + if (eventObject == null || !isStarted) { + return + } + + client.logMessage( + LogMessageParams( + eventObject.level.levelStr[0], + eventObject.loggerName, + eventObject.formattedMessage + ) + ) + } +} \ No newline at end of file diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/AbstractModelBuilder.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/AbstractModelBuilder.kt index 9a78527bf..45b89bf14 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/AbstractModelBuilder.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/AbstractModelBuilder.kt @@ -21,12 +21,12 @@ import com.android.builder.model.v2.models.Versions import com.itsaky.androidide.builder.model.DefaultSyncIssue import com.itsaky.androidide.builder.model.IDESyncIssue import com.itsaky.androidide.tooling.api.messages.InitializeProjectParams -import com.itsaky.androidide.tooling.impl.util.StopWatch import com.itsaky.androidide.tooling.api.util.ToolingProps import com.itsaky.androidide.utils.AndroidPluginVersion import com.itsaky.androidide.utils.AndroidPluginVersion.Companion.MINIMUM_SUPPORTED import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.LogUtils +import com.itsaky.androidide.utils.StopWatch import org.gradle.api.Action import org.gradle.tooling.BuildController import org.gradle.tooling.UnknownModelException diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/RootModelBuilder.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/RootModelBuilder.kt index e2a945e8f..e81571c66 100644 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/RootModelBuilder.kt +++ b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/sync/RootModelBuilder.kt @@ -27,9 +27,9 @@ import com.itsaky.androidide.tooling.api.util.AndroidModulePropertyCopier import com.itsaky.androidide.tooling.impl.Main import com.itsaky.androidide.tooling.impl.Main.finalizeLauncher import com.itsaky.androidide.tooling.impl.internal.ProjectImpl -import com.itsaky.androidide.utils.ILogger import org.gradle.tooling.ConfigurableLauncher import org.gradle.tooling.model.idea.IdeaProject +import org.slf4j.LoggerFactory import java.io.Serializable /** @@ -38,7 +38,8 @@ import java.io.Serializable * @author Akash Yadav */ class RootModelBuilder(initializationParams: InitializeProjectParams) : - AbstractModelBuilder(initializationParams), Serializable { + AbstractModelBuilder(initializationParams), + Serializable { private val serialVersionUID = 1L @@ -111,7 +112,7 @@ class RootModelBuilder(initializationParams: InitializeProjectParams) : executor.withCancellationToken(cancellationToken) } - val logger = ILogger.newInstance("ProjectReader") + val logger = LoggerFactory.getLogger("RootModelBuilder") logger.warn("Starting build. See build output for more details...") if (Main.client != null) { @@ -119,7 +120,7 @@ class RootModelBuilder(initializationParams: InitializeProjectParams) : } return executor.run().also { - logger.debug("Build action executed. Result:", it) + logger.debug("Build action executed. Result: {}", it) } } diff --git a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/util/StopWatch.kt b/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/util/StopWatch.kt deleted file mode 100644 index 054746652..000000000 --- a/subprojects/tooling-api-impl/src/main/java/com/itsaky/androidide/tooling/impl/util/StopWatch.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This file is part of AndroidIDE. - * - * AndroidIDE is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * AndroidIDE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with AndroidIDE. If not, see . - */ - -package com.itsaky.androidide.tooling.impl.util - -import com.itsaky.androidide.utils.ILogger -import java.io.PrintStream - -/** - * A stop watch helps to log duration between the time when the instance of the stopwatch instance - * was created and the time when [StopWatch.log] or [StopWatch.lap] method is called. - * - * @param label The label for the log message. - * @author Akash Yadav - */ -class StopWatch( - val label: String, - val start: Long = System.currentTimeMillis(), - var lastLap: Long = start -) { - constructor(label: String) : this(label, System.currentTimeMillis()) - - private val log = ILogger.newInstance(javaClass.simpleName) - - fun log() { - log.debug(getLogMessage()) - } - - private fun getLogMessage() = "$label completed in ${System.currentTimeMillis() - start}ms" - - fun writeTo(stream: PrintStream) { - stream.println(getLogMessage()) - } - - fun lap(message: String) { - log.debug("$message in ${System.currentTimeMillis() - start}ms") - lastLap = System.currentTimeMillis() - } - - fun lapFromLast(message: String) { - log.debug("$message in ${System.currentTimeMillis() - lastLap}ms") - lastLap = System.currentTimeMillis() - } -} diff --git a/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/CIOnlyToolingApiTests.kt b/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/CIOnlyToolingApiTests.kt index 68d01806a..aef3c99d5 100644 --- a/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/CIOnlyToolingApiTests.kt +++ b/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/CIOnlyToolingApiTests.kt @@ -17,6 +17,8 @@ package com.itsaky.androidide.tooling.impl +import ch.qos.logback.classic.Logger +import ch.qos.logback.classic.LoggerContext import com.google.common.truth.Truth.assertThat import com.itsaky.androidide.builder.model.IDESyncIssue import com.itsaky.androidide.buildinfo.BuildInfo @@ -28,6 +30,7 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.JUnit4 +import org.slf4j.LoggerFactory /** * @author Akash Yadav @@ -66,55 +69,72 @@ class CIOnlyToolingApiTests { @Test fun `test CI-only latest tested AGP version warning`() { - val log = CollectingLogger() - val agpVersion = AndroidPluginVersion.parse(BuildInfo.AGP_VERSION_LATEST) + collectOuput { appender -> + val agpVersion = AndroidPluginVersion.parse(BuildInfo.AGP_VERSION_LATEST) - val client = ToolingApiTestLauncher.MultiVersionTestClient( - agpVersion = agpVersion.toStringSimple(), - gradleVersion = BuildInfo.AGP_VERSION_GRADLE_LATEST, - log = log - ) - - ToolingApiTestLauncher.launchServer( - client = client, - log = log, - - // Version of Android Gradle Plugin that the tooling API should recognize - // as the latest one - sysProps = mapOf( - ToolingProps.TESTING_LATEST_AGP_VERSION - to ToolingApiTestLauncher.MultiVersionTestClient.DEFAULT_AGP_VERSION + val client = ToolingApiTestLauncher.MultiVersionTestClient( + agpVersion = agpVersion.toStringSimple(), + gradleVersion = BuildInfo.AGP_VERSION_GRADLE_LATEST ) - ) { - val output = log.toString() - if (result?.isSuccessful != true) { - // print the output if the initialization fails - println(output) + ToolingApiTestLauncher.launchServer( + client = client, + + // Version of Android Gradle Plugin that the tooling API should recognize + // as the latest one + sysProps = mapOf( + ToolingProps.TESTING_LATEST_AGP_VERSION + to ToolingApiTestLauncher.MultiVersionTestClient.DEFAULT_AGP_VERSION + ) + ) { + val output = appender.toString() + + if (result?.isSuccessful != true) { + // print the output if the initialization fails + println(output) + } + + assertThat(result?.isSuccessful).isTrue() + + val syncIssues = project.getProjectSyncIssues().get() + assertThat(syncIssues).isNotNull() + assertThat(syncIssues.syncIssues).isNotEmpty() + assertThat( + syncIssues.syncIssues.find { it.type == IDESyncIssue.TYPE_AGP_VERSION_TOO_NEW }).isNotNull() } - - assertThat(result?.isSuccessful).isTrue() - - val syncIssues = project.getProjectSyncIssues().get() - assertThat(syncIssues).isNotNull() - assertThat(syncIssues.syncIssues).isNotEmpty() - assertThat( - syncIssues.syncIssues.find { it.type == IDESyncIssue.TYPE_AGP_VERSION_TOO_NEW }).isNotNull() } } @Test fun `test CI-only minimum AGP version failure`() { - val log = CollectingLogger() - val agpVersion = "7.1.0" - val client = ToolingApiTestLauncher.MultiVersionTestClient(agpVersion = agpVersion, - gradleVersion = "7.2", log = log) - ToolingApiTestLauncher.launchServer(client = client, log = log) { - assertThat(result?.isSuccessful).isFalse() + collectOuput { appender -> + val agpVersion = "7.1.0" + val client = ToolingApiTestLauncher.MultiVersionTestClient(agpVersion = agpVersion, + gradleVersion = "7.2") + ToolingApiTestLauncher.launchServer(client = client) { + assertThat(result?.isSuccessful).isFalse() - val output = log.toString() - assertThat(output).contains( - "Android Gradle Plugin version $agpVersion is not supported by AndroidIDE.") + val output = appender.toString() + assertThat(output).contains( + "Android Gradle Plugin version $agpVersion is not supported by AndroidIDE.") + } + } + } + + private fun collectOuput(action: (appender: CollectingAppender) -> T): T { + + val appender = CollectingAppender() + val rootLogger = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME) as Logger + appender.context = LoggerFactory.getILoggerFactory() as LoggerContext + appender.start() + + rootLogger.addAppender(appender) + + return try { + action(appender) + } finally { + appender.stop() + rootLogger.detachAppender(appender) } } } \ No newline at end of file diff --git a/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/common.kt b/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/common.kt index 56d1b06c3..c102c6974 100644 --- a/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/common.kt +++ b/subprojects/tooling-api-impl/src/test/java/com/itsaky/androidide/tooling/impl/common.kt @@ -17,8 +17,11 @@ package com.itsaky.androidide.tooling.impl +import ch.qos.logback.classic.spi.ILoggingEvent +import ch.qos.logback.core.AppenderBase import com.android.builder.model.v2.ide.LibraryType import com.google.common.truth.Truth.assertThat +import com.itsaky.androidide.logging.encoder.IDELogFormatEncoder import com.itsaky.androidide.tooling.api.IAndroidProject import com.itsaky.androidide.tooling.api.IJavaProject import com.itsaky.androidide.tooling.api.IProject @@ -29,14 +32,15 @@ import com.itsaky.androidide.tooling.api.models.JavaModuleExternalDependency import com.itsaky.androidide.tooling.api.models.JavaModuleProjectDependency import com.itsaky.androidide.tooling.api.models.JavaProjectMetadata import com.itsaky.androidide.tooling.api.models.params.StringParameter -import com.itsaky.androidide.utils.ILogger -internal class CollectingLogger : ILogger(CollectingLogger::class.simpleName) { +internal class CollectingAppender : AppenderBase() { + private val encoder = IDELogFormatEncoder() private val string = StringBuilder() - override fun doLog(level: Level?, message: String?) { - string.append("${message?.trim()}${System.lineSeparator()}") + override fun append(eventObject: ILoggingEvent?) { + string.append(encoder.layout.doLayout(eventObject)) + string.append(System.lineSeparator()) } override fun toString(): String { diff --git a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/AndroidVariantMetadata.kt b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/AndroidVariantMetadata.kt index 2de755c2a..408555774 100644 --- a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/AndroidVariantMetadata.kt +++ b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/AndroidVariantMetadata.kt @@ -17,8 +17,6 @@ package com.itsaky.androidide.tooling.api.models -import java.io.Serializable - /** * Metadata about a variant in an Android project. * diff --git a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/GradleTask.kt b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/GradleTask.kt index dc4e70d99..da57be460 100644 --- a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/GradleTask.kt +++ b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/models/GradleTask.kt @@ -17,8 +17,6 @@ package com.itsaky.androidide.tooling.api.models -import java.io.Serializable - /** * A Gradle task. * diff --git a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/util/AndroidModulePropertyCopier.kt b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/util/AndroidModulePropertyCopier.kt index 81db1c05b..686337c87 100644 --- a/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/util/AndroidModulePropertyCopier.kt +++ b/subprojects/tooling-api-model/src/main/java/com/itsaky/androidide/tooling/api/util/AndroidModulePropertyCopier.kt @@ -50,7 +50,6 @@ import com.itsaky.androidide.builder.model.DefaultSourceSetContainer import com.itsaky.androidide.builder.model.DefaultSyncIssue import com.itsaky.androidide.builder.model.DefaultUnresolvedDependency import com.itsaky.androidide.builder.model.DefaultViewBindingOptions -import com.itsaky.androidide.utils.ILogger /** * As the data is sent over streams, and the instances of properties specified in [AndroidModule] @@ -63,8 +62,6 @@ import com.itsaky.androidide.utils.ILogger */ object AndroidModulePropertyCopier { - private val log = ILogger.newInstance(javaClass.simpleName) - fun copy(viewBindingOptions: ViewBindingOptions?): DefaultViewBindingOptions? { return when (viewBindingOptions) { null -> null diff --git a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/resources/DefaultResourceTableRegistry.kt b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/resources/DefaultResourceTableRegistry.kt index 6a7155d1a..b1c2ae56a 100644 --- a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/resources/DefaultResourceTableRegistry.kt +++ b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/resources/DefaultResourceTableRegistry.kt @@ -35,14 +35,14 @@ import com.android.aaptcompiler.extractPathData import com.google.auto.service.AutoService import com.itsaky.androidide.aapt.logging.IDELogger import com.itsaky.androidide.layoutlib.resources.ResourceVisibility.PUBLIC -import com.itsaky.androidide.utils.ILogger -import com.itsaky.androidide.xml.resources.ResourceTableRegistry -import com.itsaky.androidide.xml.resources.ResourceTableRegistry.Companion.PCK_ANDROID import com.itsaky.androidide.xml.internal.resources.DefaultResourceTableRegistry.SingleLineValueEntryType.ACTIVITY_ACTIONS import com.itsaky.androidide.xml.internal.resources.DefaultResourceTableRegistry.SingleLineValueEntryType.BROADCAST_ACTIONS import com.itsaky.androidide.xml.internal.resources.DefaultResourceTableRegistry.SingleLineValueEntryType.CATEGORIES import com.itsaky.androidide.xml.internal.resources.DefaultResourceTableRegistry.SingleLineValueEntryType.FEATURES import com.itsaky.androidide.xml.internal.resources.DefaultResourceTableRegistry.SingleLineValueEntryType.SERVICE_ACTIONS +import com.itsaky.androidide.xml.resources.ResourceTableRegistry +import com.itsaky.androidide.xml.resources.ResourceTableRegistry.Companion.PCK_ANDROID +import org.slf4j.LoggerFactory import java.io.File import java.util.concurrent.ConcurrentHashMap @@ -60,6 +60,7 @@ class DefaultResourceTableRegistry : ResourceTableRegistry { * @property filename The filename which contains the single-line entries. */ internal enum class SingleLineValueEntryType(val filename: String) { + ACTIVITY_ACTIONS(FN_INTENT_ACTIONS_ACTIVITY), BROADCAST_ACTIONS(FN_INTENT_ACTIONS_BROADCAST), SERVICE_ACTIONS(FN_INTENT_ACTIONS_SERVICE), @@ -67,19 +68,18 @@ class DefaultResourceTableRegistry : ResourceTableRegistry { FEATURES("features.txt") } - private val log = ILogger.newInstance(ResourceTableRegistry::class.java.simpleName) - private val tables = ConcurrentHashMap() private val platformTables = ConcurrentHashMap() private val manifestAttrs = ConcurrentHashMap() private val singleLineValueEntries = ConcurrentHashMap>>() - override var isLoggingEnabled: Boolean - get() = log.isEnabled - set(value) { - log.isEnabled = value - } + companion object { + + private val log = LoggerFactory.getLogger(DefaultResourceTableRegistry::class.java) + } + + override var isLoggingEnabled: Boolean = true override fun forPackage(name: String, vararg resDirs: File): ResourceTable? { @@ -91,7 +91,7 @@ class DefaultResourceTableRegistry : ResourceTableRegistry { ?: createTable(*resDirs)?.also { tables[name] = it it.packages.firstOrNull()?.name = name - + resDirs.forEach { resDir -> addFileReferences(it, name, resDir) } @@ -199,7 +199,7 @@ class DefaultResourceTableRegistry : ResourceTableRegistry { ?: createTable(dir)?.also { table -> platformTables[dir.path] = table table.packages.firstOrNull()?.name = PCK_ANDROID - + addFileReferences(table, PCK_ANDROID, dir) } } @@ -209,7 +209,9 @@ class DefaultResourceTableRegistry : ResourceTableRegistry { return null } - log.info("Creating resource table for ${resDirs.size} resource directories") + if (isLoggingEnabled) { + log.info("Creating resource table for {} resource directories", resDirs.size) + } val logger = BlameLogger(IDELogger) val table = ResourceTable() @@ -225,23 +227,25 @@ class DefaultResourceTableRegistry : ResourceTableRegistry { return table } - + private fun addFileReferences(table: ResourceTable, pck: String, resDir: File) { resDir.listFiles()?.forEach { dir -> if (dir.name.startsWith(SdkConstants.FD_RES_VALUES)) { return@forEach } - + dir.listFiles()?.forEach { file -> var typeName = dir.name if (typeName.contains('-')) { typeName = typeName.substringBefore('-') } - + val type = try { AaptResourceType.valueOf(typeName.uppercase()) } catch (error: Exception) { - log.warn("Unknown resource type:", typeName.uppercase(), error.message) + if (isLoggingEnabled) { + log.warn("Unknown resource type: {} :: {}", typeName.uppercase(), error.message) + } AaptResourceType.UNKNOWN } val resName = ResourceName(pck, type, file.nameWithoutExtension) @@ -249,9 +253,10 @@ class DefaultResourceTableRegistry : ResourceTableRegistry { } } } - + private fun getDefaultOptions(): TableExtractorOptions { - return TableExtractorOptions(translatable = true, errorOnPositionalArgs = false, visibility = PUBLIC) + return TableExtractorOptions(translatable = true, errorOnPositionalArgs = false, + visibility = PUBLIC) } private fun updateFromDirectory( @@ -310,7 +315,9 @@ class DefaultResourceTableRegistry : ResourceTableRegistry { try { extractor.extract(stream) } catch (err: Exception) { - log.warn("Failed to compile ${pathData.file}") + if (isLoggingEnabled) { + log.warn("Failed to compile {}", pathData.file) + } } } } diff --git a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/versions/DefaultApiVersionsRegistry.kt b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/versions/DefaultApiVersionsRegistry.kt index a532f25df..acb640624 100644 --- a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/versions/DefaultApiVersionsRegistry.kt +++ b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/versions/DefaultApiVersionsRegistry.kt @@ -18,13 +18,13 @@ package com.itsaky.androidide.xml.internal.versions import com.google.auto.service.AutoService -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.xml.versions.ApiVersions import com.itsaky.androidide.xml.versions.ApiVersionsRegistry import com.itsaky.androidide.xml.versions.ClassInfo import com.itsaky.androidide.xml.versions.FieldInfo import com.itsaky.androidide.xml.versions.Info import com.itsaky.androidide.xml.versions.MethodInfo +import org.slf4j.LoggerFactory import org.xmlpull.v1.XmlPullParser import org.xmlpull.v1.XmlPullParserFactory import java.io.File @@ -38,14 +38,13 @@ import java.util.concurrent.ConcurrentHashMap @AutoService(ApiVersionsRegistry::class) class DefaultApiVersionsRegistry : ApiVersionsRegistry { - private val log = ILogger.newInstance(javaClass.simpleName) private val versions = ConcurrentHashMap() - override var isLoggingEnabled: Boolean - get() = log.isEnabled - set(value) { - log.isEnabled = value - } + companion object { + private val log = LoggerFactory.getLogger(DefaultApiVersionsRegistry::class.java) + } + + override var isLoggingEnabled: Boolean = true override fun forPlatformDir(platform: File): ApiVersions? { var version = versions[platform.path] @@ -64,7 +63,10 @@ class DefaultApiVersionsRegistry : ApiVersionsRegistry { return null } - log.info("Creating API versions table for platform dir: $platform") + if (isLoggingEnabled) { + log.info("Creating API versions table for platform dir: $platform") + } + return versionsFile.bufferedReader().use { val parser = XmlPullParserFactory.newInstance().run { diff --git a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/versions/DefaultClassInfo.kt b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/versions/DefaultClassInfo.kt index 73de67118..ea97fdeb0 100644 --- a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/versions/DefaultClassInfo.kt +++ b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/versions/DefaultClassInfo.kt @@ -20,8 +20,8 @@ package com.itsaky.androidide.xml.internal.versions import com.itsaky.androidide.xml.versions.ClassInfo import com.itsaky.androidide.xml.versions.FieldInfo import com.itsaky.androidide.xml.versions.MethodInfo -import java.util.concurrent.ConcurrentHashMap import org.eclipse.jdt.core.Signature +import java.util.concurrent.ConcurrentHashMap /** * Default implementation of [ClassInfo] diff --git a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/widgets/DefaultWidgetTable.kt b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/widgets/DefaultWidgetTable.kt index 6e42bf7a6..a69c32644 100644 --- a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/widgets/DefaultWidgetTable.kt +++ b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/widgets/DefaultWidgetTable.kt @@ -17,11 +17,11 @@ package com.itsaky.androidide.xml.internal.widgets -import com.itsaky.androidide.utils.ILogger -import com.itsaky.androidide.xml.widgets.Widget -import com.itsaky.androidide.xml.widgets.WidgetTable import com.itsaky.androidide.xml.internal.widgets.util.DefaultWidget import com.itsaky.androidide.xml.internal.widgets.util.WidgetParser +import com.itsaky.androidide.xml.widgets.Widget +import com.itsaky.androidide.xml.widgets.WidgetTable +import org.slf4j.LoggerFactory /** * Default implementation of [WidgetTable]. @@ -30,9 +30,13 @@ import com.itsaky.androidide.xml.internal.widgets.util.WidgetParser */ class DefaultWidgetTable : WidgetTable { - private val log = ILogger.newInstance(javaClass.simpleName) private val root: WidgetNode = WidgetNode(name = "", isWidget = false) + companion object { + + private val log = LoggerFactory.getLogger(DefaultWidgetTable::class.java) + } + override fun getWidget(name: String): Widget? { val node = getNode(name)!! if (!node.isWidget) { @@ -86,7 +90,7 @@ class DefaultWidgetTable : WidgetTable { val widget = WidgetParser.parse(line) ?: run { - log.debug("Cannot parse widget from line: $line") + log.debug("Cannot parse widget from line: {}", line) return } diff --git a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/widgets/DefaultWidgetTableRegistry.kt b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/widgets/DefaultWidgetTableRegistry.kt index 1f7c64409..c21a9f6b5 100644 --- a/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/widgets/DefaultWidgetTableRegistry.kt +++ b/subprojects/xml-utils/src/main/java/com/itsaky/androidide/xml/internal/widgets/DefaultWidgetTableRegistry.kt @@ -18,9 +18,9 @@ package com.itsaky.androidide.xml.internal.widgets import com.google.auto.service.AutoService -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.xml.widgets.WidgetTable import com.itsaky.androidide.xml.widgets.WidgetTableRegistry +import org.slf4j.LoggerFactory import java.io.File import java.util.concurrent.ConcurrentHashMap @@ -33,13 +33,13 @@ import java.util.concurrent.ConcurrentHashMap class DefaultWidgetTableRegistry : WidgetTableRegistry { private val tables = ConcurrentHashMap() - private val log = ILogger.newInstance(WidgetTableRegistry::class.java.simpleName) - override var isLoggingEnabled: Boolean - get() = log.isEnabled - set(value) { - log.isEnabled = value - } + companion object { + + private val log = LoggerFactory.getLogger(DefaultWidgetTableRegistry::class.java) + } + + override var isLoggingEnabled: Boolean = true override fun forPlatformDir(platform: File): WidgetTable? { var table = tables[platform.path] @@ -55,11 +55,16 @@ class DefaultWidgetTableRegistry : WidgetTableRegistry { private fun createTable(platformDir: File): WidgetTable? { val widgets = File(platformDir, "data/widgets.txt") if (!widgets.exists() || !widgets.isFile) { - log.warn("'widgets.txt' file does not exist in ${platformDir.absolutePath}/data directory") + if (isLoggingEnabled) { + log.warn("'widgets.txt' file does not exist in {}/data directory", platformDir.absolutePath) + } return null } - log.info("Creating widget table for platform dir: $platformDir") + if (isLoggingEnabled) { + log.info("Creating widget table for platform dir: {}", platformDir) + } + return widgets.inputStream().bufferedReader().useLines { val table = DefaultWidgetTable() it.forEach { line -> diff --git a/subprojects/xml-utils/src/test/java/com/itsaky/androidide/xml/resources/ResourceTableRegistryTest.kt b/subprojects/xml-utils/src/test/java/com/itsaky/androidide/xml/resources/ResourceTableRegistryTest.kt index 9a302e40c..c5af924d3 100644 --- a/subprojects/xml-utils/src/test/java/com/itsaky/androidide/xml/resources/ResourceTableRegistryTest.kt +++ b/subprojects/xml-utils/src/test/java/com/itsaky/androidide/xml/resources/ResourceTableRegistryTest.kt @@ -27,12 +27,12 @@ import com.android.aaptcompiler.ResourceName import com.android.aaptcompiler.android.ResValue.DataType import com.google.common.truth.Truth.assertThat import com.itsaky.androidide.xml.findAndroidJar -import com.itsaky.androidide.xml.resources.ResourceTableRegistry.Companion.PCK_ANDROID import com.itsaky.androidide.xml.internal.resources.DefaultResourceTableRegistry -import java.io.File +import com.itsaky.androidide.xml.resources.ResourceTableRegistry.Companion.PCK_ANDROID import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import java.io.File /** @author Akash Yadav */ @RunWith(RobolectricTestRunner::class) diff --git a/subprojects/xml-utils/src/test/java/com/itsaky/androidide/xml/widgets/WidgetTableRegistryTest.kt b/subprojects/xml-utils/src/test/java/com/itsaky/androidide/xml/widgets/WidgetTableRegistryTest.kt index 75dc37caa..26e9da0d6 100644 --- a/subprojects/xml-utils/src/test/java/com/itsaky/androidide/xml/widgets/WidgetTableRegistryTest.kt +++ b/subprojects/xml-utils/src/test/java/com/itsaky/androidide/xml/widgets/WidgetTableRegistryTest.kt @@ -19,10 +19,10 @@ package com.itsaky.androidide.xml.widgets import com.google.common.truth.Truth.assertThat import com.itsaky.androidide.xml.findAndroidJar -import java.io.File import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import java.io.File /** @author Akash Yadav */ @RunWith(RobolectricTestRunner::class) diff --git a/termux/termux-app/build.gradle.kts b/termux/termux-app/build.gradle.kts index 88c059ed9..7bb6b22bf 100644 --- a/termux/termux-app/build.gradle.kts +++ b/termux/termux-app/build.gradle.kts @@ -1,7 +1,7 @@ @file:Suppress("UnstableApiUsage") -import com.itsaky.androidide.plugins.TerminalBootstrapPackagesPlugin import com.itsaky.androidide.build.config.BuildConfig +import com.itsaky.androidide.plugins.TerminalBootstrapPackagesPlugin plugins { id("com.android.library") diff --git a/termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt b/termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt index 04efd6d00..2b03491b3 100644 --- a/termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt +++ b/termux/termux-app/src/main/java/com/itsaky/androidide/activities/TerminalActivity.kt @@ -23,18 +23,17 @@ import android.os.Bundle import android.os.IBinder import android.util.Log import android.view.View -import android.widget.Button import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat import com.itsaky.androidide.terminal.IdeTerminalSessionClient import com.itsaky.androidide.terminal.IdesetupSession import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError import com.termux.R import com.termux.app.TermuxActivity import com.termux.app.terminal.TermuxTerminalSessionActivityClient import com.termux.shared.termux.shell.command.runner.terminal.TermuxSession +import org.slf4j.LoggerFactory /** * @author Akash Yadav @@ -54,7 +53,7 @@ class TerminalActivity : TermuxActivity() { companion object { - private val log = ILogger.newInstance("TerminalActivity") + private val log = LoggerFactory.getLogger(TerminalActivity::class.java) private const val KEY_TERMINAL_CAN_ADD_SESSIONS = "ide.terminal.sessions.canAddSessions" const val EXTRA_ONBOARDING_RUN_IDESETUP = "ide.onboarding.terminal.runIdesetup" diff --git a/termux/termux-app/src/main/java/com/itsaky/androidide/terminal/IdesetupSession.kt b/termux/termux-app/src/main/java/com/itsaky/androidide/terminal/IdesetupSession.kt index cfa5ce352..540e384c8 100644 --- a/termux/termux-app/src/main/java/com/itsaky/androidide/terminal/IdesetupSession.kt +++ b/termux/termux-app/src/main/java/com/itsaky/androidide/terminal/IdesetupSession.kt @@ -20,11 +20,11 @@ package com.itsaky.androidide.terminal import android.content.Context import com.itsaky.androidide.managers.ToolsManager import com.itsaky.androidide.utils.Environment -import com.itsaky.androidide.utils.ILogger import com.termux.shared.file.FileUtils import com.termux.shared.shell.command.ExecutionCommand import com.termux.shared.termux.shell.command.runner.terminal.TermuxSession import com.termux.terminal.TerminalSession +import org.slf4j.LoggerFactory import java.io.File import java.nio.charset.StandardCharsets @@ -49,7 +49,7 @@ class IdesetupSession private constructor( companion object { - private val log = ILogger.newInstance("IdesetupSession") + private val log = LoggerFactory.getLogger(IdesetupSession::class.java) @JvmStatic fun wrap(session: TermuxSession?, script: File) : IdesetupSession? { @@ -76,7 +76,7 @@ class IdesetupSession private constructor( val error = FileUtils.writeTextToFile("idsetupScript", script.absolutePath, StandardCharsets.UTF_8, it.readBytes().toString(StandardCharsets.UTF_8), false) if (error != null) { - log.error("Failed to write idesetup script", error.errorLogString) + log.error("Failed to write idesetup script: {}", error.errorLogString) return false } } diff --git a/termux/termux-app/src/main/java/com/termux/app/TermuxApplication.java b/termux/termux-app/src/main/java/com/termux/app/TermuxApplication.java index f626aa3b2..f1347e031 100644 --- a/termux/termux-app/src/main/java/com/termux/app/TermuxApplication.java +++ b/termux/termux-app/src/main/java/com/termux/app/TermuxApplication.java @@ -5,7 +5,6 @@ import com.itsaky.androidide.app.BaseApplication; import com.termux.shared.errors.Error; import com.termux.shared.logger.Logger; import com.termux.shared.termux.TermuxConstants; -import com.termux.shared.termux.crash.TermuxCrashUtils; import com.termux.shared.termux.file.TermuxFileUtils; import com.termux.shared.termux.settings.preferences.TermuxAppSharedPreferences; import com.termux.shared.termux.settings.properties.TermuxAppSharedProperties; diff --git a/termux/termux-app/src/main/java/com/termux/app/TermuxInstaller.java b/termux/termux-app/src/main/java/com/termux/app/TermuxInstaller.java index 95e3318d6..a9af79bd4 100644 --- a/termux/termux-app/src/main/java/com/termux/app/TermuxInstaller.java +++ b/termux/termux-app/src/main/java/com/termux/app/TermuxInstaller.java @@ -1,5 +1,11 @@ package com.termux.app; +import static com.termux.shared.termux.TermuxConstants.TERMUX_PREFIX_DIR; +import static com.termux.shared.termux.TermuxConstants.TERMUX_PREFIX_DIR_PATH; +import static com.termux.shared.termux.TermuxConstants.TERMUX_STAGING_PREFIX_DIR; +import static com.termux.shared.termux.TermuxConstants.TERMUX_STAGING_PREFIX_DIR_PATH; +import static com.termux.shared.termux.shell.TermuxShellUtils.shellExists; + import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; @@ -8,20 +14,18 @@ import android.os.Environment; import android.system.Os; import android.util.Pair; import android.view.WindowManager; - import com.termux.R; +import com.termux.shared.android.PackageUtils; +import com.termux.shared.errors.Error; import com.termux.shared.file.FileUtils; -import com.termux.shared.termux.crash.TermuxCrashUtils; -import com.termux.shared.termux.file.TermuxFileUtils; import com.termux.shared.interact.MessageDialogUtils; import com.termux.shared.logger.Logger; import com.termux.shared.markdown.MarkdownUtils; -import com.termux.shared.errors.Error; -import com.termux.shared.android.PackageUtils; import com.termux.shared.termux.TermuxConstants; import com.termux.shared.termux.TermuxUtils; +import com.termux.shared.termux.crash.TermuxCrashUtils; +import com.termux.shared.termux.file.TermuxFileUtils; import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment; - import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; @@ -32,12 +36,6 @@ import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import static com.termux.shared.termux.TermuxConstants.TERMUX_PREFIX_DIR; -import static com.termux.shared.termux.TermuxConstants.TERMUX_PREFIX_DIR_PATH; -import static com.termux.shared.termux.TermuxConstants.TERMUX_STAGING_PREFIX_DIR; -import static com.termux.shared.termux.TermuxConstants.TERMUX_STAGING_PREFIX_DIR_PATH; -import static com.termux.shared.termux.shell.TermuxShellUtils.shellExists; - /** * Install the Termux bootstrap packages if necessary by following the below steps: *

diff --git a/termux/termux-app/src/main/java/com/termux/app/TermuxService.java b/termux/termux-app/src/main/java/com/termux/app/TermuxService.java index 3419e9b32..364bcaf1c 100644 --- a/termux/termux-app/src/main/java/com/termux/app/TermuxService.java +++ b/termux/termux-app/src/main/java/com/termux/app/TermuxService.java @@ -14,41 +14,38 @@ import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.PowerManager; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.termux.R; import com.termux.app.event.SystemEventReceiver; import com.termux.app.terminal.TermuxTerminalSessionActivityClient; import com.termux.app.terminal.TermuxTerminalSessionServiceClient; -import com.termux.shared.termux.plugins.TermuxPluginUtils; -import com.termux.shared.data.IntentUtils; -import com.termux.shared.net.uri.UriUtils; -import com.termux.shared.errors.Errno; -import com.termux.shared.shell.ShellUtils; -import com.termux.shared.shell.command.runner.app.AppShell; -import com.termux.shared.termux.settings.properties.TermuxAppSharedProperties; -import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment; -import com.termux.shared.termux.shell.TermuxShellUtils; -import com.termux.shared.termux.TermuxConstants; -import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY; -import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_SERVICE; -import com.termux.shared.termux.settings.preferences.TermuxAppSharedPreferences; -import com.termux.shared.termux.shell.TermuxShellManager; -import com.termux.shared.termux.shell.command.runner.terminal.TermuxSession; -import com.termux.shared.termux.terminal.TermuxTerminalSessionClientBase; -import com.termux.shared.logger.Logger; -import com.termux.shared.notification.NotificationUtils; import com.termux.shared.android.PermissionUtils; import com.termux.shared.data.DataUtils; +import com.termux.shared.data.IntentUtils; +import com.termux.shared.errors.Errno; +import com.termux.shared.logger.Logger; +import com.termux.shared.net.uri.UriUtils; +import com.termux.shared.notification.NotificationUtils; +import com.termux.shared.shell.ShellUtils; import com.termux.shared.shell.command.ExecutionCommand; import com.termux.shared.shell.command.ExecutionCommand.Runner; import com.termux.shared.shell.command.ExecutionCommand.ShellCreateMode; +import com.termux.shared.shell.command.runner.app.AppShell; +import com.termux.shared.termux.TermuxConstants; +import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_ACTIVITY; +import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_SERVICE; +import com.termux.shared.termux.plugins.TermuxPluginUtils; +import com.termux.shared.termux.settings.preferences.TermuxAppSharedPreferences; +import com.termux.shared.termux.settings.properties.TermuxAppSharedProperties; +import com.termux.shared.termux.shell.TermuxShellManager; +import com.termux.shared.termux.shell.TermuxShellUtils; +import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment; +import com.termux.shared.termux.shell.command.runner.terminal.TermuxSession; +import com.termux.shared.termux.terminal.TermuxTerminalSessionClientBase; import com.termux.terminal.TerminalEmulator; import com.termux.terminal.TerminalSession; import com.termux.terminal.TerminalSessionClient; - import java.io.Closeable; import java.util.ArrayList; import java.util.List; diff --git a/termux/termux-app/src/main/java/com/termux/app/activities/HelpActivity.java b/termux/termux-app/src/main/java/com/termux/app/activities/HelpActivity.java index 88f806f41..3b44f2868 100644 --- a/termux/termux-app/src/main/java/com/termux/app/activities/HelpActivity.java +++ b/termux/termux-app/src/main/java/com/termux/app/activities/HelpActivity.java @@ -10,9 +10,7 @@ import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; import android.widget.RelativeLayout; - import androidx.appcompat.app.AppCompatActivity; - import com.termux.shared.termux.TermuxConstants; /** Basic embedded browser for viewing help pages. */ diff --git a/termux/termux-app/src/main/java/com/termux/app/api/file/FileReceiverActivity.java b/termux/termux-app/src/main/java/com/termux/app/api/file/FileReceiverActivity.java index 3ce524f6b..59f02492d 100644 --- a/termux/termux-app/src/main/java/com/termux/app/api/file/FileReceiverActivity.java +++ b/termux/termux-app/src/main/java/com/termux/app/api/file/FileReceiverActivity.java @@ -6,26 +6,23 @@ import android.database.Cursor; import android.net.Uri; import android.provider.OpenableColumns; import android.util.Patterns; - import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; - import com.termux.R; +import com.termux.app.TermuxService; import com.termux.shared.android.PackageUtils; import com.termux.shared.data.DataUtils; import com.termux.shared.data.IntentUtils; -import com.termux.shared.net.uri.UriUtils; import com.termux.shared.interact.MessageDialogUtils; +import com.termux.shared.logger.Logger; import com.termux.shared.net.uri.UriScheme; -import com.termux.shared.termux.interact.TextInputDialogUtils; +import com.termux.shared.net.uri.UriUtils; import com.termux.shared.termux.TermuxConstants; import com.termux.shared.termux.TermuxConstants.TERMUX_APP; import com.termux.shared.termux.TermuxConstants.TERMUX_APP.TERMUX_SERVICE; -import com.termux.app.TermuxService; -import com.termux.shared.logger.Logger; +import com.termux.shared.termux.interact.TextInputDialogUtils; import com.termux.shared.termux.settings.properties.TermuxAppSharedProperties; import com.termux.shared.termux.settings.properties.TermuxPropertyConstants; - import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; diff --git a/termux/termux-app/src/main/java/com/termux/app/event/SystemEventReceiver.java b/termux/termux-app/src/main/java/com/termux/app/event/SystemEventReceiver.java index d0c32ce25..c8a4b4477 100644 --- a/termux/termux-app/src/main/java/com/termux/app/event/SystemEventReceiver.java +++ b/termux/termux-app/src/main/java/com/termux/app/event/SystemEventReceiver.java @@ -5,16 +5,14 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.termux.shared.data.IntentUtils; import com.termux.shared.logger.Logger; import com.termux.shared.termux.TermuxUtils; import com.termux.shared.termux.file.TermuxFileUtils; -import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment; import com.termux.shared.termux.shell.TermuxShellManager; +import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment; public class SystemEventReceiver extends BroadcastReceiver { diff --git a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxActivityRootView.java b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxActivityRootView.java index 7e8b0e9d3..475296f0a 100644 --- a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxActivityRootView.java +++ b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxActivityRootView.java @@ -11,10 +11,8 @@ import android.view.WindowInsets; import android.view.inputmethod.EditorInfo; import android.widget.FrameLayout; import android.widget.LinearLayout; - import androidx.annotation.Nullable; import androidx.core.view.WindowInsetsCompat; - import com.termux.app.TermuxActivity; import com.termux.shared.logger.Logger; import com.termux.shared.view.ViewUtils; diff --git a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxSessionsListViewController.java b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxSessionsListViewController.java index bf914b977..823272507 100644 --- a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxSessionsListViewController.java +++ b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxSessionsListViewController.java @@ -14,17 +14,14 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.TextView; - import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; - import com.termux.R; import com.termux.app.TermuxActivity; import com.termux.shared.termux.shell.command.runner.terminal.TermuxSession; import com.termux.shared.theme.NightMode; import com.termux.shared.theme.ThemeUtils; import com.termux.terminal.TerminalSession; - import java.util.List; public class TermuxSessionsListViewController extends ArrayAdapter implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { diff --git a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionActivityClient.java b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionActivityClient.java index 0ae08a338..cbf4f6ffe 100644 --- a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionActivityClient.java +++ b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionActivityClient.java @@ -9,26 +9,23 @@ import android.media.AudioAttributes; import android.media.SoundPool; import android.text.TextUtils; import android.widget.ListView; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.termux.R; -import com.termux.shared.interact.ShareUtils; -import com.termux.shared.termux.shell.command.runner.terminal.TermuxSession; -import com.termux.shared.termux.interact.TextInputDialogUtils; import com.termux.app.TermuxActivity; -import com.termux.shared.termux.terminal.TermuxTerminalSessionClientBase; -import com.termux.shared.termux.TermuxConstants; import com.termux.app.TermuxService; -import com.termux.shared.termux.settings.properties.TermuxPropertyConstants; -import com.termux.shared.termux.terminal.io.BellHandler; +import com.termux.shared.interact.ShareUtils; import com.termux.shared.logger.Logger; +import com.termux.shared.termux.TermuxConstants; +import com.termux.shared.termux.interact.TextInputDialogUtils; +import com.termux.shared.termux.settings.properties.TermuxPropertyConstants; +import com.termux.shared.termux.shell.command.runner.terminal.TermuxSession; +import com.termux.shared.termux.terminal.TermuxTerminalSessionClientBase; +import com.termux.shared.termux.terminal.io.BellHandler; import com.termux.terminal.TerminalColors; import com.termux.terminal.TerminalSession; import com.termux.terminal.TerminalSessionClient; import com.termux.terminal.TextStyle; - import java.io.File; import java.io.FileInputStream; import java.io.InputStream; diff --git a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionServiceClient.java b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionServiceClient.java index 2ad02acdf..0eaaa1b8b 100644 --- a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionServiceClient.java +++ b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalSessionServiceClient.java @@ -1,16 +1,13 @@ package com.termux.app.terminal; import android.app.Service; - import androidx.annotation.NonNull; - import com.termux.app.TermuxService; import com.termux.shared.termux.shell.command.runner.terminal.TermuxSession; import com.termux.shared.termux.terminal.TermuxTerminalSessionClientBase; import com.termux.terminal.TerminalSession; import com.termux.terminal.TerminalSessionClient; import java.io.Closeable; -import java.io.IOException; /** The {@link TerminalSessionClient} implementation that may require a {@link Service} for its interface methods. */ public class TermuxTerminalSessionServiceClient extends TermuxTerminalSessionClientBase implements diff --git a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java index 91fe31aa8..f46597c41 100644 --- a/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java +++ b/termux/termux-app/src/main/java/com/termux/app/terminal/TermuxTerminalViewClient.java @@ -12,34 +12,33 @@ import android.view.MotionEvent; import android.view.View; import android.widget.EditText; import android.widget.ListView; - +import androidx.drawerlayout.widget.DrawerLayout; import com.termux.R; import com.termux.app.TermuxActivity; +import com.termux.app.models.UserAction; +import com.termux.app.terminal.io.KeyboardShortcut; +import com.termux.shared.activities.ReportActivity; +import com.termux.shared.android.AndroidUtils; +import com.termux.shared.data.DataUtils; import com.termux.shared.file.FileUtils; import com.termux.shared.interact.MessageDialogUtils; import com.termux.shared.interact.ShareUtils; -import com.termux.shared.shell.ShellUtils; -import com.termux.shared.termux.TermuxBootstrap; -import com.termux.shared.termux.terminal.TermuxTerminalViewClientBase; -import com.termux.shared.termux.extrakeys.SpecialButton; -import com.termux.shared.android.AndroidUtils; -import com.termux.shared.termux.TermuxConstants; -import com.termux.shared.activities.ReportActivity; -import com.termux.shared.models.ReportInfo; -import com.termux.app.models.UserAction; -import com.termux.app.terminal.io.KeyboardShortcut; -import com.termux.shared.termux.settings.properties.TermuxPropertyConstants; -import com.termux.shared.data.DataUtils; import com.termux.shared.logger.Logger; import com.termux.shared.markdown.MarkdownUtils; +import com.termux.shared.models.ReportInfo; +import com.termux.shared.shell.ShellUtils; +import com.termux.shared.termux.TermuxBootstrap; +import com.termux.shared.termux.TermuxConstants; import com.termux.shared.termux.TermuxUtils; import com.termux.shared.termux.data.TermuxUrlUtils; +import com.termux.shared.termux.extrakeys.SpecialButton; +import com.termux.shared.termux.settings.properties.TermuxPropertyConstants; +import com.termux.shared.termux.terminal.TermuxTerminalViewClientBase; import com.termux.shared.view.KeyboardUtils; import com.termux.shared.view.ViewUtils; import com.termux.terminal.KeyHandler; import com.termux.terminal.TerminalEmulator; import com.termux.terminal.TerminalSession; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -47,8 +46,6 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import androidx.drawerlayout.widget.DrawerLayout; - public class TermuxTerminalViewClient extends TermuxTerminalViewClientBase { final TermuxActivity mActivity; diff --git a/termux/termux-app/src/main/java/com/termux/app/terminal/io/FullScreenWorkAround.java b/termux/termux-app/src/main/java/com/termux/app/terminal/io/FullScreenWorkAround.java index c01f8994d..535bd6b8d 100644 --- a/termux/termux-app/src/main/java/com/termux/app/terminal/io/FullScreenWorkAround.java +++ b/termux/termux-app/src/main/java/com/termux/app/terminal/io/FullScreenWorkAround.java @@ -3,7 +3,6 @@ package com.termux.app.terminal.io; import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; - import com.termux.app.TermuxActivity; /** diff --git a/termux/termux-app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java b/termux/termux-app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java index a526570b0..ab6e2d774 100644 --- a/termux/termux-app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java +++ b/termux/termux-app/src/main/java/com/termux/app/terminal/io/TerminalToolbarViewPager.java @@ -4,11 +4,9 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; - import androidx.annotation.NonNull; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; - import com.termux.R; import com.termux.app.TermuxActivity; import com.termux.shared.termux.extrakeys.ExtraKeysView; diff --git a/termux/termux-app/src/main/java/com/termux/app/terminal/io/TermuxTerminalExtraKeys.java b/termux/termux-app/src/main/java/com/termux/app/terminal/io/TermuxTerminalExtraKeys.java index a38e8cbbc..2a799b2bf 100644 --- a/termux/termux-app/src/main/java/com/termux/app/terminal/io/TermuxTerminalExtraKeys.java +++ b/termux/termux-app/src/main/java/com/termux/app/terminal/io/TermuxTerminalExtraKeys.java @@ -3,10 +3,8 @@ package com.termux.app.terminal.io; import android.annotation.SuppressLint; import android.view.Gravity; import android.view.View; - import androidx.annotation.NonNull; import androidx.drawerlayout.widget.DrawerLayout; - import com.termux.app.TermuxActivity; import com.termux.app.terminal.TermuxTerminalSessionActivityClient; import com.termux.app.terminal.TermuxTerminalViewClient; @@ -17,7 +15,6 @@ import com.termux.shared.termux.settings.properties.TermuxPropertyConstants; import com.termux.shared.termux.settings.properties.TermuxSharedProperties; import com.termux.shared.termux.terminal.io.TerminalExtraKeys; import com.termux.view.TerminalView; - import org.json.JSONException; public class TermuxTerminalExtraKeys extends TerminalExtraKeys { diff --git a/termux/termux-app/src/test/java/com/termux/app/TermuxActivityTest.java b/termux/termux-app/src/test/java/com/termux/app/TermuxActivityTest.java index bcb80f2c7..d36d56c14 100644 --- a/termux/termux-app/src/test/java/com/termux/app/TermuxActivityTest.java +++ b/termux/termux-app/src/test/java/com/termux/app/TermuxActivityTest.java @@ -1,12 +1,10 @@ package com.termux.app; import com.termux.shared.termux.data.TermuxUrlUtils; - -import org.junit.Assert; -import org.junit.Test; - import java.util.Collections; import java.util.LinkedHashSet; +import org.junit.Assert; +import org.junit.Test; public class TermuxActivityTest { diff --git a/termux/termux-app/src/test/java/com/termux/app/api/file/FileReceiverActivityTest.java b/termux/termux-app/src/test/java/com/termux/app/api/file/FileReceiverActivityTest.java index 1107671da..8f902871d 100644 --- a/termux/termux-app/src/test/java/com/termux/app/api/file/FileReceiverActivityTest.java +++ b/termux/termux-app/src/test/java/com/termux/app/api/file/FileReceiverActivityTest.java @@ -1,15 +1,12 @@ package com.termux.app.api.file; -import com.termux.app.api.file.FileReceiverActivity; - +import java.util.ArrayList; +import java.util.List; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import java.util.ArrayList; -import java.util.List; - @RunWith(RobolectricTestRunner.class) public class FileReceiverActivityTest { diff --git a/testing/lsp/src/main/java/com/itsaky/androidide/lsp/api/LSPTest.kt b/testing/lsp/src/main/java/com/itsaky/androidide/lsp/api/LSPTest.kt index ae36674a9..102c02e28 100644 --- a/testing/lsp/src/main/java/com/itsaky/androidide/lsp/api/LSPTest.kt +++ b/testing/lsp/src/main/java/com/itsaky/androidide/lsp/api/LSPTest.kt @@ -33,12 +33,11 @@ import com.itsaky.androidide.preferences.internal.tabSize import com.itsaky.androidide.projects.FileManager import com.itsaky.androidide.projects.ProjectManagerImpl import com.itsaky.androidide.projects.builder.BuildService +import com.itsaky.androidide.testing.tooling.ToolingApiTestLauncher import com.itsaky.androidide.tooling.api.IProject import com.itsaky.androidide.tooling.api.IToolingApiServer -import com.itsaky.androidide.testing.tooling.ToolingApiTestLauncher import com.itsaky.androidide.utils.Environment import com.itsaky.androidide.utils.FileProvider -import com.itsaky.androidide.utils.ILogger import io.github.rosemoe.sora.text.Content import io.mockk.every import io.mockk.mockkStatic @@ -49,6 +48,8 @@ import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.RuntimeEnvironment import org.robolectric.annotation.Config +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.io.File import java.nio.file.Path @@ -68,10 +69,11 @@ abstract class LSPTest { var file: Path? = null var contents: StringBuilder? = null - protected val log = ILogger.newInstance(javaClass.simpleName) - companion object { + @JvmStatic + protected val log: Logger = LoggerFactory.getLogger(LSPTest::class.java) + @JvmStatic protected var isInitialized: Boolean = false } diff --git a/testing/tooling/src/main/java/com/itsaky/androidide/testing/tooling/ToolingApiTestLauncher.kt b/testing/tooling/src/main/java/com/itsaky/androidide/testing/tooling/ToolingApiTestLauncher.kt index 630d7f881..304ffd71a 100644 --- a/testing/tooling/src/main/java/com/itsaky/androidide/testing/tooling/ToolingApiTestLauncher.kt +++ b/testing/tooling/src/main/java/com/itsaky/androidide/testing/tooling/ToolingApiTestLauncher.kt @@ -28,13 +28,14 @@ import com.itsaky.androidide.tooling.api.messages.LogMessageParams import com.itsaky.androidide.tooling.api.messages.result.BuildInfo import com.itsaky.androidide.tooling.api.messages.result.BuildResult import com.itsaky.androidide.tooling.api.messages.result.GradleWrapperCheckResult -import com.itsaky.androidide.tooling.api.messages.result.InitializeResult import com.itsaky.androidide.tooling.api.messages.toLogLine import com.itsaky.androidide.tooling.api.util.ToolingApiLauncher -import com.itsaky.androidide.tooling.events.ProgressEvent import com.itsaky.androidide.tooling.api.util.ToolingProps +import com.itsaky.androidide.tooling.events.ProgressEvent import com.itsaky.androidide.utils.FileProvider import com.itsaky.androidide.utils.ILogger +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.io.BufferedReader import java.io.File import java.io.InputStream @@ -76,11 +77,12 @@ object ToolingApiTestLauncher { projectDir.pathString, client.gradleDistParams ), - log: ILogger = ILogger.newInstance("BuildOutputLogger"), + log: Logger = LoggerFactory.getLogger("BuildOutputLogger"), sysProps: Map = emptyMap(), sysEnvs: Map = emptyMap(), action: ToolingApiTestScope.() -> Unit - ) = launchServer(ToolingApiTestLauncherParams(projectDir, client, initParams, log, sysProps, sysEnvs), action) + ) = launchServer( + ToolingApiTestLauncherParams(projectDir, client, initParams, log, sysProps, sysEnvs), action) @JvmOverloads @JvmStatic @@ -120,7 +122,8 @@ object ToolingApiTestLauncher { proc.onExit().whenComplete { process, error -> if (process != null) { - println("[ToolingApiTestLauncher] Tooling API server process finished with exit code: ${process.exitValue()}") + println( + "[ToolingApiTestLauncher] Tooling API server process finished with exit code: ${process.exitValue()}") } if (error != null) { println("[ToolingApiTestLauncher] Tooling API server process error") @@ -191,7 +194,7 @@ object ToolingApiTestLauncher { var agpVersion: String = DEFAULT_AGP_VERSION, var gradleVersion: String = DEFAULT_GRADLE_VERSION, private val androidBlockConfig: String = "", - private val log: ILogger = ILogger.newInstance(MultiVersionTestClient::class.simpleName), + private val log: Logger = LoggerFactory.getLogger(MultiVersionTestClient::class.java), private val extraArgs: List = emptyList(), private var excludeUnresolvedDependency: Boolean = false ) : IToolingApiClient { @@ -216,7 +219,16 @@ object ToolingApiTestLauncher { override fun logMessage(params: LogMessageParams) { val line = params.toLogLine() - log.log(line.level, line.formattedTagAndMessage()) + val message = line.message + val logger = LoggerFactory.getLogger(line.tag) + when (line.level) { + ILogger.Level.DEBUG -> logger.debug(message) + ILogger.Level.WARNING -> logger.warn(message) + ILogger.Level.ERROR -> logger.error(message) + ILogger.Level.INFO -> logger.info(message) + + else -> logger.trace(message) + } } override fun logOutput(line: String) { @@ -295,7 +307,7 @@ object ToolingApiTestLauncher { } } - private class Reader(val input: InputStream, val log: ILogger) : Runnable { + private class Reader(val input: InputStream, val log: Logger) : Runnable { override fun run() { try { @@ -306,7 +318,7 @@ object ToolingApiTestLauncher { line = reader.readLine() } } catch (error: Throwable) { - log.error(error) + log.error("An error occurred reading from tooling API", error) } } } diff --git a/testing/tooling/src/main/java/com/itsaky/androidide/testing/tooling/models/ToolingApiTestLauncherParams.kt b/testing/tooling/src/main/java/com/itsaky/androidide/testing/tooling/models/ToolingApiTestLauncherParams.kt index a76bc1f39..82a1e261c 100644 --- a/testing/tooling/src/main/java/com/itsaky/androidide/testing/tooling/models/ToolingApiTestLauncherParams.kt +++ b/testing/tooling/src/main/java/com/itsaky/androidide/testing/tooling/models/ToolingApiTestLauncherParams.kt @@ -20,7 +20,8 @@ package com.itsaky.androidide.testing.tooling.models import com.itsaky.androidide.testing.tooling.ToolingApiTestLauncher import com.itsaky.androidide.tooling.api.messages.InitializeProjectParams import com.itsaky.androidide.utils.FileProvider -import com.itsaky.androidide.utils.ILogger +import org.slf4j.Logger +import org.slf4j.LoggerFactory import java.nio.file.Path import kotlin.io.path.pathString @@ -36,7 +37,7 @@ data class ToolingApiTestLauncherParams( projectDir.pathString, client.gradleDistParams ), - val log: ILogger = ILogger.newInstance("BuildOutputLogger"), + val log: Logger = LoggerFactory.getLogger("BuildOutputLogger"), val sysProps: Map = emptyMap(), val sysEnvs: Map = emptyMap() ) \ No newline at end of file diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/ShowXmlActivity.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/ShowXmlActivity.kt index 13316fb31..dee880f29 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/ShowXmlActivity.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/ShowXmlActivity.kt @@ -28,11 +28,11 @@ import com.itsaky.androidide.editor.ui.IDEEditor import com.itsaky.androidide.preferences.internal.fontSize import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE import com.itsaky.androidide.uidesigner.databinding.ActivityShowXmlBinding -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashInfo import com.itsaky.androidide.utils.jetbrainsMono import io.github.rosemoe.sora.event.Unsubscribe import io.github.rosemoe.sora.widget.CodeEditor +import org.slf4j.LoggerFactory /** * An activity to show the XML code generated by UI Designer. @@ -45,9 +45,10 @@ class ShowXmlActivity : BaseIDEActivity() { private var unsubscribe: Unsubscribe? = null private var binding: ActivityShowXmlBinding? = null - private val log = ILogger.newInstance("ShowXmlActivity") - companion object { + + private val log = LoggerFactory.getLogger(ShowXmlActivity::class.java) + const val KEY_XML = "ide.uidesigner.viewXml.Xml" } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt index 78150d2a5..30e645279 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt @@ -40,8 +40,8 @@ import com.itsaky.androidide.uidesigner.databinding.ActivityUiDesignerBinding import com.itsaky.androidide.uidesigner.fragments.DesignerWorkspaceFragment import com.itsaky.androidide.uidesigner.utils.ViewToXml import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError +import org.slf4j.LoggerFactory import java.io.File /** @@ -52,7 +52,6 @@ import java.io.File class UIDesignerActivity : BaseIDEActivity() { private var binding: ActivityUiDesignerBinding? = null - private val log = ILogger.newInstance("UIDesignerActivity") private val viewModel by viewModels() private val workspace: DesignerWorkspaceFragment? @@ -96,23 +95,25 @@ class UIDesignerActivity : BaseIDEActivity() { } } + companion object { + + private val log = LoggerFactory.getLogger(UIDesignerActivity::class.java) + + const val EXTRA_FILE = "layout_file" + const val RESULT_GENERATED_XML = "ide.uidesigner.generatedXml" + } + private fun onXmlGenerated(xml: String) { setResult(RESULT_OK, Intent().apply { putExtra(RESULT_GENERATED_XML, xml) }) finish() } private fun onFailedToReturnXml(reason: String) { - log.error("Failed to generate XML code because '$reason'") + log.error("Failed to generate XML code because '{}'", reason) setResult(RESULT_CANCELED) finish() } - companion object { - - const val EXTRA_FILE = "layout_file" - const val RESULT_GENERATED_XML = "ide.uidesigner.generatedXml" - } - override fun bindLayout(): View { this.binding = ActivityUiDesignerBinding.inflate(layoutInflater) this.binding!!.root.childId = this.binding!!.container.id diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/ShowXmlAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/ShowXmlAction.kt index 7857a3b74..ac0eb3785 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/ShowXmlAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/ShowXmlAction.kt @@ -27,7 +27,6 @@ import com.itsaky.androidide.actions.markInvisible import com.itsaky.androidide.uidesigner.R import com.itsaky.androidide.uidesigner.ShowXmlActivity import com.itsaky.androidide.uidesigner.utils.ViewToXml -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.flashError /** @@ -39,8 +38,6 @@ class ShowXmlAction(context: Context) : UiDesignerAction() { override val id: String = "ide.uidesigner.showXml" - private val log = ILogger.newInstance("ShowXmlAction") - init { label = context.getString(R.string.xml) icon = ContextCompat.getDrawable(context, R.drawable.ic_language_xml) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/UndoAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/UndoAction.kt index 08c8ce90c..cbb890354 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/UndoAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/UndoAction.kt @@ -20,7 +20,6 @@ package com.itsaky.androidide.uidesigner.actions import android.content.Context import androidx.core.content.ContextCompat import com.itsaky.androidide.actions.ActionData -import com.itsaky.androidide.actions.hasRequiredData import com.itsaky.androidide.uidesigner.R /** diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/WidgetsCategoryAdapter.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/WidgetsCategoryAdapter.kt index 30ff99b30..da2919587 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/WidgetsCategoryAdapter.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/WidgetsCategoryAdapter.kt @@ -21,8 +21,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import androidx.transition.ChangeBounds -import androidx.transition.TransitionManager.beginDelayedTransition import com.itsaky.androidide.uidesigner.adapters.WidgetsCategoryAdapter.VH import com.itsaky.androidide.uidesigner.databinding.LayoutUiWidgetsCategoryBinding import com.itsaky.androidide.uidesigner.models.UiWidgetCategory diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/WidgetsItemAdapter.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/WidgetsItemAdapter.kt index c3ca8ca16..0a4bafa13 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/WidgetsItemAdapter.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/adapters/WidgetsItemAdapter.kt @@ -21,11 +21,11 @@ import android.content.ClipData import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.itsaky.androidide.inflater.models.UiWidget import com.itsaky.androidide.uidesigner.adapters.WidgetsItemAdapter.VH import com.itsaky.androidide.uidesigner.databinding.LayoutUiWidgetsItemBinding -import com.itsaky.androidide.uidesigner.fragments.DesignerWorkspaceFragment -import com.itsaky.androidide.inflater.models.UiWidget import com.itsaky.androidide.uidesigner.drag.WidgetDragShadowBuilder +import com.itsaky.androidide.uidesigner.fragments.DesignerWorkspaceFragment import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel /** @author Akash Yadav */ diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetTouchListener.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetTouchListener.kt index 6833ba611..8b9d58192 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetTouchListener.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/drag/WidgetTouchListener.kt @@ -25,7 +25,6 @@ import android.view.MotionEvent import android.view.View import android.view.View.OnTouchListener import androidx.core.view.ViewCompat -import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.uidesigner.fragments.DesignerWorkspaceFragment /** diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/DesignerWorkspaceFragment.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/DesignerWorkspaceFragment.kt index f1141ad4f..185b95efc 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/DesignerWorkspaceFragment.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/DesignerWorkspaceFragment.kt @@ -45,7 +45,7 @@ import com.itsaky.androidide.uidesigner.utils.UiLayoutInflater import com.itsaky.androidide.uidesigner.utils.bgDesignerView import com.itsaky.androidide.uidesigner.utils.layeredForeground import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.io.File /** @@ -55,7 +55,6 @@ import java.io.File */ class DesignerWorkspaceFragment : BaseFragment() { - private val log = ILogger.newInstance("DesignerWorkspaceFragment") private var binding: FragmentDesignerWorkspaceBinding? = null internal val viewModel by viewModels(ownerProducer = { requireActivity() }) @@ -94,6 +93,8 @@ class DesignerWorkspaceFragment : BaseFragment() { companion object { + private val log = LoggerFactory.getLogger(DesignerWorkspaceFragment::class.java) + const val DRAGGING_WIDGET = "DRAGGING_WIDGET" const val DRAGGING_WIDGET_MIME = "androidide/uidesigner_widget" const val HIERARCHY_CHANGE_TRANSITION_DURATION = 100L @@ -132,7 +133,7 @@ class DesignerWorkspaceFragment : BaseFragment() { viewModel.layoutHasError = false } } catch (e: Throwable) { - log.error(e) + log.error("Failed to inflate layout", e) viewModel.errText = "${e.message}${e.cause?.message?.let { "\n$it" } ?: ""}" viewModel.layoutHasError = true emptyList() @@ -175,7 +176,7 @@ class DesignerWorkspaceFragment : BaseFragment() { when (val fg = view.view.foreground) { null -> view.view.foreground = bgDesignerView(requireContext()) is UiViewLayeredForeground -> - log.warn("Attempt to reset UiViewLayeredForeground on view", view.name, fg::class.java) + log.warn("Attempt to reset UiViewLayeredForeground on view {} with foreground drawable type {}", view.name, fg::class.java) else -> view.view.foreground = layeredForeground(requireContext(), fg) } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/ViewInfoSheet.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/ViewInfoSheet.kt index 7133db724..03c1c8f3c 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/ViewInfoSheet.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/ViewInfoSheet.kt @@ -32,16 +32,15 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.itsaky.androidide.uidesigner.R import com.itsaky.androidide.uidesigner.databinding.LayoutViewInfoSheetBinding import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel -import com.itsaky.androidide.utils.ILogger /** @author Akash Yadav */ class ViewInfoSheet : BottomSheetDialogFragment() { + private var binding: LayoutViewInfoSheetBinding? = null private val viewModel by viewModels(ownerProducer = { requireActivity() }) - private val log = ILogger.newInstance("ViewInfoSheet") - companion object { + const val TAG = "ide.uidesigner.viewinfo" } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewAttrHandler.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewAttrHandler.kt index 6537e4395..5b8500800 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewAttrHandler.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/fragments/WorkspaceViewAttrHandler.kt @@ -17,8 +17,6 @@ package com.itsaky.androidide.uidesigner.fragments -import com.itsaky.androidide.inflater.IAttribute -import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.uidesigner.models.UiAttribute import com.itsaky.androidide.uidesigner.undo.AttrAddedAction import com.itsaky.androidide.uidesigner.undo.AttrRemovedAction diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAction.kt index 440797168..80f5ec58f 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/AttrAction.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.uidesigner.undo -import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.uidesigner.models.UiAttribute /** diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/UndoManager.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/UndoManager.kt index b7c78aad2..87ee51623 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/UndoManager.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/UndoManager.kt @@ -17,8 +17,6 @@ package com.itsaky.androidide.uidesigner.undo -import com.itsaky.androidide.utils.ILogger - /** * Handles undo and redo actions in the UI designer. * diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAction.kt index d083ac9f7..d179df830 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAction.kt @@ -17,9 +17,6 @@ package com.itsaky.androidide.uidesigner.undo -import com.itsaky.androidide.inflater.IView -import com.itsaky.androidide.inflater.IViewGroup - /** * An action related to a view. * diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAddedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAddedAction.kt index 972e92c53..a0d0a3b55 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAddedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewAddedAction.kt @@ -17,9 +17,6 @@ package com.itsaky.androidide.uidesigner.undo -import com.itsaky.androidide.inflater.IView -import com.itsaky.androidide.inflater.IViewGroup - /** * Represents the action when the user adds a view to a view group. * diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewMovedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewMovedAction.kt index 36da04ca6..a282401d2 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewMovedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewMovedAction.kt @@ -17,9 +17,6 @@ package com.itsaky.androidide.uidesigner.undo -import com.itsaky.androidide.inflater.IView -import com.itsaky.androidide.inflater.IViewGroup - /** * Represents the action when the user moves a view from one view group to another. * diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewRemovedAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewRemovedAction.kt index 608294eec..21e5ba4ed 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewRemovedAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/ViewRemovedAction.kt @@ -17,9 +17,6 @@ package com.itsaky.androidide.uidesigner.undo -import com.itsaky.androidide.inflater.IView -import com.itsaky.androidide.inflater.IViewGroup - /** * Represents the action when the user removes a view from a view group. * diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/undoUtils.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/undoUtils.kt index 6b4ad8ebc..636be9a3f 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/undoUtils.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/undo/undoUtils.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.uidesigner.undo -import com.itsaky.androidide.inflater.IViewGroup import kotlin.math.max import kotlin.math.min diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ValueCompletionProvider.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ValueCompletionProvider.kt index fe40c57e2..8b67b0f9d 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ValueCompletionProvider.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ValueCompletionProvider.kt @@ -24,8 +24,8 @@ import com.itsaky.androidide.lsp.util.setupLookupForCompletion import com.itsaky.androidide.lsp.xml.models.XMLServerSettings import com.itsaky.androidide.lsp.xml.providers.XmlCompletionProvider import com.itsaky.androidide.lsp.xml.providers.completion.AttrValueCompletionProvider -import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.SingleTextWatcher +import org.slf4j.LoggerFactory import java.io.File /** @@ -69,10 +69,14 @@ internal class ValueCompletionProvider( private val onComplete: (List) -> Unit ) : Thread("AttributeValueCompletionThread") { - private val log = ILogger.newInstance("CompletionThread") var prefix: String = "" var attribute: com.itsaky.androidide.inflater.IAttribute? = null + companion object { + + private val log = LoggerFactory.getLogger(CompletionThread::class.java) + } + fun cancel() { interrupt() } @@ -84,9 +88,9 @@ internal class ValueCompletionProvider( onComplete(emptyList()) return } - + val ns = attribute.namespace?.prefix?.let { "${it}:" } ?: "" - log.info("Complete attribute value: '${ns}${attribute.name}'") + log.info("Complete attribute value: '{}{}'", ns, attribute.name) val result = completionProvider.completeValue( @@ -97,7 +101,8 @@ internal class ValueCompletionProvider( ) log.debug( - "Found ${result.items.size} items", + "Found {} items{}", + result.items.size, if (result.isIncomplete) "(incomplete)" else "", ) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt index 399765191..6f13907da 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt @@ -27,7 +27,7 @@ import com.itsaky.androidide.lsp.xml.utils.XMLBuilder import com.itsaky.androidide.tasks.executeAsyncProvideError import com.itsaky.androidide.uidesigner.R import com.itsaky.androidide.utils.DialogUtils -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletionException @@ -38,7 +38,7 @@ import java.util.concurrent.CompletionException */ object ViewToXml { - private val log = ILogger.newInstance("ViewToXml") + private val log = LoggerFactory.getLogger(ViewToXml::class.java) @JvmStatic @JvmOverloads @@ -68,13 +68,13 @@ object ViewToXml { val progress = DialogUtils.newProgressDialog( - this, - getString(R.string.title_generating_xml), - getString(R.string.please_wait), - false - ) { _, _ -> - future.cancel(true) - } + this, + getString(R.string.title_generating_xml), + getString(R.string.please_wait), + false + ) { _, _ -> + future.cancel(true) + } .show() future.whenComplete { result, error -> @@ -116,7 +116,7 @@ object ViewToXml { for (attr in view.attributes) { linefeed() indent(indent) - + val ns = attr.namespace?.prefix?.let { "${it}:" } ?: "" addSingleAttribute("${ns}${attr.name}", attr.value, true) } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/WorkspaceHierarchyChangeListener.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/WorkspaceHierarchyChangeListener.kt index 6321c652b..5260f66d5 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/WorkspaceHierarchyChangeListener.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/WorkspaceHierarchyChangeListener.kt @@ -17,7 +17,6 @@ package com.itsaky.androidide.uidesigner.utils -import com.itsaky.androidide.inflater.IViewGroup import com.itsaky.androidide.uidesigner.models.UiViewGroup import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/views/LayoutHierarchyView.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/views/LayoutHierarchyView.kt index 612fa6426..6e2356541 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/views/LayoutHierarchyView.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/views/LayoutHierarchyView.kt @@ -32,7 +32,6 @@ import androidx.core.view.updatePaddingRelative import com.blankj.utilcode.util.SizeUtils import com.google.android.material.textview.MaterialTextView import com.itsaky.androidide.inflater.IView -import com.itsaky.androidide.inflater.IViewGroup import com.itsaky.androidide.uidesigner.R import com.itsaky.androidide.utils.resolveAttr diff --git a/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt b/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt index d1bef91ea..e5ff0b36d 100644 --- a/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt +++ b/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/UiDesignerTest.kt @@ -22,7 +22,6 @@ import android.view.View import android.widget.LinearLayout import androidx.appcompat.app.AppCompatActivity import com.itsaky.androidide.inflater.IComponentFactory.Companion.LAYOUT_INFLATER_COMPONENT_FACTORY_KEY -import com.itsaky.androidide.inflater.IViewGroup import com.itsaky.androidide.inflater.internal.LayoutFile import com.itsaky.androidide.inflater.internal.ViewGroupImpl import com.itsaky.androidide.inflater.internal.ViewImpl @@ -30,8 +29,8 @@ import com.itsaky.androidide.inflater.internal.utils.ViewFactory import com.itsaky.androidide.inflater.viewGroup import com.itsaky.androidide.lookup.Lookup import com.itsaky.androidide.uidesigner.utils.UiInflaterComponentFactory -import java.io.File import org.robolectric.Robolectric +import java.io.File private val activity by lazy { Robolectric.buildActivity(AppCompatActivity::class.java).get() } diff --git a/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/undo/UndoManagerTest.kt b/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/undo/UndoManagerTest.kt index c1f11618e..8e4ac60ca 100644 --- a/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/undo/UndoManagerTest.kt +++ b/uidesigner/src/test/java/com/itsaky/androidide/uidesigner/undo/UndoManagerTest.kt @@ -18,8 +18,8 @@ package com.itsaky.androidide.uidesigner.undo import com.google.common.truth.Truth.assertThat -import com.itsaky.androidide.uidesigner.createView import com.itsaky.androidide.uidesigner.createLayout +import com.itsaky.androidide.uidesigner.createView import com.itsaky.androidide.uidesigner.models.UiAttribute import com.itsaky.androidide.uidesigner.requiresActivity import org.junit.Test diff --git a/xml-inflater/src/main/AndroidManifest.xml b/xml-inflater/src/main/AndroidManifest.xml index e62e7b210..196d16e36 100644 --- a/xml-inflater/src/main/AndroidManifest.xml +++ b/xml-inflater/src/main/AndroidManifest.xml @@ -16,6 +16,6 @@ ~ along with AndroidIDE. If not, see . --> - + \ No newline at end of file diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java index e78dc6e6c..a33abab72 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/DrawableParserFactory.java @@ -22,23 +22,20 @@ import android.graphics.NinePatch; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.NinePatchDrawable; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import com.blankj.utilcode.util.FileIOUtils; import com.blankj.utilcode.util.ImageUtils; -import com.itsaky.androidide.utils.ILogger; import com.itsaky.androidide.inflater.vectormaster.VectorMasterDrawable; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; - import java.io.File; import java.io.IOException; import java.io.Reader; import java.io.StringReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; /** * Utility methods for creating instances of suitable drawable parsers for a file or an XML code. @@ -47,7 +44,7 @@ import java.io.StringReader; */ public abstract class DrawableParserFactory { - private static final ILogger LOG = ILogger.newInstance("IDrawableParser"); + private static final Logger LOG = LoggerFactory.getLogger(DrawableParserFactory.class); /** * Create a new drawable parser for the given file. If the given file is not an XML Document, then @@ -164,7 +161,7 @@ public abstract class DrawableParserFactory { return constructor.newInstance(parser, IDrawableParser.ANY_DEPTH); } } catch (Throwable th) { - LOG.error("No drawable parser found for tag", name, th); + LOG.error("No drawable parser found for tag: {}", name, th); } return null; diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt index 7f181de9e..8d4815929 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/drawable/StateListParser.kt @@ -21,7 +21,7 @@ import android.content.Context import android.graphics.drawable.Drawable import android.graphics.drawable.StateListDrawable import com.itsaky.androidide.inflater.InflateException -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import org.xmlpull.v1.XmlPullParser /** @@ -29,11 +29,18 @@ import org.xmlpull.v1.XmlPullParser * * @author Akash Yadav */ -class StateListParser protected constructor(parser: XmlPullParser?, minDepth: Int) : IDrawableParser(parser, minDepth) { +class StateListParser(parser: XmlPullParser?, minDepth: Int) : + IDrawableParser(parser, minDepth) { + + companion object { + + private val log = LoggerFactory.getLogger(StateListParser::class.java) + } + @Throws(Exception::class) public override fun parseDrawable(context: Context): Drawable { val states = StateListDrawable() - + // --------------------------- NOTE ------------------------- // Unsupported attributes : // 1. android:constantSize @@ -58,7 +65,7 @@ class StateListParser protected constructor(parser: XmlPullParser?, minDepth: In } return states } - + /** * Add all the defined states of the current tag in `parser` to the given state list * drawable. @@ -89,19 +96,15 @@ class StateListParser protected constructor(parser: XmlPullParser?, minDepth: In } states.addState(arr, drawable) } - + private fun reflectState(name: String): Int { return try { val clazz = attr::class.java val field = clazz.getDeclaredField(name) field.getInt(null) } catch (th: Throwable) { - LOG.error("Unable to get state ID with name:", name) + log.error("Unable to get state ID with name: {}", name) -1 } } - - companion object { - private val LOG = ILogger.newInstance("StateListParser") - } } \ No newline at end of file diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt index 25d23d8ce..5ff2bd872 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/ViewImpl.kt @@ -30,7 +30,7 @@ import com.itsaky.androidide.inflater.internal.utils.tagName import com.itsaky.androidide.inflater.utils.newAttribute import com.itsaky.androidide.inflater.viewAdapter import com.itsaky.androidide.resources.R.drawable -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory open class ViewImpl @JvmOverloads @@ -41,7 +41,6 @@ constructor( override val simpleName: String = name.simpleName(), override val tag: String = name.tagName() ) : IView { - private val log = ILogger.newInstance(javaClass.simpleName) private var fg: Drawable? = null private var touched: Drawable? = null @@ -56,6 +55,11 @@ constructor( override val attributes: List get() = this._attributes + companion object { + + private val log = LoggerFactory.getLogger(ViewImpl::class.java) + } + override fun addAttribute(attribute: IAttribute, apply: Boolean, update: Boolean) { if (hasAttribute(attribute)) { if (!update) { @@ -121,7 +125,7 @@ constructor( override fun applyAttribute(attribute: IAttribute) { val adapter = viewAdapter if (adapter == null) { - log.warn("No attribute adapter found for view $name") + log.warn("No attribute adapter found for view {}", name) return } adapter.apply(this, attribute) diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt index 720c9e288..df9084fec 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/AnalogClockAdapter.kt @@ -20,7 +20,6 @@ package com.itsaky.androidide.inflater.internal.adapters import android.graphics.BlendMode -import android.os.Build import android.os.Build.VERSION_CODES import android.widget.AnalogClock import androidx.annotation.RequiresApi diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt index 9127db86c..0bc93c52e 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ImageViewAdapter.kt @@ -31,8 +31,8 @@ import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.WIDGETS import com.itsaky.androidide.inflater.AttributeHandlerScope import com.itsaky.androidide.inflater.IView -import com.itsaky.androidide.resources.R import com.itsaky.androidide.inflater.models.UiWidget +import com.itsaky.androidide.resources.R import com.itsaky.androidide.resources.R.drawable import com.itsaky.androidide.resources.R.string diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt index 450d4dcdd..c8bdd2ae4 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/MultiAutoCompleteTextViewAdapter.kt @@ -20,8 +20,8 @@ package com.itsaky.androidide.inflater.internal.adapters import android.widget.MultiAutoCompleteTextView import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.WIDGETS -import com.itsaky.androidide.resources.R import com.itsaky.androidide.inflater.models.UiWidget +import com.itsaky.androidide.resources.R /** * View adapter for [MultiAutoCompleteTextView]. diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt index 8b5e702a2..341b6f6ab 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/SpinnerAdapter.kt @@ -22,8 +22,8 @@ import com.itsaky.androidide.annotations.inflater.ViewAdapter import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.WIDGETS import com.itsaky.androidide.inflater.AttributeHandlerScope -import com.itsaky.androidide.resources.R import com.itsaky.androidide.inflater.models.UiWidget +import com.itsaky.androidide.resources.R /** * Attribute adapter for [Spinner]. diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt index afd6e2751..65ffd659d 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/ViewAdapter.kt @@ -26,7 +26,28 @@ import android.view.ViewGroup.MarginLayoutParams import android.widget.FrameLayout import android.widget.LinearLayout import android.widget.RelativeLayout -import android.widget.RelativeLayout.* +import android.widget.RelativeLayout.ABOVE +import android.widget.RelativeLayout.ALIGN_BASELINE +import android.widget.RelativeLayout.ALIGN_BOTTOM +import android.widget.RelativeLayout.ALIGN_END +import android.widget.RelativeLayout.ALIGN_LEFT +import android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM +import android.widget.RelativeLayout.ALIGN_PARENT_END +import android.widget.RelativeLayout.ALIGN_PARENT_LEFT +import android.widget.RelativeLayout.ALIGN_PARENT_RIGHT +import android.widget.RelativeLayout.ALIGN_PARENT_START +import android.widget.RelativeLayout.ALIGN_PARENT_TOP +import android.widget.RelativeLayout.ALIGN_RIGHT +import android.widget.RelativeLayout.ALIGN_START +import android.widget.RelativeLayout.ALIGN_TOP +import android.widget.RelativeLayout.BELOW +import android.widget.RelativeLayout.CENTER_HORIZONTAL +import android.widget.RelativeLayout.CENTER_IN_PARENT +import android.widget.RelativeLayout.CENTER_VERTICAL +import android.widget.RelativeLayout.END_OF +import android.widget.RelativeLayout.LEFT_OF +import android.widget.RelativeLayout.RIGHT_OF +import android.widget.RelativeLayout.START_OF import androidx.annotation.ChecksSdkIntAtLeast import androidx.core.view.updatePadding import androidx.core.view.updatePaddingRelative @@ -39,9 +60,9 @@ import com.itsaky.androidide.inflater.INamespace import com.itsaky.androidide.inflater.IView import com.itsaky.androidide.inflater.IViewAdapter import com.itsaky.androidide.inflater.internal.IncludeView -import com.itsaky.androidide.resources.R import com.itsaky.androidide.inflater.models.UiWidget import com.itsaky.androidide.inflater.utils.newAttribute +import com.itsaky.androidide.resources.R /** * Attribute adapter for [View]. diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt index eb4fd48f8..64025d7fb 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/ViewFactory.kt @@ -23,13 +23,13 @@ import android.view.ViewGroup import android.view.ViewGroup.LayoutParams import com.itsaky.androidide.inflater.InflateException import com.itsaky.androidide.inflater.internal.ViewAdapterIndexImpl -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.lang.reflect.Method /** @author Akash Yadav */ object ViewFactory { - private val log = ILogger.newInstance("ViewFactory") + private val log = LoggerFactory.getLogger(ViewFactory::class.java) fun createViewInstance(name: String, context: Context): View { val adapter = ViewAdapterIndexImpl.INSTANCE.getViewAdapter(name) @@ -46,7 +46,7 @@ object ViewFactory { val constructor = klass.getConstructor(Context::class.java) constructor.newInstance(context) as View } catch (err: Throwable) { - log.error(err) + log.error("Failed to create view instance for view: {}", name, err) throw RuntimeException(err) } } @@ -69,7 +69,7 @@ object ViewFactory { method.isAccessible = true return method.invoke(parent) as LayoutParams } - log.error("Unable to create default params for view parent:", parent) + log.error("Unable to create default params for view parent: {}", parent) LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) } catch (th: Throwable) { throw InflateException("Unable to create layout params for parent: $parent", th) diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt index 69942440e..3feeba09b 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/basicParseUtils.kt @@ -60,11 +60,11 @@ import com.android.aaptcompiler.tryParseInt import com.android.aaptcompiler.tryParseReference import com.itsaky.androidide.inflater.drawable.DrawableParserFactory import com.itsaky.androidide.inflater.utils.module -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory import java.io.File import java.text.SimpleDateFormat -private val log = ILogger.newInstance("ParseUtilsKt") +private val log = LoggerFactory.getLogger("ParseUtilsKt") // TODO : We need a more descriptive string here private const val DEFAULT_STRING_VALUE = "AndroidIDE" @@ -235,7 +235,7 @@ fun parseLayoutReference(value: String): File? { } val type = parseResourceReference(value)?.second ?: return null if (type != LAYOUT) { - log.warn("Layout file reference is expected but '$type' was found for value '$value'") + log.warn("Layout file reference is expected but '{}' was found for value '{}'", type, value) return null } return parseReference(value, type, null, layoutResolver) @@ -247,7 +247,8 @@ fun parseColorDrawable(context: Context, value: String, def: Int = Color.TRANSPA } @JvmOverloads -fun parseColor(@Suppress("UNUSED_PARAMETER") context: Context, value: String, def: Int = Color.TRANSPARENT): Int { +fun parseColor(@Suppress("UNUSED_PARAMETER") context: Context, value: String, + def: Int = Color.TRANSPARENT): Int { if (value.isEmpty()) { return def } @@ -268,7 +269,7 @@ fun parseHexColor(value: String, def: Int = Color.TRANSPARENT): Int { return try { Color.parseColor(value) } catch (err: Throwable) { - log.warn("Unable to parse color code", value) + log.warn("Unable to parse color code: {}", value) def } } @@ -318,9 +319,11 @@ fun parseDimension( return when (value) { "wrap_content" -> LayoutParams.WRAP_CONTENT.toFloat() "fill_parent", - "match_parent", -> LayoutParams.MATCH_PARENT.toFloat() + "match_parent", + -> LayoutParams.MATCH_PARENT.toFloat() + else -> { - log.warn("Cannot infer type of dimension resource: '$value'") + log.warn("Cannot infer type of dimension resource: '{}'", value) def } } @@ -371,7 +374,10 @@ fun parseReference( val (pck, type, name) = parseResourceReference(value) ?: return def if (type != expectedType) { log.warn( - "Reference of type '$expectedType' is expected but '$type' was found for value '$value'" + "Reference of type '{}' is expected but '{}' was found for value '{}'", + expectedType, + type, + value ) return def } diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt index 885fa2981..8805cd475 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/utils/lookup.kt @@ -27,9 +27,9 @@ import com.android.aaptcompiler.ResourceName import com.android.aaptcompiler.ResourceTable import com.android.aaptcompiler.ResourceTablePackage import com.itsaky.androidide.inflater.utils.module -import com.itsaky.androidide.utils.ILogger +import org.slf4j.LoggerFactory -private val log: ILogger = ILogger.newInstance("ParseLookupUtils") +private val log = LoggerFactory.getLogger("ParseLookupUtils") internal data class LookupResult( val table: ResourceTable, @@ -49,7 +49,7 @@ internal fun lookupUnqualifedResource( val (table, group, pack, entry) = findUnqualifiedResourceEntry(type, name) ?: run { - log.warn("Unable to find resource entry '$value'") + log.warn("Unable to find resource entry '{}'", value) return null } diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterDrawable.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterDrawable.java index 7a8785dce..f47db563f 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterDrawable.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterDrawable.java @@ -25,25 +25,21 @@ import android.graphics.Path; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; - import androidx.annotation.NonNull; - import com.blankj.utilcode.util.FileIOUtils; -import com.itsaky.androidide.inflater.vectormaster.models.GroupModel; import com.itsaky.androidide.inflater.vectormaster.models.ClipPathModel; +import com.itsaky.androidide.inflater.vectormaster.models.GroupModel; import com.itsaky.androidide.inflater.vectormaster.models.PathModel; import com.itsaky.androidide.inflater.vectormaster.models.VectorModel; import com.itsaky.androidide.inflater.vectormaster.utilities.Utils; - -import org.jetbrains.annotations.Contract; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; - import java.io.File; import java.io.IOException; import java.io.StringReader; import java.util.Stack; +import org.jetbrains.annotations.Contract; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; public class VectorMasterDrawable extends Drawable { diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterView.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterView.java index d345c65bd..33a5fba65 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterView.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/VectorMasterView.java @@ -26,19 +26,16 @@ import android.graphics.Matrix; import android.graphics.Path; import android.util.AttributeSet; import android.view.View; - -import com.itsaky.androidide.inflater.vectormaster.models.GroupModel; -import com.itsaky.androidide.resources.R; import com.itsaky.androidide.inflater.vectormaster.models.ClipPathModel; +import com.itsaky.androidide.inflater.vectormaster.models.GroupModel; import com.itsaky.androidide.inflater.vectormaster.models.PathModel; import com.itsaky.androidide.inflater.vectormaster.models.VectorModel; import com.itsaky.androidide.inflater.vectormaster.utilities.Utils; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - +import com.itsaky.androidide.resources.R; import java.io.IOException; import java.util.Stack; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; public class VectorMasterView extends View { diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/ClipPathModel.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/ClipPathModel.java index 100c9c45d..2657ac1d4 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/ClipPathModel.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/ClipPathModel.java @@ -23,7 +23,6 @@ import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; - import com.itsaky.androidide.inflater.vectormaster.utilities.parser.PathParser; public class ClipPathModel { diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/GroupModel.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/GroupModel.java index 546102873..6117e2026 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/GroupModel.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/GroupModel.java @@ -19,10 +19,8 @@ package com.itsaky.androidide.inflater.vectormaster.models; import android.graphics.Canvas; import android.graphics.Matrix; - import com.itsaky.androidide.inflater.vectormaster.DefaultValues; import com.itsaky.androidide.inflater.vectormaster.utilities.Utils; - import java.util.ArrayList; public class GroupModel { diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/PathModel.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/PathModel.java index b25d8927a..925f954a0 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/PathModel.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/PathModel.java @@ -23,7 +23,6 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.PathMeasure; import android.graphics.RectF; - import com.itsaky.androidide.inflater.vectormaster.DefaultValues; import com.itsaky.androidide.inflater.vectormaster.utilities.Utils; import com.itsaky.androidide.inflater.vectormaster.utilities.parser.PathParser; diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/VectorModel.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/VectorModel.java index 61d5e629a..cd364d840 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/VectorModel.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/models/VectorModel.java @@ -21,9 +21,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Path; - import com.itsaky.androidide.inflater.vectormaster.enums.TintMode; - import java.util.ArrayList; public class VectorModel { diff --git a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/legacyparser/PathParser.java b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/legacyparser/PathParser.java index bcb7a86b6..60e539662 100644 --- a/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/legacyparser/PathParser.java +++ b/xml-inflater/src/main/java/com/itsaky/androidide/inflater/vectormaster/utilities/legacyparser/PathParser.java @@ -17,17 +17,15 @@ package com.itsaky.androidide.inflater.vectormaster.utilities.legacyparser; import android.graphics.Path; - import androidx.annotation.Nullable; - -import com.itsaky.androidide.utils.ILogger; - import java.util.ArrayList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** This class is a duplicate of the PathParser.java in androidx.core.graphics package. */ public class PathParser { - private static final ILogger LOG = ILogger.newInstance("PathParser"); + private static final Logger LOG = LoggerFactory.getLogger(PathParser.class); // Copy from Arrays.copyOfRange() which is only available from API level 9. private PathParser() {} @@ -630,7 +628,7 @@ public class PathParser { } double disc = 1.0 / dsq - 1.0 / 4.0; if (disc < 0.0) { - LOG.warn("Points are too far apart " + dsq); + LOG.warn("Points are too far apart {}", dsq); float adjust = (float) (Math.sqrt(dsq) / 1.99999); drawArc(p, x0, y0, x1, y1, a * adjust, b * adjust, theta, isMoreThanHalf, isPositiveArc); return; /* Points are too far apart */ diff --git a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt index 0cd82d43b..7e03d88df 100644 --- a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt +++ b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/AdapterIndexTest.kt @@ -17,8 +17,6 @@ package com.itsaky.androidide.inflater -import android.view.* -import android.widget.* import com.google.common.truth.Truth.assertThat import org.junit.Test import org.junit.runner.RunWith diff --git a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ExampleUnitTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ExampleUnitTest.kt index bcb187e38..abadf90ac 100644 --- a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ExampleUnitTest.kt +++ b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ExampleUnitTest.kt @@ -17,10 +17,9 @@ package com.itsaky.androidide.inflater +import org.junit.Assert.assertEquals import org.junit.Test -import org.junit.Assert.* - /** * Example local unit test, which will execute on the development machine (host). * diff --git a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt index 2c8636a76..2044862a9 100644 --- a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt +++ b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/LayoutInflaterTest.kt @@ -29,14 +29,13 @@ import com.itsaky.androidide.inflater.internal.ViewGroupImpl import com.itsaky.androidide.inflater.internal.ViewImpl import com.itsaky.androidide.inflater.internal.utils.IDTable import com.itsaky.androidide.inflater.utils.newAttribute -import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.projects.api.AndroidModule import com.itsaky.androidide.projects.util.findAppModule import org.junit.Before -import java.io.File import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import java.io.File /** @author Akash Yadav */ @RunWith(RobolectricTestRunner::class) diff --git a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt index ca2e2c2b3..f041fa424 100644 --- a/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt +++ b/xml-inflater/src/test/java/com/itsaky/androidide/inflater/ValueParsersTest.kt @@ -31,10 +31,10 @@ import com.itsaky.androidide.inflater.internal.utils.parseIntegerArray import com.itsaky.androidide.inflater.internal.utils.parseString import com.itsaky.androidide.inflater.internal.utils.parseStringArray import org.junit.Before -import kotlin.math.roundToInt import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import kotlin.math.roundToInt @RunWith(RobolectricTestRunner::class) class ValueParsersTest {