diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 000000000..677aca421 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,18 @@ +{ + "permissions": { + "allow": [ + "Bash(./gradlew:*)", + "Bash(java:*)", + "Bash(/usr/libexec/java_home:*)", + "Bash(JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.14/libexec/openjdk.jdk/Contents/Home ./gradlew build)", + "WebSearch", + "WebFetch(domain:github.com)", + "Bash(unzip:*)", + "Bash(./bin/palantir-java-format:*)", + "Bash(./palantir-java-format/build/distributions/palantir-java-format-2.49.0-2-g78818d3.dirty/bin/palantir-java-format:*)", + "Bash(/Users/bodo.teichmann/dev/learning/palantir-java-format/palantir-java-format/build/distributions/palantir-java-format-2.49.0-2-g78818d3.dirty/bin/palantir-java-format --help)" + ], + "deny": [], + "ask": [] + } +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..d53ecaf3d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "java.compile.nullAnalysis.mode": "automatic", + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/changelog/@unreleased/pr-1113.v2.yml b/changelog/@unreleased/pr-1113.v2.yml new file mode 100644 index 000000000..e10d4188a --- /dev/null +++ b/changelog/@unreleased/pr-1113.v2.yml @@ -0,0 +1,5 @@ +type: fix +fix: + description: "fix issue #975: last character not a \n after format in Intellij" + links: + - https://github.com/palantir/palantir-java-format/pull/1113 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4413138c..df97d72b8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatFormattingService.java b/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatFormattingService.java index e28a716bd..dd266e0ce 100644 --- a/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatFormattingService.java +++ b/idea-plugin/src/main/java/com/palantir/javaformat/intellij/PalantirJavaFormatFormattingService.java @@ -92,7 +92,7 @@ public void run() { String formattedText = applyReplacements( request.getDocumentText(), formatterService.get().getFormatReplacements(request.getDocumentText(), toRanges(request))); - request.onTextReady(formattedText); + request.onTextReady(formattedText.trim() + "\n"); } catch (FormatterException e) { request.onError( Notifications.PARSING_ERROR_TITLE, diff --git a/palantir-java-format/build.gradle b/palantir-java-format/build.gradle index bef1b8918..ee7bb17a7 100644 --- a/palantir-java-format/build.gradle +++ b/palantir-java-format/build.gradle @@ -41,12 +41,13 @@ def exports = [ ] def jvmArgList = exports.collect { value -> "--add-exports=${value}=ALL-UNNAMED".toString() } +def opensArgList = exports.collect { value -> "--add-opens=${value}=ALL-UNNAMED".toString() } tasks.withType(JavaCompile).configureEach { options.errorprone.disable 'StrictUnusedVariable' // Allow access to internal javac apis - options.compilerArgs += jvmArgList + options.compilerArgs += jvmArgList + opensArgList if (JavaVersion.current() < JavaVersion.VERSION_14) { excludes = ['**/Java14InputAstVisitor.java'] @@ -54,7 +55,7 @@ tasks.withType(JavaCompile).configureEach { } tasks.withType(Test).configureEach { - jvmArgs = jvmArgList + jvmArgs = jvmArgList + opensArgList } tasks.withType(Javadoc).configureEach { diff --git a/palantir-java-format/src/main/java/com/palantir/javaformat/java/JavacTokens.java b/palantir-java-format/src/main/java/com/palantir/javaformat/java/JavacTokens.java index 9cc61d20a..45c552ce0 100644 --- a/palantir-java-format/src/main/java/com/palantir/javaformat/java/JavacTokens.java +++ b/palantir-java-format/src/main/java/com/palantir/javaformat/java/JavacTokens.java @@ -27,6 +27,7 @@ import com.sun.tools.javac.parser.Tokens.TokenKind; import com.sun.tools.javac.parser.UnicodeReader; import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.JCDiagnostic; import java.util.Set; /** A wrapper around javac's lexer. */ @@ -200,6 +201,11 @@ public boolean isDeprecated() { return false; } + @Override + public JCDiagnostic.DiagnosticPosition getPos() { + return new JCDiagnostic.SimpleDiagnosticPosition(pos); + } + @Override public String toString() { return String.format("Comment: '%s'", getText()); diff --git a/palantir-java-format/src/main/java/com/palantir/javaformat/java/RemoveUnusedImports.java b/palantir-java-format/src/main/java/com/palantir/javaformat/java/RemoveUnusedImports.java index c537afd77..62b320ca2 100644 --- a/palantir-java-format/src/main/java/com/palantir/javaformat/java/RemoveUnusedImports.java +++ b/palantir-java-format/src/main/java/com/palantir/javaformat/java/RemoveUnusedImports.java @@ -43,6 +43,7 @@ import com.sun.tools.javac.tree.JCTree.JCFieldAccess; import com.sun.tools.javac.tree.JCTree.JCIdent; import com.sun.tools.javac.tree.JCTree.JCImport; +import com.sun.tools.javac.tree.JCTree.JCImportBase; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.Options; import java.lang.reflect.Method; @@ -221,7 +222,12 @@ private static RangeMap buildReplacements( Set usedNames, Multimap> usedInJavadoc) { RangeMap replacements = TreeRangeMap.create(); - for (JCImport importTree : unit.getImports()) { + for (JCImportBase importBase : unit.getImports()) { + // Skip module imports for now - only handle traditional imports + if (!(importBase instanceof JCImport)) { + continue; + } + JCImport importTree = (JCImport) importBase; String simpleName = getSimpleName(importTree); if (!isUnused(unit, usedNames, usedInJavadoc, importTree, simpleName)) { continue;