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 extends IJavaCompletionProvider> 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 {