diff --git a/WORKSPACE b/WORKSPACE index dd08cab..4313853 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -9,6 +9,12 @@ maven_jar( sha1 = "b23b2b0e3f79e3f737496a9eca5bab65cdca791d", ) +maven_jar( + name = "com_google_errorprone_javac_shaded", + artifact = "com.google.errorprone:javac-shaded:9+181-r4173-1", + sha1 = "a399ee380b6d6b6ea53af1cfbcb086b108d1efb7", +) + maven_jar( name = "com_google_code_gson_gson", artifact = "com.google.code.gson:gson:2.8.2", @@ -21,6 +27,34 @@ maven_jar( sha1 = "25ea2e8b0c338a877313bd4672d3fe056ea78f0d", ) +maven_jar( + name = "com_google_auto_value_auto_value", + artifact = "com.google.auto.value:auto-value:1.6.2", +) + +maven_jar( + name = "com_google_auto_value_auto_value_annotations", + artifact = "com.google.auto.value:auto-value-annotations:1.6.2", +) + +maven_jar( + name = "com_google_googlejavaformat", + artifact = "com.google.googlejavaformat:google-java-format:1.7", + sha1 = "97cb6afc835d65682edc248e19170a8e4ecfe4c4", +) + +maven_jar( + name = "com_google_flogger", + artifact = "com.google.flogger:flogger:0.3.1", + sha1 = "585030fe1ec709760cbef997a459729fb965df0e", +) + +maven_jar( + name = "com_google_flogger_system_backend", + artifact = "com.google.flogger:flogger-system-backend:0.3.1", + sha1 = "287b569d76abcd82f9de87fe41829fbc7ebd8ac9", +) + #################### # For tests @@ -57,16 +91,6 @@ maven_jar( artifact = "org.objenesis:objenesis:2.4", ) -maven_jar( - name = "com_google_auto_value_auto_value", - artifact = "com.google.auto.value:auto-value:1.6.2", -) - -maven_jar( - name = "com_google_auto_value_auto_value_annotations", - artifact = "com.google.auto.value:auto-value-annotations:1.6.2", -) - maven_jar( name = "org_hamcrest_hamcrest_core_1_3", artifact = "org.hamcrest:hamcrest-core:1.3", diff --git a/src/main/java/org/javacomp/completion/BUILD b/src/main/java/org/javacomp/completion/BUILD index 7d92ec1..a666f80 100644 --- a/src/main/java/org/javacomp/completion/BUILD +++ b/src/main/java/org/javacomp/completion/BUILD @@ -7,7 +7,6 @@ java_library( srcs = glob(["*.java"]), deps = [ "//src/main/java/org/javacomp/file", - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/parser", "//src/main/java/org/javacomp/project:modulemanager", @@ -15,6 +14,7 @@ java_library( "//src/main/java/org/javacomp/protocol", "//src/main/java/org/javacomp/typesolver", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", "//third_party:javac", "//third_party:jsr305", diff --git a/src/main/java/org/javacomp/completion/CompleteMemberAction.java b/src/main/java/org/javacomp/completion/CompleteMemberAction.java index 0585796..3950398 100644 --- a/src/main/java/org/javacomp/completion/CompleteMemberAction.java +++ b/src/main/java/org/javacomp/completion/CompleteMemberAction.java @@ -3,11 +3,11 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.ExpressionTree; import java.util.Collection; import java.util.EnumSet; import java.util.Optional; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityWithContext; @@ -17,7 +17,7 @@ /** An action to get completion candidates for member selection. */ class CompleteMemberAction implements CompletionAction { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final ClassMemberCompletor.Options MEMBER_SELECT_OPTIONS = ClassMemberCompletor.Options.builder() @@ -95,7 +95,7 @@ public ImmutableList getCompletionCandidates( positionContext.getModule(), positionContext.getScopeAtPosition(), positionContext.getPosition()); - logger.fine("Solved parent expression: %s", solvedParent); + logger.atFine().log("Solved parent expression: %s", solvedParent); if (!solvedParent.isPresent()) { return ImmutableList.of(); } diff --git a/src/main/java/org/javacomp/completion/CompleteSymbolAction.java b/src/main/java/org/javacomp/completion/CompleteSymbolAction.java index 7be61c7..889d502 100644 --- a/src/main/java/org/javacomp/completion/CompleteSymbolAction.java +++ b/src/main/java/org/javacomp/completion/CompleteSymbolAction.java @@ -4,12 +4,12 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import com.google.common.flogger.FluentLogger; import java.util.EnumSet; import java.util.List; import java.util.Optional; import java.util.Set; import org.javacomp.completion.CompletionCandidate.SortCategory; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityScope; @@ -25,7 +25,7 @@ /** An action that returns any visible entities as completion candidates. */ class CompleteSymbolAction implements CompletionAction { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final List JAVA_LANG_QUALIFIERS = ImmutableList.of("java", "lang"); private static final Set METHOD_VARIABLE_KINDS = @@ -57,7 +57,7 @@ public ImmutableList getCompletionCandidates( for (EntityScope currentScope = positionContext.getScopeAtPosition(); currentScope != null; currentScope = currentScope.getParentScope().orElse(null)) { - logger.fine("Adding member entities in scope: %s", currentScope); + logger.atFine().log("Adding member entities in scope: %s", currentScope); if (currentScope instanceof ClassEntity) { builder.addCandidates( classMemberCompletor.getClassMembers( diff --git a/src/main/java/org/javacomp/completion/Completor.java b/src/main/java/org/javacomp/completion/Completor.java index 9afc5d4..aa95238 100644 --- a/src/main/java/org/javacomp/completion/Completor.java +++ b/src/main/java/org/javacomp/completion/Completor.java @@ -1,6 +1,7 @@ package org.javacomp.completion; import com.google.common.collect.ImmutableList; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.ImportTree; import com.sun.source.tree.LiteralTree; @@ -12,7 +13,6 @@ import java.nio.file.Paths; import java.util.Optional; import org.javacomp.file.FileManager; -import org.javacomp.logging.JLogger; import org.javacomp.project.ModuleManager; import org.javacomp.project.PositionContext; import org.javacomp.typesolver.ExpressionSolver; @@ -22,7 +22,7 @@ /** Entry point of completion logic. */ public class Completor { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final CompletionResult NO_CACHE = CompletionResult.builder() diff --git a/src/main/java/org/javacomp/completion/ContentWithLineMap.java b/src/main/java/org/javacomp/completion/ContentWithLineMap.java index f3fa0da..5ecaf96 100644 --- a/src/main/java/org/javacomp/completion/ContentWithLineMap.java +++ b/src/main/java/org/javacomp/completion/ContentWithLineMap.java @@ -1,11 +1,11 @@ package org.javacomp.completion; import com.google.auto.value.AutoValue; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.LineMap; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import java.nio.file.Path; import org.javacomp.file.FileManager; -import org.javacomp.logging.JLogger; import org.javacomp.model.FileScope; import org.javacomp.parser.LineMapUtil; @@ -17,7 +17,7 @@ */ @AutoValue abstract class ContentWithLineMap { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); abstract CharSequence getContent(); @@ -29,12 +29,12 @@ abstract class ContentWithLineMap { String extractCompletionPrefix(int line, int column) { int position = LineMapUtil.getPositionFromZeroBasedLineAndColumn(getLineMap(), line, column); if (position < 0) { - logger.warning( + logger.atWarning().log( "Position of (%s, %s): %s is negative when getting completion prefix for file %s", line, column, position, getFilePath()); } if (position >= getContent().length()) { - logger.warning( + logger.atWarning().log( "Position of (%s, %s): %s is greater than the length of the content %s when " + "getting completion prefix for file %s", line, column, position, getContent().length(), getFilePath()); @@ -50,14 +50,14 @@ String extractCompletionPrefix(int line, int column) { String substring(int line, int column, int length) { int position = LineMapUtil.getPositionFromZeroBasedLineAndColumn(getLineMap(), line, column); if (position < 0) { - logger.warning( + logger.atWarning().log( "Position of (%s, %s): %s is negative when getting substring for file %s", line, column, position, getFilePath()); return ""; } CharSequence content = getContent(); if (content.length() < position) { - logger.warning( + logger.atWarning().log( "Position of (%s, %s): %s is greater than the length of the content %s when " + "getting substring for file %s", line, column, position, content.length(), getFilePath()); @@ -70,7 +70,7 @@ String substring(int line, int column, int length) { static ContentWithLineMap create(FileScope fileScope, FileManager fileManager, Path filePath) { CharSequence content = fileManager.getFileContent(filePath).orElse(null); if (content == null) { - logger.warning("Cannot get file content of %s", filePath); + logger.atWarning().log("Cannot get file content of %s", filePath); content = ""; } diff --git a/src/main/java/org/javacomp/file/BUILD b/src/main/java/org/javacomp/file/BUILD index 03b0c4b..cc9a79b 100644 --- a/src/main/java/org/javacomp/file/BUILD +++ b/src/main/java/org/javacomp/file/BUILD @@ -16,8 +16,8 @@ java_library( name = "file", srcs = PUBLIC_INTERFACES, deps = [ - "//src/main/java/org/javacomp/logging", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", ], ) @@ -30,8 +30,8 @@ java_library( ), deps = [ ":file", - "//src/main/java/org/javacomp/logging", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", ], ) diff --git a/src/main/java/org/javacomp/file/FileManagerImpl.java b/src/main/java/org/javacomp/file/FileManagerImpl.java index eed853c..2f2e6aa 100644 --- a/src/main/java/org/javacomp/file/FileManagerImpl.java +++ b/src/main/java/org/javacomp/file/FileManagerImpl.java @@ -3,6 +3,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.collect.ImmutableList; +import com.google.common.flogger.FluentLogger; import java.io.IOException; import java.net.URI; import java.nio.file.DirectoryStream; @@ -20,11 +21,10 @@ import java.util.Optional; import java.util.Queue; import java.util.concurrent.ExecutorService; -import org.javacomp.logging.JLogger; /** Manages all files for the same project. */ public class FileManagerImpl implements FileManager { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); /** * A map from normalized file name to snapshotted files. @@ -53,7 +53,7 @@ public FileManagerImpl( matcher = fs.getPathMatcher("glob:" + pattern); ignorePathMatchersBuilder.add(matcher); } catch (Throwable t) { - logger.warning(t, "Invalid ignore path pattern %s", pattern); + logger.atWarning().withCause(t).log("Invalid ignore path pattern %s", pattern); } } ignorePathMatchers = ignorePathMatchersBuilder.build(); @@ -141,7 +141,7 @@ public void watchSubDirectories(Path rootDirectory) { directories.add(subDir); } } catch (Throwable e) { - logger.warning(e, "Cannot list files in directory %s", directory); + logger.atWarning().withCause(e).log("Cannot list files in directory %s", directory); } } } @@ -162,7 +162,7 @@ public Optional getFileContent(Path filePath) { try { return Optional.of(new String(Files.readAllBytes(normalizedPath), UTF_8)); } catch (Exception e) { - logger.severe(e, "Failed to read content from file %s", normalizedPath); + logger.atSevere().withCause(e).log("Failed to read content from file %s", normalizedPath); } return Optional.empty(); } diff --git a/src/main/java/org/javacomp/file/FileWatcher.java b/src/main/java/org/javacomp/file/FileWatcher.java index 96410d4..18947b2 100644 --- a/src/main/java/org/javacomp/file/FileWatcher.java +++ b/src/main/java/org/javacomp/file/FileWatcher.java @@ -3,6 +3,7 @@ import static com.google.common.base.Preconditions.checkState; import com.google.common.collect.ImmutableList; +import com.google.common.flogger.FluentLogger; import java.io.IOException; import java.nio.file.ClosedWatchServiceException; import java.nio.file.DirectoryStream; @@ -22,14 +23,13 @@ import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import org.javacomp.logging.JLogger; /** * A wrapper around {@link WatchService} that supports watching both file system files and * snapshotted files. */ class FileWatcher { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final WatchService watchService; private final Map watchKeyMap; @@ -70,13 +70,13 @@ private void unsafeStartWatcher() { synchronized boolean watchDirectory(Path path) { if (PathUtils.shouldIgnorePath(path, this.projectRoot, this.ignorePathMatchers)) { - logger.info("Ignore watching directory %s", path); + logger.atInfo().log("Ignore watching directory %s", path); return false; } Path normalizedPath = path.normalize(); if (watchKeyMap.containsKey(normalizedPath)) { - logger.info("Directory %s has already been watched.", path); + logger.atInfo().log("Directory %s has already been watched.", path); return false; } @@ -90,7 +90,7 @@ synchronized boolean watchDirectory(Path path) { watchKeyMap.put(path, watchKey); return true; } catch (IOException e) { - logger.warning(e, "Cannot watch directory %s.", path); + logger.atWarning().withCause(e).log("Cannot watch directory %s.", path); } return false; } @@ -98,7 +98,7 @@ synchronized boolean watchDirectory(Path path) { private synchronized void unwatchDirectory(Path path) { Path normalizedPath = path.normalize(); if (!watchKeyMap.containsKey(normalizedPath)) { - logger.info("Directory %s is not being watched.", path); + logger.atInfo().log("Directory %s is not being watched.", path); return; } @@ -141,7 +141,7 @@ synchronized void notifyFileChange(Path path, WatchEvent.Kind eventKind) { try { listener.onFileChange(path, eventKind); } catch (Throwable e) { - logger.warning(e, "File watch listener throws exception."); + logger.atWarning().withCause(e).log("File watch listener throws exception."); } } @@ -228,7 +228,7 @@ private void watchNewDirectory(Path path) { } } } catch (Throwable t) { - logger.severe(t, "Cannot list files in directory %s", path); + logger.atSevere().withCause(t).log("Cannot list files in directory %s", path); } } diff --git a/src/main/java/org/javacomp/file/PathUtils.java b/src/main/java/org/javacomp/file/PathUtils.java index 22f3b8e..7644ed2 100644 --- a/src/main/java/org/javacomp/file/PathUtils.java +++ b/src/main/java/org/javacomp/file/PathUtils.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.flogger.FluentLogger; import java.io.IOException; import java.net.URI; import java.nio.file.FileSystem; @@ -18,11 +19,10 @@ import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Stream; -import org.javacomp.logging.JLogger; /** Utilities for dealing with paths. */ public class PathUtils { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); public static final ImmutableList DEFAULT_IGNORE_MATCHERS; private static final Path PSUEDO_ROOT_PATH = Paths.get("/"); @@ -106,7 +106,7 @@ public static void walkDirectory( entryStream.forEach( entryPath -> { if (ignorePredicate.test(entryPath)) { - logger.info("Ignoring path %s", entryPath); + logger.atInfo().log("Ignoring path %s", entryPath); return; } if (Files.isDirectory(entryPath)) { @@ -131,7 +131,7 @@ public static void walkDirectory( public static Path getRootPathForJarFile(Path jarFilePath) throws IOException { // JAR specific URI pattern. // See https://docs.oracle.com/javase/8/docs/technotes/guides/io/fsp/zipfilesystemprovider.html - logger.fine("Parsing jar file: %s", jarFilePath); + logger.atFine().log("Parsing jar file: %s", jarFilePath); String jarUri = "jar:file:" + jarFilePath.toAbsolutePath().normalize().toString(); FileSystem fs = FileSystems.newFileSystem(URI.create(jarUri), ImmutableMap.of() /* env */); return fs.getPath("/"); diff --git a/src/main/java/org/javacomp/logging/BUILD b/src/main/java/org/javacomp/logging/BUILD deleted file mode 100644 index 6a31dd0..0000000 --- a/src/main/java/org/javacomp/logging/BUILD +++ /dev/null @@ -1,11 +0,0 @@ -package( - default_visibility = ["//visibility:public"], -) - -java_library( - name = "logging", - srcs = glob(["*.java"]), - deps = [ - "//third_party:jsr305", - ], -) diff --git a/src/main/java/org/javacomp/logging/JLogger.java b/src/main/java/org/javacomp/logging/JLogger.java deleted file mode 100644 index d928c10..0000000 --- a/src/main/java/org/javacomp/logging/JLogger.java +++ /dev/null @@ -1,173 +0,0 @@ -package org.javacomp.logging; - -import java.util.logging.FileHandler; -import java.util.logging.Handler; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; -import javax.annotation.Nullable; - -/** - * Wrapper around Java logger. - * - *

This wrapper provide convenient methods for creating loggers and logging with formatting - * strings. - */ -public class JLogger { - private static volatile boolean hasFileHandler = false; - private final Logger javaLogger; - - public static synchronized void setLogFile(String filePath) { - Logger rootLogger = Logger.getLogger(""); - - if (hasFileHandler) { - rootLogger.warning("Log file has already been set."); - return; - } - hasFileHandler = true; - - try { - FileHandler fileHandler = new FileHandler(filePath); - fileHandler.setFormatter(new SimpleFormatter()); - rootLogger.addHandler(fileHandler); - } catch (Exception e) { - } - } - - public static synchronized void setLogLevel(Level level) { - Logger rootLogger = Logger.getLogger(""); - rootLogger.setLevel(level); - for (Handler handler : rootLogger.getHandlers()) { - handler.setLevel(level); - } - } - - private JLogger(String enclosingClassName) { - javaLogger = Logger.getLogger(enclosingClassName); - } - - /** Creates a {@link JLogger} and sets its tag to the name of the class that calls it. */ - public static JLogger createForEnclosingClass() { - StackTraceElement[] stackTrace = new Throwable().getStackTrace(); - // The top of the stack trace is this method. The one belows it is the caller class. - String enclosingClassName = stackTrace[1].getClassName(); - return new JLogger(enclosingClassName); - } - - /** Logs a message at severe level. */ - public void severe(String msg) { - log(Level.SEVERE, msg, null /* thrown */); - } - - /** - * Logs a message at severe level with formatting parameters. - * - * @param msgfmt the message format string that can be accepted by {@link String#format} - * @param args arguments to be filled into {@code msgfmt} - */ - public void severe(String msgfmt, Object... args) { - log(Level.SEVERE, String.format(msgfmt, args), null /* thrown */); - } - - /** - * Logs a message at severe level with formatting parameters and associated Throwable information. - * - * @param thrown Throwable associated with the log message - * @param msgfmt the message format string that can be accepted by {@link String#format} - * @param args arguments to be filled into {@code msgfmt} - */ - public void severe(Throwable thrown, String msgfmt, Object... args) { - log(Level.SEVERE, String.format(msgfmt, args), thrown); - } - - /** Logs a message at warning level. */ - public void warning(String msg) { - log(Level.WARNING, msg, null /* thrown */); - } - - /** - * Logs a message at warning level with formatting parameters. - * - * @param msgfmt the message format string that can be accepted by {@link String#format} - * @param args arguments to be filled into {@code msgfmt} - */ - public void warning(String msgfmt, Object... args) { - log(Level.WARNING, String.format(msgfmt, args), null /* thrown */); - } - - /** - * Logs a message at warning level with formatting parameters and associated Throwable - * information. - * - * @param thrown Throwable associated with the log message - * @param msgfmt the message format string that can be accepted by {@link String#format} - * @param args arguments to be filled into {@code msgfmt} - */ - public void warning(Throwable thrown, String msgfmt, Object... args) { - log(Level.WARNING, String.format(msgfmt, args), thrown); - } - - /** Logs a message at info level. */ - public void info(String msg) { - log(Level.INFO, msg, null /* thrown */); - } - - /** - * Logs a message at info level with formatting parameters. - * - * @param msgfmt the message format string that can be accepted by {@link String#format} - * @param args arguments to be filled into {@code msgfmt} - */ - public void info(String msgfmt, Object... args) { - log(Level.INFO, String.format(msgfmt, args), null /* thrown */); - } - - /** Logs a message at fine level. */ - public void fine(String msg) { - log(Level.FINE, msg, null /* thrown */); - } - - /** - * Logs a message at fine level with formatting parameters. - * - * @param msgfmt the message format string that can be accepted by {@link String#format} - * @param args arguments to be filled into {@code msgfmt} - */ - public void fine(String msgfmt, Object... args) { - log(Level.FINE, String.format(msgfmt, args), null /* thrown */); - } - - private void log(Level level, String msg, @Nullable Throwable thrown) { - LogRecord logRecord = new LogRecord(level, msg); - if (thrown != null) { - logRecord.setThrown(thrown); - } - StackTraceElement callerStackTraceElement = findCallerStackTraceElement(); - if (callerStackTraceElement != null) { - logRecord.setSourceClassName(callerStackTraceElement.getClassName()); - logRecord.setSourceMethodName(callerStackTraceElement.getMethodName()); - } - javaLogger.log(logRecord); - } - - @Nullable - private static StackTraceElement findCallerStackTraceElement() { - Throwable throwable = new Throwable(); - StackTraceElement[] stackTrace = throwable.getStackTrace(); - - boolean loggerStackTraceFound = true; - for (StackTraceElement stackTraceElement : stackTrace) { - String className = stackTraceElement.getClassName(); - if (JLogger.class.getCanonicalName().equals(className)) { - loggerStackTraceFound = true; - } else { - if (loggerStackTraceFound) { - // We've skipped all JLogger. This is the caller. - return stackTraceElement; - } - } - } - return null; - } -} diff --git a/src/main/java/org/javacomp/model/BUILD b/src/main/java/org/javacomp/model/BUILD index 9c77502..6797bf5 100644 --- a/src/main/java/org/javacomp/model/BUILD +++ b/src/main/java/org/javacomp/model/BUILD @@ -6,9 +6,9 @@ java_library( name = "model", srcs = glob(["*.java"]), deps = [ - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model/util", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", "//third_party:javac", "//third_party:jsr305", diff --git a/src/main/java/org/javacomp/model/Module.java b/src/main/java/org/javacomp/model/Module.java index 425056d..f7c62c5 100644 --- a/src/main/java/org/javacomp/model/Module.java +++ b/src/main/java/org/javacomp/model/Module.java @@ -1,6 +1,7 @@ package org.javacomp.model; import com.google.common.collect.ImmutableList; +import com.google.common.flogger.FluentLogger; import java.nio.file.Path; import java.util.ArrayDeque; import java.util.ArrayList; @@ -9,7 +10,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import org.javacomp.logging.JLogger; /** * A scope containing a set of classes and the packages defined under the root (unnamed) package. @@ -17,7 +17,7 @@ *

A Module may be created from a set of Java files, index cache files, or JAR archives. */ public class Module { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); // Map of filename -> FileScope. private final Map fileScopeMap; @@ -31,7 +31,8 @@ public Module() { } public synchronized void addOrReplaceFileScope(FileScope fileScope) { - logger.fine("Adding file: %s: %s", fileScope.getFilename(), fileScope.getMemberEntities()); + logger.atFine().log( + "Adding file: %s: %s", fileScope.getFilename(), fileScope.getMemberEntities()); FileScope existingFileScope = fileScopeMap.get(fileScope.getFilename()); // Add the new file scope to the package first, so that we don't GC the pacakge if // the new file and old file are in the same pacakge and is the only file in the package. diff --git a/src/main/java/org/javacomp/parser/AstScanner.java b/src/main/java/org/javacomp/parser/AstScanner.java index d2db3cc..03e5618 100644 --- a/src/main/java/org/javacomp/parser/AstScanner.java +++ b/src/main/java/org/javacomp/parser/AstScanner.java @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Range; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.BlockTree; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; @@ -38,7 +39,6 @@ import java.util.Optional; import java.util.Set; import javax.lang.model.element.Modifier; -import org.javacomp.logging.JLogger; import org.javacomp.model.BlockScope; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; @@ -55,7 +55,7 @@ public class AstScanner extends TreePathScanner { private static final List UNAVAILABLE_QUALIFIERS = ImmutableList.of(); private static final String ON_DEMAND_IMPORT_WILDCARD = "*"; - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final TypeReferenceScanner typeReferenceScanner; private final ParameterScanner parameterScanner; @@ -158,7 +158,7 @@ public Void visitClass(ClassTree node, EntityScope currentScope) { entityKind = Entity.Kind.ANNOTATION; break; default: - logger.severe("Unknown entity kind for class: %s", node.getKind()); + logger.atSevere().log("Unknown entity kind for class: %s", node.getKind()); return null; } ImmutableList.Builder interfaceBuilder = new ImmutableList.Builder<>(); diff --git a/src/main/java/org/javacomp/parser/BUILD b/src/main/java/org/javacomp/parser/BUILD index 3600231..5da4bf6 100644 --- a/src/main/java/org/javacomp/parser/BUILD +++ b/src/main/java/org/javacomp/parser/BUILD @@ -4,11 +4,11 @@ java_library( visibility = ["//visibility:public"], deps = [ "//src/main/java/org/javacomp/file", - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/model/util", "//src/main/java/org/javacomp/options", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", "//third_party:javac", "//third_party:jsr305", diff --git a/src/main/java/org/javacomp/parser/Parser.java b/src/main/java/org/javacomp/parser/Parser.java index a339531..8be2eb3 100644 --- a/src/main/java/org/javacomp/parser/Parser.java +++ b/src/main/java/org/javacomp/parser/Parser.java @@ -1,17 +1,17 @@ package org.javacomp.parser; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.LineMap; import java.nio.file.Path; import java.util.Optional; import org.javacomp.file.FileManager; -import org.javacomp.logging.JLogger; import org.javacomp.model.FileScope; import org.javacomp.options.IndexOptions; import org.javacomp.parser.FileContentFixer.FixedContent; /** Parser that converts source file to {@link FileScope}. */ public class Parser { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final ParserContext parserContext = new ParserContext(); private final FileContentFixer fileContentFixer = new FileContentFixer(parserContext); @@ -27,7 +27,7 @@ public Optional parseSourceFile(Path path, boolean fixContentForParsi parserContext.setupLoggingSource(path.toString()); Optional optionalContent = fileManager.getFileContent(path); if (!optionalContent.isPresent()) { - logger.info("Didn't parse %s because it's not found.", path); + logger.atInfo().log("Didn't parse %s because it's not found.", path); return Optional.empty(); } CharSequence content = optionalContent.get(); diff --git a/src/main/java/org/javacomp/parser/TypeArgumentScanner.java b/src/main/java/org/javacomp/parser/TypeArgumentScanner.java index 1d85417..2fdd6e9 100644 --- a/src/main/java/org/javacomp/parser/TypeArgumentScanner.java +++ b/src/main/java/org/javacomp/parser/TypeArgumentScanner.java @@ -1,16 +1,16 @@ package org.javacomp.parser; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.Tree; import com.sun.source.tree.WildcardTree; import com.sun.source.util.TreeScanner; import java.util.Optional; -import org.javacomp.logging.JLogger; import org.javacomp.model.TypeArgument; import org.javacomp.model.WildcardTypeArgument; /** Converts a Java source tree to a {@link TypeArgument}. */ public class TypeArgumentScanner extends TreeScanner { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); public TypeArgument getTypeArgument(Tree node) { return scan(node, null); @@ -45,7 +45,7 @@ private WildcardTypeArgument createWildcardTypeArgument(WildcardTree node) { bound = Optional.empty(); break; default: - logger.warning("Unknown wildcard type varialbe kind: %s", node.getKind()); + logger.atWarning().log("Unknown wildcard type varialbe kind: %s", node.getKind()); bound = Optional.empty(); } return WildcardTypeArgument.create(bound); diff --git a/src/main/java/org/javacomp/parser/TypeReferenceScanner.java b/src/main/java/org/javacomp/parser/TypeReferenceScanner.java index 3d99b70..1380e4a 100644 --- a/src/main/java/org/javacomp/parser/TypeReferenceScanner.java +++ b/src/main/java/org/javacomp/parser/TypeReferenceScanner.java @@ -1,5 +1,7 @@ package org.javacomp.parser; +import com.google.common.flogger.FluentLogger; +import com.google.common.flogger.StackSize; import com.sun.source.tree.ArrayTypeTree; import com.sun.source.tree.IdentifierTree; import com.sun.source.tree.MemberSelectTree; @@ -11,12 +13,11 @@ import java.util.ArrayList; import java.util.Deque; import java.util.List; -import org.javacomp.logging.JLogger; import org.javacomp.model.TypeArgument; import org.javacomp.model.TypeReference; public class TypeReferenceScanner extends TreeScanner { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final Deque names; private final List typeArguments; @@ -44,7 +45,7 @@ public TypeReference getTypeReference(Tree node) { scan(node, null); if (names.isEmpty()) { // Malformed input, no type can be referenced - logger.warning(new Throwable(), "Empty type name with %s", node); + logger.atWarning().withStackTrace(StackSize.LARGE).log("Empty type name with %s", node); return TypeReference.EMPTY_TYPE; } return TypeReference.builder() diff --git a/src/main/java/org/javacomp/parser/classfile/BUILD b/src/main/java/org/javacomp/parser/classfile/BUILD index e64d32b..0363dd0 100644 --- a/src/main/java/org/javacomp/parser/classfile/BUILD +++ b/src/main/java/org/javacomp/parser/classfile/BUILD @@ -3,11 +3,11 @@ java_library( srcs = glob(["*.java"]), visibility = ["//visibility:public"], deps = [ - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/model/util", "//src/main/java/org/javacomp/options", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", "//third_party:javac", "//third_party:jsr305", diff --git a/src/main/java/org/javacomp/parser/classfile/ClassModuleBuilder.java b/src/main/java/org/javacomp/parser/classfile/ClassModuleBuilder.java index 936d8ad..c60518c 100644 --- a/src/main/java/org/javacomp/parser/classfile/ClassModuleBuilder.java +++ b/src/main/java/org/javacomp/parser/classfile/ClassModuleBuilder.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import com.google.common.collect.Range; +import com.google.common.flogger.FluentLogger; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; @@ -12,7 +13,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityScope; @@ -27,7 +27,7 @@ /** Builder of {@link Module} with classes parsed from .class files. */ public class ClassModuleBuilder { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final Range EMPTY_RANGE = Range.closedOpen(0, 0); diff --git a/src/main/java/org/javacomp/project/BUILD b/src/main/java/org/javacomp/project/BUILD index 161d91c..aa75bbb 100644 --- a/src/main/java/org/javacomp/project/BUILD +++ b/src/main/java/org/javacomp/project/BUILD @@ -16,12 +16,12 @@ java_library( ":modulemanagerimpl", "//src/main/java/org/javacomp/completion", "//src/main/java/org/javacomp/file", - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/options", "//src/main/java/org/javacomp/protocol", "//src/main/java/org/javacomp/reference", "//src/main/java/org/javacomp/storage", + "//third_party:flogger", "//third_party:guava", ], ) @@ -47,12 +47,12 @@ java_library( deps = [ ":modulemanager", "//src/main/java/org/javacomp/file", - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/options", "//src/main/java/org/javacomp/parser", "//src/main/java/org/javacomp/parser/classfile", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", "//third_party:javac", ], @@ -65,10 +65,10 @@ java_library( ], deps = [ ":modulemanager", - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/parser", "//third_party:auto_value", + "//third_party:flogger", "//third_party:javac", ], ) diff --git a/src/main/java/org/javacomp/project/FileSystemModuleManager.java b/src/main/java/org/javacomp/project/FileSystemModuleManager.java index 89b91f4..de0c41f 100644 --- a/src/main/java/org/javacomp/project/FileSystemModuleManager.java +++ b/src/main/java/org/javacomp/project/FileSystemModuleManager.java @@ -1,6 +1,7 @@ package org.javacomp.project; import com.google.common.collect.ImmutableMap; +import com.google.common.flogger.FluentLogger; import java.nio.file.Path; import java.util.Deque; import java.util.HashSet; @@ -10,7 +11,6 @@ import java.util.function.Consumer; import org.javacomp.file.FileManager; import org.javacomp.file.PathUtils; -import org.javacomp.logging.JLogger; import org.javacomp.model.FileScope; import org.javacomp.model.Module; import org.javacomp.options.IndexOptions; @@ -18,7 +18,7 @@ import org.javacomp.parser.classfile.ClassModuleBuilder; public class FileSystemModuleManager implements ModuleManager { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final String JAVA_EXTENSION = ".java"; private static final String JAR_EXTENSION = ".jar"; private static final String SRCJAR_EXTENSION = ".srcjar"; @@ -83,7 +83,7 @@ private void addOrUpdateFile(Module module, Path path, boolean fixContentForPars module.addOrReplaceFileScope(fileScope.get()); } } catch (Throwable e) { - logger.warning(e, "Failed to process file %s", path); + logger.atWarning().withCause(e).log("Failed to process file %s", path); } } @@ -111,7 +111,7 @@ private void walkDirectory(Path rootDir) { } private void addJarModule(Path path) { - logger.fine("Adding JAR module for %s", path); + logger.atFine().log("Adding JAR module for %s", path); try { Module jarModule = new Module(); ClassModuleBuilder classModuleBuilder = new ClassModuleBuilder(jarModule); @@ -125,13 +125,14 @@ private void addJarModule(Path path) { try { classModuleBuilder.processClassFile(filePath); } catch (Throwable t) { - logger.warning(t, "Failed to process .class file: %s", filePath); + logger.atWarning().withCause(t).log( + "Failed to process .class file: %s", filePath); } }); PathUtils.walkDirectory(rootJarPath, handlers, /* ignorePathPredicate= */ filePath -> false); projectModule.addDependingModule(jarModule); } catch (Throwable t) { - logger.warning(t, "Failed to create module for JAR file %s", path); + logger.atWarning().withCause(t).log("Failed to create module for JAR file %s", path); } } } diff --git a/src/main/java/org/javacomp/project/PositionContext.java b/src/main/java/org/javacomp/project/PositionContext.java index d736228..57e59fe 100644 --- a/src/main/java/org/javacomp/project/PositionContext.java +++ b/src/main/java/org/javacomp/project/PositionContext.java @@ -1,6 +1,7 @@ package org.javacomp.project; import com.google.auto.value.AutoValue; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.ErroneousTree; import com.sun.source.tree.LineMap; import com.sun.source.tree.Tree; @@ -11,7 +12,6 @@ import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import java.nio.file.Path; import java.util.Optional; -import org.javacomp.logging.JLogger; import org.javacomp.model.EntityScope; import org.javacomp.model.FileScope; import org.javacomp.model.Module; @@ -21,7 +21,7 @@ /** All information inferred from a given cursor position of a file. */ @AutoValue public abstract class PositionContext { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); public abstract EntityScope getScopeAtPosition(); @@ -88,9 +88,9 @@ public static PositionContext createForFixedPosition( JCCompilationUnit compilationUnit = inputFileScope.getCompilationUnit().get(); EntityScope scopeAtPosition = inputFileScope.getEntityScopeAt(position - 1); PositionAstScanner scanner = new PositionAstScanner(compilationUnit.endPositions, position); - logger.fine("Starting PositionAstScanner, position: %s", position); + logger.atFine().log("Starting PositionAstScanner, position: %s", position); TreePath treePath = scanner.scan(compilationUnit, null); - logger.fine("TreePath for position: %s", TreePathFormatter.formatTreePath(treePath)); + logger.atFine().log("TreePath for position: %s", TreePathFormatter.formatTreePath(treePath)); return new AutoValue_PositionContext( scopeAtPosition, module, inputFileScope, treePath, position, compilationUnit.endPositions); @@ -118,7 +118,7 @@ public TreePath scan(Tree tree, Void unused) { boolean positionInNodeRange = (startPosition < 0 || startPosition <= position) && (position < endPosition || endPosition < 0); - logger.fine( + logger.atFine().log( "PositionAstScanner: visiting node: %s, start: %s, end: %s.%s", tree.accept(new TreePathFormatter.TreeFormattingVisitor(), null), jcTree.getStartPosition(), diff --git a/src/main/java/org/javacomp/project/Project.java b/src/main/java/org/javacomp/project/Project.java index 5c13ffa..3ef9b40 100644 --- a/src/main/java/org/javacomp/project/Project.java +++ b/src/main/java/org/javacomp/project/Project.java @@ -4,6 +4,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Range; +import com.google.common.flogger.FluentLogger; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URI; @@ -20,7 +21,6 @@ import org.javacomp.completion.TextEdits; import org.javacomp.file.FileChangeListener; import org.javacomp.file.FileManager; -import org.javacomp.logging.JLogger; import org.javacomp.model.Entity; import org.javacomp.model.FileScope; import org.javacomp.model.Module; @@ -34,7 +34,7 @@ /** Handles all files in a project. */ public class Project { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final String JDK_RESOURCE_PATH = "/resources/jdk/index.json"; private static final String JAVA_EXTENSION = ".java"; @@ -62,7 +62,7 @@ public Project(ModuleManager moduleManager, FileManager fileManager) { public synchronized void initialize() { if (initialized) { - logger.warning("Project has already been initalized."); + logger.atWarning().log("Project has already been initalized."); return; } initialized = true; @@ -72,30 +72,31 @@ public synchronized void initialize() { } public synchronized void loadJdkModule() { - logger.info("Loading JDK module"); + logger.atInfo().log("Loading JDK module"); try (BufferedReader reader = new BufferedReader( new InputStreamReader(this.getClass().getResourceAsStream(JDK_RESOURCE_PATH), UTF_8))) { moduleManager.addDependingModule(new IndexStore().readModule(reader)); - logger.info("JDK module loaded"); + logger.atInfo().log("JDK module loaded"); } catch (Throwable t) { - logger.warning(t, "Unable to load JDK module"); + logger.atWarning().withCause(t).log("Unable to load JDK module"); } } public synchronized void loadTypeIndexFile(String typeIndexFile) { - logger.info("Loading type index file %s", typeIndexFile); + logger.atInfo().log("Loading type index file %s", typeIndexFile); IndexStore indexStore = new IndexStore(); try { Module module = indexStore.readModuleFromFile( fileManager.getProjectRootPath().resolve(Paths.get(typeIndexFile))); moduleManager.addDependingModule(module); - logger.info("Loaded type index file %s", typeIndexFile); + logger.atInfo().log("Loaded type index file %s", typeIndexFile); } catch (NoSuchFileException nsfe) { - logger.warning("Unable to load type index file %s: file doesn't exist", typeIndexFile); + logger.atWarning().log( + "Unable to load type index file %s: file doesn't exist", typeIndexFile); } catch (Throwable t) { - logger.warning(t, "Unable to load type index file %s", typeIndexFile); + logger.atWarning().withCause(t).log("Unable to load type index file %s", typeIndexFile); } } @@ -153,7 +154,7 @@ private static boolean isJavaFile(Path filePath) { private class ProjectFileChangeListener implements FileChangeListener { @Override public void onFileChange(Path filePath, WatchEvent.Kind changeKind) { - logger.fine("onFileChange(%s): %s", changeKind, filePath); + logger.atFine().log("onFileChange(%s): %s", changeKind, filePath); if (changeKind == StandardWatchEventKinds.ENTRY_CREATE || changeKind == StandardWatchEventKinds.ENTRY_MODIFY) { if (isJavaFile(filePath)) { diff --git a/src/main/java/org/javacomp/protocol/textdocument/DocumentFormattingParams.java b/src/main/java/org/javacomp/protocol/textdocument/DocumentFormattingParams.java new file mode 100644 index 0000000..db6938e --- /dev/null +++ b/src/main/java/org/javacomp/protocol/textdocument/DocumentFormattingParams.java @@ -0,0 +1,26 @@ +package org.javacomp.protocol.textdocument; + +import org.javacomp.protocol.RequestParams; +import org.javacomp.protocol.TextDocumentIdentifier; + +/** + * Parameters for "textDocument/format" request. + * + *

See https://microsoft.github.io/language-server-protocol/specification#textDocument_formatting + */ +public class DocumentFormattingParams implements RequestParams { + /** The document to format. */ + public TextDocumentIdentifier textDocument; + + /** The format options. */ + public FormattingOptions options; + + /** Value-object describing what options formatting should use. */ + public class FormattingOptions { + /** Size of a tab in spaces. */ + public int tabSize; + + /** Prefer spaces over tabs. */ + public boolean insertSpaces; + } +} diff --git a/src/main/java/org/javacomp/reference/BUILD b/src/main/java/org/javacomp/reference/BUILD index 1d92b85..1323d3b 100644 --- a/src/main/java/org/javacomp/reference/BUILD +++ b/src/main/java/org/javacomp/reference/BUILD @@ -7,13 +7,13 @@ java_library( srcs = glob(["*.java"]), deps = [ "//src/main/java/org/javacomp/file", - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/parser", "//src/main/java/org/javacomp/project:modulemanager", "//src/main/java/org/javacomp/project:positioncontext", "//src/main/java/org/javacomp/typesolver", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", "//third_party:javac", ], diff --git a/src/main/java/org/javacomp/reference/DefinitionSolver.java b/src/main/java/org/javacomp/reference/DefinitionSolver.java index 3380694..3551798 100644 --- a/src/main/java/org/javacomp/reference/DefinitionSolver.java +++ b/src/main/java/org/javacomp/reference/DefinitionSolver.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.IdentifierTree; import com.sun.source.tree.LiteralTree; @@ -17,7 +18,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityScope; @@ -34,7 +34,7 @@ /** Finds the definition of a symbol at a given position */ public class DefinitionSolver { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final Set ALLOWED_ENTITY_KINDS = new ImmutableSet.Builder() .addAll(VariableEntity.ALLOWED_KINDS) diff --git a/src/main/java/org/javacomp/reference/ReferenceSolver.java b/src/main/java/org/javacomp/reference/ReferenceSolver.java index 2b2df78..f1eded1 100644 --- a/src/main/java/org/javacomp/reference/ReferenceSolver.java +++ b/src/main/java/org/javacomp/reference/ReferenceSolver.java @@ -6,13 +6,13 @@ import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.Range; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.LineMap; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Optional; import org.javacomp.file.FileManager; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityScope; @@ -25,7 +25,7 @@ /** Finds references of a symbol. */ public class ReferenceSolver { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final int MAX_SCOPES_TO_SEARCH = 500; @@ -134,7 +134,7 @@ private void findReferencesInScope( String actualFileContent = fileContent.get().toString(); int start = entityScope.getDefinitionRange().lowerEndpoint(); int end = entityScope.getDefinitionRange().upperEndpoint(); - logger.fine( + logger.atFine().log( "Finding entity %s in scope %s [%s, %s] of file %s", entityName, entityScope, start, end, fileScope.getFilename()); while (start < end) { diff --git a/src/main/java/org/javacomp/reference/SignatureSolver.java b/src/main/java/org/javacomp/reference/SignatureSolver.java index d01cb71..3ca7749 100644 --- a/src/main/java/org/javacomp/reference/SignatureSolver.java +++ b/src/main/java/org/javacomp/reference/SignatureSolver.java @@ -1,6 +1,7 @@ package org.javacomp.reference; import com.google.common.collect.ImmutableList; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.ClassTree; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.MethodInvocationTree; @@ -13,7 +14,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; -import org.javacomp.logging.JLogger; import org.javacomp.model.Entity; import org.javacomp.model.MethodEntity; import org.javacomp.project.ModuleManager; @@ -25,7 +25,7 @@ /** Finds the method signature of a symbol at a given position */ public class SignatureSolver { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final Set METHOD_KIND_SET = EnumSet.of(Entity.Kind.METHOD); @@ -52,7 +52,8 @@ public MethodSignatures getMethodSignatures( Optional positionContext = PositionContext.createForPosition(moduleManager, filePath, line, column); - logger.severe("[DEBUG] getMethodSignature: %s %s %s", moduleManager, filePath, positionContext); + logger.atSevere().log( + "[DEBUG] getMethodSignature: %s %s %s", moduleManager, filePath, positionContext); if (!positionContext.isPresent()) { return emptySignature(); } @@ -88,7 +89,8 @@ private boolean inMethodParameter(PositionContext positionContext, Tree node) { private MethodSignatures getMethodSignatures( PositionContext positionContext, MethodInvocationTree method, Tree childNode) { - logger.severe("[DEBUG] getMethodSignature: %s %s %s", positionContext, method, childNode); + logger.atSevere().log( + "[DEBUG] getMethodSignature: %s %s %s", positionContext, method, childNode); List methods = expressionSolver .solveDefinitions( diff --git a/src/main/java/org/javacomp/server/BUILD b/src/main/java/org/javacomp/server/BUILD index bff8721..155cba5 100644 --- a/src/main/java/org/javacomp/server/BUILD +++ b/src/main/java/org/javacomp/server/BUILD @@ -44,13 +44,13 @@ java_library( ":server", "//src/main/java/org/javacomp/file", "//src/main/java/org/javacomp/file:impl", - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/options", "//src/main/java/org/javacomp/project", "//src/main/java/org/javacomp/protocol", "//src/main/java/org/javacomp/server/handler", "//src/main/java/org/javacomp/server/io", "//third_party:auto_value", + "//third_party:flogger", "//third_party:gson", "//third_party:guava", "//third_party:jsr305", diff --git a/src/main/java/org/javacomp/server/JavaComp.java b/src/main/java/org/javacomp/server/JavaComp.java index f81e469..d6064e9 100644 --- a/src/main/java/org/javacomp/server/JavaComp.java +++ b/src/main/java/org/javacomp/server/JavaComp.java @@ -4,6 +4,8 @@ import static com.google.common.base.Preconditions.checkState; import com.google.common.collect.ImmutableList; +import com.google.common.flogger.FluentLogger; +import com.google.common.flogger.StackSize; import com.google.gson.Gson; import java.io.IOException; import java.io.InputStream; @@ -17,10 +19,14 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.FileHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; import javax.annotation.Nullable; import org.javacomp.file.FileManager; import org.javacomp.file.FileManagerImpl; -import org.javacomp.logging.JLogger; import org.javacomp.options.IndexOptions; import org.javacomp.options.JavaCompOptions; import org.javacomp.project.Project; @@ -37,6 +43,7 @@ import org.javacomp.server.handler.textdocument.DidCloseHandler; import org.javacomp.server.handler.textdocument.DidOpenHandler; import org.javacomp.server.handler.textdocument.DocumentSymbolHandler; +import org.javacomp.server.handler.textdocument.FormattingHandler; import org.javacomp.server.handler.textdocument.HoverHandler; import org.javacomp.server.handler.textdocument.ReferencesHandler; import org.javacomp.server.handler.textdocument.ResolveCompletionItemHandler; @@ -45,7 +52,7 @@ /** Entry point of the JavaComp server. */ public class JavaComp implements Server { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final int REQUEST_BUFFER_SIZE = 4096; private static final int NUM_THREADS = 10; @@ -85,6 +92,7 @@ public JavaComp(InputStream inputStream, OutputStream outputStream) { .registerHandler(new DidCloseHandler(this)) .registerHandler(new CompletionHandler(this, gson)) .registerHandler(new DefinitionHandler(this)) + .registerHandler(new FormattingHandler(this)) .registerHandler(new SignatureHelpTextDocumentHandler(this)) .registerHandler(new HoverHandler(this)) .registerHandler(new ResolveCompletionItemHandler(this, gson)) @@ -123,15 +131,16 @@ public synchronized void initialize( mergeOptions(options, initializeOptions); } - logger.info("Initializing project: %s", projectRootUri); - logger.info( + logger.atInfo().log("Initializing project: %s", projectRootUri); + logger.atInfo().log( "Options:\n logPath: %s\n logLevel: %s\n" + " ignorePaths: %s\n typeIndexFiles: %s", options.logPath, options.logLevel, options.ignorePaths, options.typeIndexFiles); if (options.logPath != null) { - JLogger.setLogFile(options.logPath); + Logger.getLogger(""); + setLogFile(options.logPath); } if (options.logLevel != null) { - JLogger.setLogLevel(options.getLogLevel()); + setLogLevel(options.getLogLevel()); } if (options.ignorePaths != null) { ignorePaths = options.getIgnorePaths(); @@ -185,7 +194,8 @@ public synchronized void exit() { isRunning.set(false); if (initialized) { - logger.warning(new Throwable(), "exit() is called without shutting down the server."); + logger.atWarning().withStackTrace(StackSize.LARGE).log( + "exit() is called without shutting down the server."); exitCode = 1; } @@ -193,7 +203,7 @@ public synchronized void exit() { try { requestParser.close(); } catch (Exception e) { - logger.warning(e, "Failed to close input stream on exit."); + logger.atWarning().withCause(e).log("Failed to close input stream on exit."); } } @@ -246,4 +256,22 @@ public static final void main(String[] args) { int exitCode = new JavaComp(System.in, System.out).run(); System.exit(exitCode); } + + private static synchronized void setLogFile(String filePath) { + Logger rootLogger = Logger.getLogger(""); + try { + FileHandler fileHandler = new FileHandler(filePath); + fileHandler.setFormatter(new SimpleFormatter()); + rootLogger.addHandler(fileHandler); + } catch (Exception e) { + } + } + + private static synchronized void setLogLevel(Level level) { + Logger rootLogger = Logger.getLogger(""); + rootLogger.setLevel(level); + for (Handler handler : rootLogger.getHandlers()) { + handler.setLevel(level); + } + } } diff --git a/src/main/java/org/javacomp/server/RequestDispatcher.java b/src/main/java/org/javacomp/server/RequestDispatcher.java index 177b163..09bb569 100644 --- a/src/main/java/org/javacomp/server/RequestDispatcher.java +++ b/src/main/java/org/javacomp/server/RequestDispatcher.java @@ -4,6 +4,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; +import com.google.common.flogger.FluentLogger; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonPrimitive; @@ -12,7 +13,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import javax.annotation.Nullable; -import org.javacomp.logging.JLogger; import org.javacomp.protocol.NullParams; import org.javacomp.protocol.RequestParams; import org.javacomp.server.handler.RequestHandler; @@ -24,7 +24,7 @@ * name. */ public class RequestDispatcher { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final int MAX_REQUESTS_IN_QUEUE = 50; @@ -54,17 +54,19 @@ private RequestDispatcher(Builder builder, ImmutableMap */ public boolean dispatchRequest() { if (dispatchFuture.isCancelled() || dispatchFuture.isDone()) { - logger.severe("The dispatch thread exits. Stop parsing and dispatching new requests."); + logger.atSevere().log( + "The dispatch thread exits. Stop parsing and dispatching new requests."); } RawRequest rawRequest; try { rawRequest = requestParser.parse(); } catch (RequestException e) { - logger.severe(e, "Malformed request received and unable to recover. Shutting down."); + logger.atSevere().withCause(e).log( + "Malformed request received and unable to recover. Shutting down."); return false; } catch (StreamClosedException e) { - logger.severe(e, "Input stream closed, shutting down server."); + logger.atSevere().withCause(e).log("Input stream closed, shutting down server."); return false; } @@ -74,7 +76,7 @@ public boolean dispatchRequest() { continue; } - logger.warning( + logger.atWarning().log( "Request queue is full. Dropping early request (%s) %s", firstInQueue.getContent().getId(), firstInQueue.getContent().getMethod()); return true; @@ -115,17 +117,17 @@ public void run() { if (requestIdElem.isJsonPrimitive()) { requestId = requestIdElem.getAsJsonPrimitive(); } else { - logger.warning("Invalid type of request ID: %s", requestIdElem); + logger.atWarning().log("Invalid type of request ID: %s", requestIdElem); } } try { result = dispatchRequestInternal(rawRequest, requestId); } catch (RequestException e) { - logger.severe(e, "Failed to process request."); + logger.atSevere().withCause(e).log("Failed to process request."); error = new Response.ResponseError(e.getErrorCode(), e.getMessage()); } catch (Throwable e) { - logger.severe(e, "Failed to process request."); + logger.atSevere().withCause(e).log("Failed to process request."); error = new Response.ResponseError(ErrorCode.INTERNAL_ERROR, e.getMessage()); } @@ -135,7 +137,7 @@ public void run() { continue; } if (!requestId.isNumber() && !requestId.isString()) { - logger.warning("Invalid type of request ID: %s", requestId); + logger.atWarning().log("Invalid type of request ID: %s", requestId); continue; } @@ -148,11 +150,11 @@ public void run() { try { responseWriter.writeResponse(response); } catch (Throwable e) { - logger.severe(e, "Failed to write response, shutting down server."); + logger.atSevere().withCause(e).log("Failed to write response, shutting down server."); return; } } catch (InterruptedException e) { - logger.info("Request dispatching thread is interrupted, shutting down."); + logger.atInfo().log("Request dispatching thread is interrupted, shutting down."); return; } } @@ -180,7 +182,7 @@ private Object dispatchRequestInternal(RawRequest rawRequest, @Nullable JsonPrim RequestHandler handler = handlerRegistry.get(requestContent.getMethod()); Request typedRequest = convertRawToRequest(rawRequest, requestId, handler); - logger.info("Handling request %s", requestContent.getMethod()); + logger.atInfo().log("Handling request %s", requestContent.getMethod()); @SuppressWarnings("unchecked") Object result = handler.handleRequest(typedRequest); return result; diff --git a/src/main/java/org/javacomp/server/RequestParser.java b/src/main/java/org/javacomp/server/RequestParser.java index 1f5f5c5..3800b68 100644 --- a/src/main/java/org/javacomp/server/RequestParser.java +++ b/src/main/java/org/javacomp/server/RequestParser.java @@ -1,11 +1,11 @@ package org.javacomp.server; import com.google.common.collect.ImmutableMap; +import com.google.common.flogger.FluentLogger; import com.google.gson.Gson; import java.io.Closeable; import java.io.IOException; import java.util.Map; -import org.javacomp.logging.JLogger; import org.javacomp.server.io.RequestReader; import org.javacomp.server.io.StreamClosedException; @@ -18,7 +18,7 @@ * https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#base-protocol */ public class RequestParser implements Closeable { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); /** Normalized Content-Length header name in the request header. */ public static final String HEADER_CONTENT_LENGTH = "content-length"; @@ -67,7 +67,7 @@ private Map parseHeader(RequestReader reader) String[] parts = headerLine.split(HEADER_KEY_VALUE_SEPARATOR, 2); if (parts.length != 2) { - logger.warning("Malformed header %s", headerLine); + logger.atWarning().log("Malformed header %s", headerLine); } else { headerBuilder.put(parts[0].toLowerCase(), parts[1]); } @@ -77,7 +77,7 @@ private Map parseHeader(RequestReader reader) private int getContentLength(Map header) throws RequestException { if (!header.containsKey(HEADER_CONTENT_LENGTH)) { - logger.warning("Missing Content-Length in header %s. Ignore the content.", header); + logger.atWarning().log("Missing Content-Length in header %s. Ignore the content.", header); return 0; } @@ -85,13 +85,14 @@ private int getContentLength(Map header) throws RequestException try { contentLength = Integer.parseInt(header.get(HEADER_CONTENT_LENGTH)); } catch (NumberFormatException e) { - logger.warning( + logger.atWarning().log( "Invalid content length: %s. Ignore the content.", header.get(HEADER_CONTENT_LENGTH)); return 0; } if (contentLength <= 0) { - logger.warning("Got non-positive content length: %s. Ignore the content.", contentLength); + logger.atWarning().log( + "Got non-positive content length: %s. Ignore the content.", contentLength); return 0; } diff --git a/src/main/java/org/javacomp/server/handler/BUILD b/src/main/java/org/javacomp/server/handler/BUILD index ebdcf8a..86a29df 100644 --- a/src/main/java/org/javacomp/server/handler/BUILD +++ b/src/main/java/org/javacomp/server/handler/BUILD @@ -8,7 +8,6 @@ java_library( deps = [ "//src/main/java/org/javacomp/completion", "//src/main/java/org/javacomp/file", - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/parser", "//src/main/java/org/javacomp/project", @@ -18,6 +17,8 @@ java_library( "//src/main/java/org/javacomp/server", "//src/main/java/org/javacomp/server:request", "//src/main/java/org/javacomp/server:requestexception", + "//third_party:flogger", + "//third_party:google_java_format", "//third_party:gson", "//third_party:guava", "//third_party:javac", diff --git a/src/main/java/org/javacomp/server/handler/InitializeHandler.java b/src/main/java/org/javacomp/server/handler/InitializeHandler.java index 705dac0..0d6326a 100644 --- a/src/main/java/org/javacomp/server/handler/InitializeHandler.java +++ b/src/main/java/org/javacomp/server/handler/InitializeHandler.java @@ -39,6 +39,7 @@ public InitializeResult handleRequest(Request request) { result.capabilities.hoverProvider = true; result.capabilities.documentSymbolProvider = true; result.capabilities.referencesProvider = true; + result.capabilities.documentFormattingProvider = true; return result; } } diff --git a/src/main/java/org/javacomp/server/handler/textdocument/DidChangeHandler.java b/src/main/java/org/javacomp/server/handler/textdocument/DidChangeHandler.java index 9f40048..8c6cf6c 100644 --- a/src/main/java/org/javacomp/server/handler/textdocument/DidChangeHandler.java +++ b/src/main/java/org/javacomp/server/handler/textdocument/DidChangeHandler.java @@ -1,9 +1,9 @@ package org.javacomp.server.handler.textdocument; +import com.google.common.flogger.FluentLogger; import java.net.URI; import java.util.Optional; import org.javacomp.file.FileManager; -import org.javacomp.logging.JLogger; import org.javacomp.protocol.textdocument.DidChangeTextDocumentParams; import org.javacomp.server.Request; import org.javacomp.server.Server; @@ -16,7 +16,7 @@ * https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangetextdocument-notification */ public class DidChangeHandler extends NotificationHandler { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final Server server; @@ -29,10 +29,10 @@ public DidChangeHandler(Server server) { protected void handleNotification(Request request) throws Exception { FileManager fileManager = server.getFileManager(); URI fileUri = request.getParams().textDocument.uri; - logger.fine("Changing document: %s", fileUri); + logger.atFine().log("Changing document: %s", fileUri); for (DidChangeTextDocumentParams.TextDocumentContentChangeEvent change : request.getParams().contentChanges) { - logger.fine("Applying change: %s", change); + logger.atFine().log("Applying change: %s", change); if (change.range != null) { fileManager.applyEditToSnapshot( fileUri, change.range, Optional.ofNullable(change.rangeLength), change.text); diff --git a/src/main/java/org/javacomp/server/handler/textdocument/DocumentSymbolHandler.java b/src/main/java/org/javacomp/server/handler/textdocument/DocumentSymbolHandler.java index 10831b8..e2bcfd7 100644 --- a/src/main/java/org/javacomp/server/handler/textdocument/DocumentSymbolHandler.java +++ b/src/main/java/org/javacomp/server/handler/textdocument/DocumentSymbolHandler.java @@ -2,12 +2,12 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.common.flogger.FluentLogger; import java.nio.file.Paths; import java.util.List; import java.util.Optional; import java.util.Set; import javax.annotation.Nullable; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityScope; @@ -32,7 +32,7 @@ * https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textDocument_hover */ public class DocumentSymbolHandler extends RequestHandler { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final ImmutableSet DEFAULT_SUPPORTED_SYMBOL_KINDS = ImmutableSet.of( @@ -108,7 +108,7 @@ private void addDocumentSymbolsInScope( EntityScope scope, FileScope fileScope, Set supportedSymbolKinds) { - logger.fine("Building document symbols for scope %s", scope); + logger.atFine().log("Building document symbols for scope %s", scope); @Nullable DocumentSymbol newSymbol = null; ImmutableList.Builder children = symbols; @@ -141,7 +141,7 @@ private void addSymbolInformationsInScope( FileScope fileScope, Set supportedSymbolKinds, @Nullable String containerName) { - logger.fine("Building symbol informations in scope %s", scope); + logger.atFine().log("Building symbol informations in scope %s", scope); for (Entity entity : scope.getMemberEntities().values()) { SymbolKind symbolKind = getSymbolKind(entity, supportedSymbolKinds); if (symbolKind != null) { @@ -202,9 +202,9 @@ private SymbolKind getSymbolKind(Entity entity, Set supportedSymbolK symbolKind = SymbolKind.VARIABLE; break; default: - logger.fine("", entity.getKind()); + logger.atFine().log("", entity.getKind()); } - logger.fine("Symbol %s for %s", symbolKind, entity); + logger.atFine().log("Symbol %s for %s", symbolKind, entity); return symbolKind; } } diff --git a/src/main/java/org/javacomp/server/handler/textdocument/FormattingHandler.java b/src/main/java/org/javacomp/server/handler/textdocument/FormattingHandler.java new file mode 100644 index 0000000..9f5ded7 --- /dev/null +++ b/src/main/java/org/javacomp/server/handler/textdocument/FormattingHandler.java @@ -0,0 +1,55 @@ +package org.javacomp.server.handler.textdocument; + +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; +import com.google.common.flogger.FluentLogger; +import com.google.googlejavaformat.java.Formatter; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import org.javacomp.protocol.Position; +import org.javacomp.protocol.Range; +import org.javacomp.protocol.TextEdit; +import org.javacomp.protocol.textdocument.DocumentFormattingParams; +import org.javacomp.server.Request; +import org.javacomp.server.Server; +import org.javacomp.server.handler.RequestHandler; + +/** + * Handles "textDocument/formatting" request. + * + *

See https://microsoft.github.io/language-server-protocol/specification#textDocument_formatting + */ +public class FormattingHandler extends RequestHandler { + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + + private static final Splitter LINE_SPLITTER = Splitter.on('\n'); + + private final Server server; + + public FormattingHandler(Server server) { + super("textDocument/formatting", DocumentFormattingParams.class); + this.server = server; + } + + @Override + public ImmutableList handleRequest(Request request) + throws Exception { + Optional content = + server.getFileManager().getFileContent(Paths.get(request.getParams().textDocument.uri)); + if (!content.isPresent()) { + logger.atWarning().log( + "Cannot find file content for %s", request.getParams().textDocument.uri); + return ImmutableList.of(); + } + if (content.get().length() == 0) { + return ImmutableList.of(); + } + String newContent = new Formatter().formatSourceAndFixImports(content.get().toString()); + List lines = LINE_SPLITTER.splitToList(content.get()); + int endLine = lines.size() - 1; + int endColumn = lines.get(endLine).length(); + Range range = new Range(new Position(0, 0), new Position(endLine, endColumn)); + return ImmutableList.of(new TextEdit(range, newContent)); + } +} diff --git a/src/main/java/org/javacomp/server/handler/textdocument/HoverHandler.java b/src/main/java/org/javacomp/server/handler/textdocument/HoverHandler.java index d568d57..0658820 100644 --- a/src/main/java/org/javacomp/server/handler/textdocument/HoverHandler.java +++ b/src/main/java/org/javacomp/server/handler/textdocument/HoverHandler.java @@ -1,11 +1,11 @@ package org.javacomp.server.handler.textdocument; +import com.google.common.flogger.FluentLogger; import java.nio.file.Paths; import java.util.List; import java.util.Optional; import java.util.StringJoiner; import java.util.stream.Collectors; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.MethodEntity; @@ -26,7 +26,7 @@ * https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textDocument_hover */ public class HoverHandler extends RequestHandler { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final Server server; @@ -189,7 +189,7 @@ private String formatClass(ClassEntity classEntity) { sb.append("enum"); break; default: - logger.warning("Unknown entity kind for class: %s", classEntity.getKind()); + logger.atWarning().log("Unknown entity kind for class: %s", classEntity.getKind()); sb.append(classEntity.getKind().name().toLowerCase()); break; } diff --git a/src/main/java/org/javacomp/server/handler/textdocument/ReferencesHandler.java b/src/main/java/org/javacomp/server/handler/textdocument/ReferencesHandler.java index fb56ab1..3054705 100644 --- a/src/main/java/org/javacomp/server/handler/textdocument/ReferencesHandler.java +++ b/src/main/java/org/javacomp/server/handler/textdocument/ReferencesHandler.java @@ -3,9 +3,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; import com.google.common.collect.Range; +import com.google.common.flogger.FluentLogger; import java.nio.file.Paths; import java.util.List; -import org.javacomp.logging.JLogger; import org.javacomp.model.FileScope; import org.javacomp.protocol.Location; import org.javacomp.protocol.ReferenceParams; @@ -20,7 +20,7 @@ *

See https://microsoft.github.io/language-server-protocol/specification#textDocument_references */ public class ReferencesHandler extends RequestHandler { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final Server server; diff --git a/src/main/java/org/javacomp/server/io/BUILD b/src/main/java/org/javacomp/server/io/BUILD index 8221a89..1b3d62d 100644 --- a/src/main/java/org/javacomp/server/io/BUILD +++ b/src/main/java/org/javacomp/server/io/BUILD @@ -6,8 +6,8 @@ java_library( name = "io", srcs = glob(["*.java"]), deps = [ - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/server:response", + "//third_party:flogger", "//third_party:gson", "//third_party:guava", ], diff --git a/src/main/java/org/javacomp/server/io/RequestReader.java b/src/main/java/org/javacomp/server/io/RequestReader.java index 86ae17f..6482d77 100644 --- a/src/main/java/org/javacomp/server/io/RequestReader.java +++ b/src/main/java/org/javacomp/server/io/RequestReader.java @@ -3,10 +3,10 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.nio.charset.StandardCharsets.UTF_8; +import com.google.common.flogger.FluentLogger; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; -import org.javacomp.logging.JLogger; /** * A reader wrapping around {@link InputStream} providing useful methods for parsing requests. @@ -17,7 +17,7 @@ *

The reader is backed by a ring buffer. */ public class RequestReader implements Closeable { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private final InputStream inputStream; @@ -141,7 +141,7 @@ public void close() throws IOException { * and no more data will be available */ boolean fillBuffer() throws IOException { - logger.fine("fillBuffer: readOffset: %d, writeOffset: %d", readOffset, writeOffset); + logger.atFine().log("fillBuffer: readOffset: %d, writeOffset: %d", readOffset, writeOffset); int remainCapacity = getRemainCapacity(); if (remainCapacity == 0) { return false; @@ -153,7 +153,7 @@ boolean fillBuffer() throws IOException { int numRead = inputStream.read(buffer, writeOffset, numToRead); if (numRead > 0) { writeOffset = incrementOffset(writeOffset, numRead); - logger.fine("fillBuffer: %d bytes read, writeOffset: %d", readOffset, writeOffset); + logger.atFine().log("fillBuffer: %d bytes read, writeOffset: %d", readOffset, writeOffset); return true; } return false; diff --git a/src/main/java/org/javacomp/storage/BUILD b/src/main/java/org/javacomp/storage/BUILD index 80c4a5a..34fa51e 100644 --- a/src/main/java/org/javacomp/storage/BUILD +++ b/src/main/java/org/javacomp/storage/BUILD @@ -5,9 +5,9 @@ java_library( ), visibility = ["//visibility:public"], deps = [ - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/typesolver", + "//third_party:flogger", "//third_party:gson", "//third_party:guava", "//third_party:jsr305", diff --git a/src/main/java/org/javacomp/storage/IndexStore.java b/src/main/java/org/javacomp/storage/IndexStore.java index ab95e06..b4f5812 100644 --- a/src/main/java/org/javacomp/storage/IndexStore.java +++ b/src/main/java/org/javacomp/storage/IndexStore.java @@ -8,6 +8,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.Range; +import com.google.common.flogger.FluentLogger; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.io.BufferedWriter; @@ -25,7 +26,6 @@ import java.util.Optional; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityScope; @@ -44,7 +44,7 @@ /** Storing and loading indexed Java modules from storage. */ public class IndexStore { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final String QUALIFIER_SEPARATOR = "\\."; private static final Joiner QUALIFIER_JOINER = Joiner.on("."); @@ -136,7 +136,7 @@ private SerializedEntity serializeEntity(Entity entity) { } else if (entity instanceof VariableEntity) { ret = serializeVariableEntity((VariableEntity) entity); } else { - logger.warning("Unknown Entity: %s", entity); + logger.atWarning().log("Unknown Entity: %s", entity); ret = new SerializedEntity(); } ret.kind = entity.getKind().name(); @@ -357,7 +357,7 @@ private SerializedType serializeTypeReference(TypeReference type, EntityScope ba .map(solvedType -> EntityWithContext.from(solvedType).build()); } } catch (Throwable t) { - logger.warning(t, "Error on solving type %s in %s", type, baseScope); + logger.atWarning().withCause(t).log("Error on solving type %s in %s", type, baseScope); optionalEntityWithContext = Optional.empty(); } if (optionalEntityWithContext.isPresent() @@ -405,7 +405,7 @@ private TypeReference deserializeTypeReference(SerializedType type) { }) .collect(Collectors.toList()); } catch (Exception e) { - logger.severe( + logger.atSevere().log( "Failed to deserialize type arguments %s for %s", Arrays.asList(type.typeArguments), type.fullName); } diff --git a/src/main/java/org/javacomp/typesolver/BUILD b/src/main/java/org/javacomp/typesolver/BUILD index 082e9b5..16998e7 100644 --- a/src/main/java/org/javacomp/typesolver/BUILD +++ b/src/main/java/org/javacomp/typesolver/BUILD @@ -3,10 +3,10 @@ java_library( srcs = glob(["*.java"]), visibility = ["//visibility:public"], deps = [ - "//src/main/java/org/javacomp/logging", "//src/main/java/org/javacomp/model", "//src/main/java/org/javacomp/parser", "//third_party:auto_value", + "//third_party:flogger", "//third_party:guava", "//third_party:javac", "//third_party:jsr305", diff --git a/src/main/java/org/javacomp/typesolver/ExpressionSolver.java b/src/main/java/org/javacomp/typesolver/ExpressionSolver.java index 9d46f3d..e6fc6f9 100644 --- a/src/main/java/org/javacomp/typesolver/ExpressionSolver.java +++ b/src/main/java/org/javacomp/typesolver/ExpressionSolver.java @@ -4,6 +4,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; +import com.google.common.flogger.FluentLogger; import com.sun.source.tree.ArrayAccessTree; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.IdentifierTree; @@ -26,7 +27,6 @@ import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityScope; @@ -47,7 +47,7 @@ /** Logic for solving the result type of an expression. */ public class ExpressionSolver { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final Set ALL_ENTITY_KINDS = EnumSet.allOf(Entity.Kind.class); private static final Set ALLOWED_KINDS_METHOD = ImmutableSet.of(Entity.Kind.METHOD); @@ -110,15 +110,12 @@ public List solveDefinitions( .build(); List entities = expressionDefinitionScanner.scan(expression, params); if (entities == null) { - logger.warning( - new Throwable(), - "Unsupported expression: (%s) %s", - expression.getClass().getSimpleName(), - expression); + logger.atWarning().log( + "Unsupported expression: (%s) %s", expression.getClass().getSimpleName(), expression); return ImmutableList.of(); } - logger.fine("Found definitions for %s: %s", expression, entities); + logger.atFine().log("Found definitions for %s: %s", expression, entities); return entities.stream() .filter(entityWithContext -> allowedKinds.contains(entityWithContext.getEntity().getKind())) .collect(ImmutableList.toImmutableList()); @@ -226,7 +223,7 @@ public List visitNewClass( } EntityWithContext entityWithContext = baseClassEntities.get(0); if (!(entityWithContext.getEntity() instanceof ClassEntity)) { - logger.warning( + logger.atWarning().log( "Resolved entity for new class %s is not an entity: %s.", node, entityWithContext.getEntity()); return ImmutableList.of(); @@ -283,7 +280,7 @@ public List visitMemberSelect( MemberSelectTree node, ExpressionDefinitionScannerParams params) { List expressionEntities = scan(node.getExpression(), params.copyWithAllEntityKindsAllowed()); - logger.severe( + logger.atSevere().log( "[DEBUG] expression for %s with allowed %s are %s", node, params.allowedEntityKinds(), expressionEntities); EntityWithContext expressionType = solveEntityType(expressionEntities, params.module()); @@ -415,7 +412,7 @@ public List visitLiteral( return ImmutableList.of(builder.setEntity(primitiveEntity.get()).build()); } - logger.warning("Unknown literal type: %s", value); + logger.atWarning().log("Unknown literal type: %s", value); return ImmutableList.of(); } diff --git a/src/main/java/org/javacomp/typesolver/MemberSolver.java b/src/main/java/org/javacomp/typesolver/MemberSolver.java index 7f92173..2e02fd5 100644 --- a/src/main/java/org/javacomp/typesolver/MemberSolver.java +++ b/src/main/java/org/javacomp/typesolver/MemberSolver.java @@ -2,10 +2,11 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.common.flogger.FluentLogger; +import com.google.common.flogger.StackSize; import java.util.List; import java.util.Optional; import java.util.Set; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; import org.javacomp.model.EntityWithContext; @@ -17,7 +18,7 @@ /** Logic for finding the entity that defines the member of a class. */ public class MemberSolver { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final String IDENT_THIS = "this"; private static final String IDENT_LENGTH = "length"; @@ -84,7 +85,8 @@ public List findMethodMembers( String identifier, EntityWithContext baseEntity, Module module) { // Methods must be defined in classes. if (!(baseEntity.getEntity() instanceof ClassEntity)) { - logger.warning(new Throwable(), "Cannot find method of non-class entities %s", baseEntity); + logger.atWarning().withStackTrace(StackSize.LARGE).log( + "Cannot find method of non-class entities %s", baseEntity); return ImmutableList.of(); } diff --git a/src/main/java/org/javacomp/typesolver/OverloadSolver.java b/src/main/java/org/javacomp/typesolver/OverloadSolver.java index 439a0e0..1c2a49e 100644 --- a/src/main/java/org/javacomp/typesolver/OverloadSolver.java +++ b/src/main/java/org/javacomp/typesolver/OverloadSolver.java @@ -8,6 +8,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Multimap; +import com.google.common.flogger.FluentLogger; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -16,7 +17,6 @@ import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.javacomp.logging.JLogger; import org.javacomp.model.ClassEntity; import org.javacomp.model.EntityWithContext; import org.javacomp.model.MethodEntity; @@ -38,7 +38,7 @@ public class OverloadSolver { private static final String OBJECT_FULL_NAME = "java.lang.Object"; - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); // The type specified by the key can be converted to the types specified by the values without // losing information about the overall magnitude. @@ -402,7 +402,7 @@ private static TypeMatchResult primitiveTypeMatch( } return TypeMatchResult.NOT_MATCH; } - logger.info("Primitive type %s cannot be match to type %s", primitiveEntity, otherType); + logger.atInfo().log("Primitive type %s cannot be match to type %s", primitiveEntity, otherType); return TypeMatchResult.NOT_MATCH; } @@ -477,7 +477,7 @@ private MethodEntity getMostSpecificMethod( } // Shouldn't reach here. - logger.warning("No most specific method picked."); + logger.atWarning().log("No most specific method picked."); return null; } diff --git a/src/main/java/org/javacomp/typesolver/TypeSolver.java b/src/main/java/org/javacomp/typesolver/TypeSolver.java index 14ac4c9..0b2ccbe 100644 --- a/src/main/java/org/javacomp/typesolver/TypeSolver.java +++ b/src/main/java/org/javacomp/typesolver/TypeSolver.java @@ -9,6 +9,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; import com.google.common.collect.Sets; +import com.google.common.flogger.FluentLogger; import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; @@ -19,7 +20,6 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; -import org.javacomp.logging.JLogger; import org.javacomp.model.AggregatePackageScope; import org.javacomp.model.ClassEntity; import org.javacomp.model.Entity; @@ -46,7 +46,7 @@ /** Logic for solvfing the type of a given entity. */ public class TypeSolver { - private static final JLogger logger = JLogger.createForEnclosingClass(); + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final Optional UNSOLVED = Optional.empty(); private static final Set CLASS_KINDS = ClassEntity.ALLOWED_KINDS; @@ -725,7 +725,7 @@ private Optional solveTypeArgument( return solveJavaLangObject(module); } } else { - logger.warning("Unsupported type of type argument: %s", typeArgument); + logger.atWarning().log("Unsupported type of type argument: %s", typeArgument); return Optional.empty(); } } @@ -1040,7 +1040,7 @@ protected EntityWithContext computeNext() { } EntityWithContext entityWithContext = solvedEntity.get(); if (!(entityWithContext.getEntity() instanceof ClassEntity)) { - logger.warning( + logger.atWarning().log( "%s is not a class entity for super class/interface type %s of class %s", entityWithContext.getEntity(), classReference.classType, diff --git a/third_party/BUILD b/third_party/BUILD index 5b1d0ee..f5313b9 100644 --- a/third_party/BUILD +++ b/third_party/BUILD @@ -42,6 +42,26 @@ java_plugin( ], ) +java_library( + name = "flogger", + exports = [ + "@com_google_flogger//jar", + ], + runtime_deps = [ + "@com_google_flogger_system_backend//jar", + ], +) + +java_library( + name = "google_java_format", + exports = [ + "@com_google_googlejavaformat//jar", + ], + runtime_deps = [ + ":javac-shaded", + ], +) + java_library( name = "gson", exports = [ @@ -63,6 +83,13 @@ java_library( ], ) +java_library( + name = "javac-shaded", + exports = [ + "@com_google_errorprone_javac_shaded//jar", + ], +) + java_library( name = "jsr305", exports = [