From 4a447c396315f6aaeb90feb6b031746672168161 Mon Sep 17 00:00:00 2001 From: Peter Laggner Date: Mon, 18 Sep 2023 23:35:35 +0200 Subject: [PATCH 1/4] chore: update build dependencies - gradle wrapper - intellij gradle plugin --- ktfmt_idea_plugin/build.gradle.kts | 16 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 63375 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- ktfmt_idea_plugin/gradlew | 281 +++++++++++------- ktfmt_idea_plugin/gradlew.bat | 34 +-- 5 files changed, 195 insertions(+), 140 deletions(-) diff --git a/ktfmt_idea_plugin/build.gradle.kts b/ktfmt_idea_plugin/build.gradle.kts index 63c78799..82d360f4 100644 --- a/ktfmt_idea_plugin/build.gradle.kts +++ b/ktfmt_idea_plugin/build.gradle.kts @@ -15,12 +15,14 @@ */ plugins { - id("org.jetbrains.intellij") version "0.7.2" + id("org.jetbrains.intellij") version "1.15.0" java id("com.diffplug.spotless") version "5.10.2" } -val ktfmtVersion = rootProject.file("../version.txt").readText().trim() +// TODO: use the commented line again once 0.45 is successfully published to maven central +//val ktfmtVersion = rootProject.file("../version.txt").readText().trim() +val ktfmtVersion = "0.44" val pluginVersion = "1.1" group = "com.facebook" @@ -45,18 +47,18 @@ dependencies { // See https://github.com/JetBrains/gradle-intellij-plugin/ intellij { // Version with which to build (and run; unless alternativeIdePath is specified) - version = "2020.3" + version = "2023.2.2" // To run on a different IDE, uncomment and specify a path. // alternativeIdePath = "/Applications/Android Studio.app" } tasks { patchPluginXml { - sinceBuild("201") - untilBuild("") + sinceBuild.set("213") + untilBuild.set("") } - publishPlugin { token(System.getenv("JETBRAINS_MARKETPLACE_TOKEN")) } - runPluginVerifier { ideVersions(listOf("211.6432.7")) } + publishPlugin { token.set(System.getenv("JETBRAINS_MARKETPLACE_TOKEN")) } + runPluginVerifier { ideVersions.set(listOf("211.6432.7")) } } spotless { java { googleJavaFormat() } } diff --git a/ktfmt_idea_plugin/gradle/wrapper/gradle-wrapper.jar b/ktfmt_idea_plugin/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 43609 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 YbZi*#fctCoh($ delta 39181 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 diff --git a/ktfmt_idea_plugin/gradle/wrapper/gradle-wrapper.properties b/ktfmt_idea_plugin/gradle/wrapper/gradle-wrapper.properties index 622ab64a..9f4197d5 100644 --- a/ktfmt_idea_plugin/gradle/wrapper/gradle-wrapper.properties +++ b/ktfmt_idea_plugin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ktfmt_idea_plugin/gradlew b/ktfmt_idea_plugin/gradlew index fbd7c515..fcb6fca1 100755 --- a/ktfmt_idea_plugin/gradlew +++ b/ktfmt_idea_plugin/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,98 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +118,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,88 +129,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/ktfmt_idea_plugin/gradlew.bat b/ktfmt_idea_plugin/gradlew.bat index a9f778a7..6689b85b 100644 --- a/ktfmt_idea_plugin/gradlew.bat +++ b/ktfmt_idea_plugin/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +65,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,17 +72,19 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From 82a1b01615e936442e7144ef590c3267abaf5c35 Mon Sep 17 00:00:00 2001 From: Peter Laggner Date: Sun, 24 Sep 2023 02:31:50 +0200 Subject: [PATCH 2/4] update plugin to use FormatterService --- ktfmt_idea_plugin/build.gradle.kts | 4 +- .../intellij/CodeStyleManagerDecorator.java | 239 ------------------ .../ktfmt/intellij/FormatterUtil.java | 51 ---- ... InitialConfigurationStartupActivity.java} | 23 +- .../ktfmt/intellij/KtfmtCodeStyleManager.java | 168 ------------ .../intellij/KtfmtFormattingService.java | 97 +++++++ .../ktfmt/intellij/KtfmtInstaller.java | 58 ----- .../ktfmt/intellij/KtfmtSettings.java | 7 +- .../ktfmt/intellij/Notifications.java | 11 + .../src/main/resources/META-INF/plugin.xml | 12 +- 10 files changed, 130 insertions(+), 540 deletions(-) delete mode 100644 ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/CodeStyleManagerDecorator.java delete mode 100644 ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/FormatterUtil.java rename ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/{InitialConfigurationProjectManagerListener.java => InitialConfigurationStartupActivity.java} (73%) delete mode 100644 ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtCodeStyleManager.java create mode 100644 ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtFormattingService.java delete mode 100644 ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtInstaller.java create mode 100644 ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/Notifications.java diff --git a/ktfmt_idea_plugin/build.gradle.kts b/ktfmt_idea_plugin/build.gradle.kts index 82d360f4..c1610aa7 100644 --- a/ktfmt_idea_plugin/build.gradle.kts +++ b/ktfmt_idea_plugin/build.gradle.kts @@ -22,7 +22,7 @@ plugins { // TODO: use the commented line again once 0.45 is successfully published to maven central //val ktfmtVersion = rootProject.file("../version.txt").readText().trim() -val ktfmtVersion = "0.44" +val ktfmtVersion = "0.46" val pluginVersion = "1.1" group = "com.facebook" @@ -49,7 +49,7 @@ intellij { // Version with which to build (and run; unless alternativeIdePath is specified) version = "2023.2.2" // To run on a different IDE, uncomment and specify a path. - // alternativeIdePath = "/Applications/Android Studio.app" + // localPath = "/Applications/Android Studio.app" } tasks { diff --git a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/CodeStyleManagerDecorator.java b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/CodeStyleManagerDecorator.java deleted file mode 100644 index 61de7043..00000000 --- a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/CodeStyleManagerDecorator.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.facebook.ktfmt.intellij; - -import com.intellij.formatting.FormattingMode; -import com.intellij.lang.ASTNode; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.codeStyle.ChangedRangesInfo; -import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.psi.codeStyle.DocCommentSettings; -import com.intellij.psi.codeStyle.FormattingModeAwareIndentAdjuster; -import com.intellij.psi.codeStyle.Indent; -import com.intellij.util.IncorrectOperationException; -import com.intellij.util.ThrowableRunnable; -import java.util.Collection; -import org.jetbrains.annotations.Nullable; - -/** - * Decorates the {@link CodeStyleManager} abstract class by delegating to a concrete implementation - * instance (likely IJ's default instance). - */ -@SuppressWarnings("deprecation") -class CodeStyleManagerDecorator extends CodeStyleManager - implements FormattingModeAwareIndentAdjuster { - - private final CodeStyleManager delegate; - - CodeStyleManagerDecorator(CodeStyleManager delegate) { - this.delegate = delegate; - } - - CodeStyleManager getDelegate() { - return delegate; - } - - @Override - public Project getProject() { - return delegate.getProject(); - } - - @Override - public PsiElement reformat(PsiElement element) throws IncorrectOperationException { - return delegate.reformat(element); - } - - @Override - public PsiElement reformat(PsiElement element, boolean canChangeWhiteSpacesOnly) - throws IncorrectOperationException { - return delegate.reformat(element, canChangeWhiteSpacesOnly); - } - - @Override - public PsiElement reformatRange(PsiElement element, int startOffset, int endOffset) - throws IncorrectOperationException { - return delegate.reformatRange(element, startOffset, endOffset); - } - - @Override - public PsiElement reformatRange( - PsiElement element, int startOffset, int endOffset, boolean canChangeWhiteSpacesOnly) - throws IncorrectOperationException { - return delegate.reformatRange(element, startOffset, endOffset, canChangeWhiteSpacesOnly); - } - - @Override - public void reformatText(PsiFile file, int startOffset, int endOffset) - throws IncorrectOperationException { - delegate.reformatText(file, startOffset, endOffset); - } - - @Override - public void reformatText(PsiFile file, Collection ranges) - throws IncorrectOperationException { - delegate.reformatText(file, ranges); - } - - @Override - public void reformatTextWithContext(PsiFile psiFile, ChangedRangesInfo changedRangesInfo) - throws IncorrectOperationException { - delegate.reformatTextWithContext(psiFile, changedRangesInfo); - } - - @Override - public void reformatTextWithContext(PsiFile file, Collection ranges) - throws IncorrectOperationException { - delegate.reformatTextWithContext(file, ranges); - } - - @Override - public void adjustLineIndent(PsiFile file, TextRange rangeToAdjust) - throws IncorrectOperationException { - delegate.adjustLineIndent(file, rangeToAdjust); - } - - @Override - public int adjustLineIndent(PsiFile file, int offset) throws IncorrectOperationException { - return delegate.adjustLineIndent(file, offset); - } - - @Override - public int adjustLineIndent(Document document, int offset) { - return delegate.adjustLineIndent(document, offset); - } - - public void scheduleIndentAdjustment(Document document, int offset) { - delegate.scheduleIndentAdjustment(document, offset); - } - - @Override - public boolean isLineToBeIndented(PsiFile file, int offset) { - return delegate.isLineToBeIndented(file, offset); - } - - @Override - @Nullable - public String getLineIndent(PsiFile file, int offset) { - return delegate.getLineIndent(file, offset); - } - - @Override - @Nullable - public String getLineIndent(PsiFile file, int offset, FormattingMode mode) { - return delegate.getLineIndent(file, offset, mode); - } - - @Override - @Nullable - public String getLineIndent(Document document, int offset) { - return delegate.getLineIndent(document, offset); - } - - @Override - public Indent getIndent(String text, FileType fileType) { - return delegate.getIndent(text, fileType); - } - - @Override - public String fillIndent(Indent indent, FileType fileType) { - return delegate.fillIndent(indent, fileType); - } - - @Override - public Indent zeroIndent() { - return delegate.zeroIndent(); - } - - @Override - public void reformatNewlyAddedElement(ASTNode block, ASTNode addedElement) - throws IncorrectOperationException { - delegate.reformatNewlyAddedElement(block, addedElement); - } - - @Override - public boolean isSequentialProcessingAllowed() { - return delegate.isSequentialProcessingAllowed(); - } - - @Override - public void performActionWithFormatterDisabled(Runnable r) { - delegate.performActionWithFormatterDisabled(r); - } - - @Override - public void performActionWithFormatterDisabled(ThrowableRunnable r) - throws T { - delegate.performActionWithFormatterDisabled(r); - } - - @Override - public T performActionWithFormatterDisabled(Computable r) { - return delegate.performActionWithFormatterDisabled(r); - } - - @Override - public int getSpacing(PsiFile file, int offset) { - return delegate.getSpacing(file, offset); - } - - @Override - public int getMinLineFeeds(PsiFile file, int offset) { - return delegate.getMinLineFeeds(file, offset); - } - - @Override - public void runWithDocCommentFormattingDisabled(PsiFile file, Runnable runnable) { - delegate.runWithDocCommentFormattingDisabled(file, runnable); - } - - @Override - public DocCommentSettings getDocCommentSettings(PsiFile file) { - return delegate.getDocCommentSettings(file); - } - - // From FormattingModeAwareIndentAdjuster - - /** Uses same fallback as {@link CodeStyleManager#getCurrentFormattingMode}. */ - @Override - public FormattingMode getCurrentFormattingMode() { - if (delegate instanceof FormattingModeAwareIndentAdjuster) { - return ((FormattingModeAwareIndentAdjuster) delegate).getCurrentFormattingMode(); - } - return FormattingMode.REFORMAT; - } - - @Override - public int adjustLineIndent(final Document document, final int offset, FormattingMode mode) - throws IncorrectOperationException { - if (delegate instanceof FormattingModeAwareIndentAdjuster) { - return ((FormattingModeAwareIndentAdjuster) delegate) - .adjustLineIndent(document, offset, mode); - } - return offset; - } - - @Override - public void scheduleReformatWhenSettingsComputed(PsiFile file) { - delegate.scheduleReformatWhenSettingsComputed(file); - } -} diff --git a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/FormatterUtil.java b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/FormatterUtil.java deleted file mode 100644 index c67f1146..00000000 --- a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/FormatterUtil.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.facebook.ktfmt.intellij; - -import static com.facebook.ktfmt.format.Formatter.format; - -import com.facebook.ktfmt.format.ParseError; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableMap; -import com.google.googlejavaformat.java.FormatterException; -import com.intellij.openapi.util.TextRange; -import java.util.Map; - -final class FormatterUtil { - - private FormatterUtil() {} - - /** - * Formats 'code' using ktfmt. - * - * @return formatted code - */ - static Map getReplacements(UiFormatterStyle uiFormatterStyle, String code) { - try { - return ImmutableMap.of(TextRange.allOf(code), formatCode(uiFormatterStyle, code)); - } catch (FormatterException | ParseError e) { - return ImmutableMap.of(); - } - } - - @VisibleForTesting - static String formatCode(UiFormatterStyle uiFormatterStyle, String code) - throws FormatterException { - - return format(uiFormatterStyle.getFormattingOptions(), code); - } -} diff --git a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/InitialConfigurationProjectManagerListener.java b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/InitialConfigurationStartupActivity.java similarity index 73% rename from ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/InitialConfigurationProjectManagerListener.java rename to ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/InitialConfigurationStartupActivity.java index 2bc97754..a3682607 100644 --- a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/InitialConfigurationProjectManagerListener.java +++ b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/InitialConfigurationStartupActivity.java @@ -17,21 +17,21 @@ package com.facebook.ktfmt.intellij; import com.intellij.notification.Notification; -import com.intellij.notification.NotificationDisplayType; import com.intellij.notification.NotificationGroup; +import com.intellij.notification.NotificationGroupManager; import com.intellij.notification.NotificationType; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManagerListener; +import com.intellij.openapi.startup.StartupActivity; import org.jetbrains.annotations.NotNull; -final class InitialConfigurationProjectManagerListener implements ProjectManagerListener { +final class InitialConfigurationStartupActivity implements StartupActivity.Background { private static final String NOTIFICATION_TITLE = "Enable ktfmt"; private static final NotificationGroup NOTIFICATION_GROUP = - new NotificationGroup(NOTIFICATION_TITLE, NotificationDisplayType.STICKY_BALLOON, true); + NotificationGroupManager.getInstance().getNotificationGroup(NOTIFICATION_TITLE); @Override - public void projectOpened(@NotNull Project project) { + public void runActivity(@NotNull Project project) { KtfmtSettings settings = KtfmtSettings.getInstance(project); @@ -42,17 +42,16 @@ public void projectOpened(@NotNull Project project) { } private void displayNewUserNotification(Project project, KtfmtSettings settings) { - Notification notification = new Notification( NOTIFICATION_GROUP.getDisplayId(), NOTIFICATION_TITLE, "The ktfmt plugin is disabled by default. " + "Enable for this project.", - NotificationType.INFORMATION, - (n, e) -> { - settings.setEnabled(true); - n.expire(); - }); - notification.notify(project); + NotificationType.INFORMATION) + .setListener((n, e) -> { + settings.setEnabled(true); + n.expire(); + }) + .notify(project); } } diff --git a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtCodeStyleManager.java b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtCodeStyleManager.java deleted file mode 100644 index 7594050a..00000000 --- a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtCodeStyleManager.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.facebook.ktfmt.intellij; - -import static java.util.Comparator.comparing; - -import com.google.common.collect.ImmutableList; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.editor.Document; -import com.intellij.openapi.util.TextRange; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.codeStyle.ChangedRangesInfo; -import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.psi.impl.CheckUtil; -import com.intellij.util.IncorrectOperationException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.TreeMap; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.idea.KotlinFileType; - -/** - * A {@link CodeStyleManager} implementation which formats .kt files with ktfmt. Formatting of all - * other types of files is delegated to IJ's default implementation. - */ -class KtfmtCodeStyleManager extends CodeStyleManagerDecorator { - - public KtfmtCodeStyleManager(@NotNull CodeStyleManager original) { - super(original); - } - - @Override - public void reformatText(PsiFile file, int startOffset, int endOffset) - throws IncorrectOperationException { - if (overrideFormatterForFile(file)) { - formatInternal(file, ImmutableList.of(new TextRange(startOffset, endOffset))); - } else { - super.reformatText(file, startOffset, endOffset); - } - } - - @Override - public void reformatText(PsiFile file, Collection ranges) - throws IncorrectOperationException { - if (overrideFormatterForFile(file)) { - formatInternal(file, ranges); - } else { - super.reformatText(file, ranges); - } - } - - @Override - public void reformatTextWithContext(@NotNull PsiFile file, @NotNull ChangedRangesInfo info) - throws IncorrectOperationException { - List ranges = new ArrayList<>(); - if (info.insertedRanges != null) { - ranges.addAll(info.insertedRanges); - } - ranges.addAll(info.allChangedRanges); - reformatTextWithContext(file, ranges); - } - - @Override - public void reformatTextWithContext(PsiFile file, Collection ranges) { - if (overrideFormatterForFile(file)) { - formatInternal(file, ranges); - } else { - super.reformatTextWithContext(file, ranges); - } - } - - @Override - public PsiElement reformatRange( - PsiElement element, int startOffset, int endOffset, boolean canChangeWhiteSpacesOnly) { - // Only handle elements that are PsiFile for now -- otherwise we need to search - // for some - // element within the file at new locations given the original startOffset and - // endOffsets - // to serve as the return value. - PsiFile file = element instanceof PsiFile ? (PsiFile) element : null; - if (file != null && canChangeWhiteSpacesOnly && overrideFormatterForFile(file)) { - formatInternal(file, ImmutableList.of(new TextRange(startOffset, endOffset))); - return file; - } else { - return super.reformatRange(element, startOffset, endOffset, canChangeWhiteSpacesOnly); - } - } - - /** Return whether or not this formatter can handle formatting the given file. */ - private boolean overrideFormatterForFile(PsiFile file) { - return KotlinFileType.INSTANCE.getName().equals(file.getFileType().getName()) - && KtfmtSettings.getInstance(getProject()).isEnabled(); - } - - private void formatInternal(PsiFile file, Collection ranges) { - ApplicationManager.getApplication().assertWriteAccessAllowed(); - PsiDocumentManager documentManager = PsiDocumentManager.getInstance(getProject()); - documentManager.commitAllDocuments(); - CheckUtil.checkWritable(file); - - Document document = documentManager.getDocument(file); - - if (document == null) { - return; - } - // If there are postponed PSI changes (e.g., during a refactoring), just abort. - // If we apply them now, then the incoming text ranges may no longer be valid. - if (documentManager.isDocumentBlockedByPsi(document)) { - return; - } - - format(document, ranges); - } - - /** - * Format the ranges of the given document. - * - *

Overriding methods will need to modify the document with the result of the external - * formatter (usually using {@link #performReplacements(Document, Map)}. - */ - private void format(Document document, Collection ranges) { - UiFormatterStyle uiFormatterStyle = - KtfmtSettings.getInstance(getProject()).getUiFormatterStyle(); - - performReplacements( - document, FormatterUtil.getReplacements(uiFormatterStyle, document.getText())); - } - - private void performReplacements( - final Document document, final Map replacements) { - - if (replacements.isEmpty()) { - return; - } - - TreeMap sorted = new TreeMap<>(comparing(TextRange::getStartOffset)); - sorted.putAll(replacements); - WriteCommandAction.runWriteCommandAction( - getProject(), - () -> { - for (Entry entry : sorted.descendingMap().entrySet()) { - document.replaceString( - entry.getKey().getStartOffset(), entry.getKey().getEndOffset(), entry.getValue()); - } - PsiDocumentManager.getInstance(getProject()).commitDocument(document); - }); - } -} diff --git a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtFormattingService.java b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtFormattingService.java new file mode 100644 index 00000000..0c6d2e2d --- /dev/null +++ b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtFormattingService.java @@ -0,0 +1,97 @@ +/* + * Copyright 2023 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.facebook.ktfmt.intellij; + +import com.google.googlejavaformat.java.FormatterException; +import com.intellij.formatting.service.AsyncDocumentFormattingService; +import com.intellij.formatting.service.AsyncFormattingRequest; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.idea.KotlinFileType; + +import java.util.EnumSet; +import java.util.Set; + +import static com.facebook.ktfmt.format.Formatter.format; + +/** + * Uses {@code ktfmt} to reformat code. + */ +public class KtfmtFormattingService extends AsyncDocumentFormattingService { + + @Override + protected FormattingTask createFormattingTask(AsyncFormattingRequest request) { + Project project = request.getContext().getProject(); + + UiFormatterStyle style = KtfmtSettings.getInstance(project).getUiFormatterStyle(); + return new KtfmtFormattingTask(request, style); + } + + @Override + protected @NotNull String getNotificationGroupId() { + return Notifications.PARSING_ERROR_NOTIFICATION_GROUP; + } + + @Override + protected @NotNull String getName() { + return "ktfmt"; + } + + @Override + public @NotNull Set getFeatures() { + return EnumSet.noneOf(Feature.class); + } + + @Override + public boolean canFormat(@NotNull PsiFile file) { + return KotlinFileType.INSTANCE.getName().equals(file.getFileType().getName()) + && KtfmtSettings.getInstance(file.getProject()).isEnabled(); + } + + private static final class KtfmtFormattingTask implements FormattingTask { + private final AsyncFormattingRequest request; + private final UiFormatterStyle style; + + private KtfmtFormattingTask(AsyncFormattingRequest request, UiFormatterStyle style) { + this.request = request; + this.style = style; + } + + @Override + public void run() { + try { + String formattedText = format(style.getFormattingOptions(), request.getDocumentText()); + request.onTextReady(formattedText); + } catch (FormatterException e) { + request.onError( + Notifications.PARSING_ERROR_TITLE, + Notifications.parsingErrorMessage(request.getContext().getContainingFile().getName())); + } + } + + @Override + public boolean isRunUnderProgress() { + return true; + } + + @Override + public boolean cancel() { + return false; + } + } +} diff --git a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtInstaller.java b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtInstaller.java deleted file mode 100644 index ab414e84..00000000 --- a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtInstaller.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2016 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.facebook.ktfmt.intellij; - -import static com.google.common.base.Preconditions.checkState; - -import com.intellij.ide.plugins.IdeaPluginDescriptor; -import com.intellij.ide.plugins.PluginManagerCore; -import com.intellij.openapi.extensions.PluginId; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManagerListener; -import com.intellij.psi.codeStyle.CodeStyleManager; -import com.intellij.serviceContainer.ComponentManagerImpl; -import org.jetbrains.annotations.NotNull; - -/** - * A component that replaces the default IntelliJ {@link CodeStyleManager} with one that formats via - * ktfmt. - */ -final class KtfmtInstaller implements ProjectManagerListener { - - @Override - public void projectOpened(@NotNull Project project) { - installFormatter(project); - } - - private static void installFormatter(Project project) { - CodeStyleManager currentManager = CodeStyleManager.getInstance(project); - - if (currentManager instanceof KtfmtCodeStyleManager) { - currentManager = ((KtfmtCodeStyleManager) currentManager).getDelegate(); - } - - setManager(project, new KtfmtCodeStyleManager(currentManager)); - } - - private static void setManager(Project project, CodeStyleManager newManager) { - ComponentManagerImpl platformComponentManager = (ComponentManagerImpl) project; - IdeaPluginDescriptor plugin = - PluginManagerCore.getPlugin(PluginId.getId("com.facebook.ktfmt_idea_plugin")); - checkState(plugin != null, "Couldn't locate our own PluginDescriptor."); - platformComponentManager.registerServiceInstance(CodeStyleManager.class, newManager, plugin); - } -} diff --git a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtSettings.java b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtSettings.java index 076e633b..7ca740f3 100644 --- a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtSettings.java +++ b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/KtfmtSettings.java @@ -21,6 +21,7 @@ import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @State( @@ -31,7 +32,7 @@ class KtfmtSettings implements PersistentStateComponent { private State state = new State(); static KtfmtSettings getInstance(Project project) { - return ServiceManager.getService(project, KtfmtSettings.class); + return project.getService(KtfmtSettings.class); } @Nullable @@ -41,7 +42,7 @@ public State getState() { } @Override - public void loadState(State state) { + public void loadState(@NotNull State state) { this.state = state; } @@ -85,7 +86,7 @@ static class State { public void setEnabled(@Nullable String enabledStr) { if (enabledStr == null) { enabled = EnabledState.UNKNOWN; - } else if (Boolean.valueOf(enabledStr)) { + } else if (Boolean.parseBoolean(enabledStr)) { enabled = EnabledState.ENABLED; } else { enabled = EnabledState.DISABLED; diff --git a/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/Notifications.java b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/Notifications.java new file mode 100644 index 00000000..f878d205 --- /dev/null +++ b/ktfmt_idea_plugin/src/main/java/com/facebook/ktfmt/intellij/Notifications.java @@ -0,0 +1,11 @@ +package com.facebook.ktfmt.intellij; + +class Notifications { + + static final String PARSING_ERROR_NOTIFICATION_GROUP = "ktfmt parsing error"; + static final String PARSING_ERROR_TITLE = PARSING_ERROR_NOTIFICATION_GROUP; + + static String parsingErrorMessage(String filename) { + return "ktfmt failed. Does " + filename + " have syntax errors?"; + } +} diff --git a/ktfmt_idea_plugin/src/main/resources/META-INF/plugin.xml b/ktfmt_idea_plugin/src/main/resources/META-INF/plugin.xml index bf371f9a..26accfbd 100644 --- a/ktfmt_idea_plugin/src/main/resources/META-INF/plugin.xml +++ b/ktfmt_idea_plugin/src/main/resources/META-INF/plugin.xml @@ -9,19 +9,17 @@ com.intellij.modules.platform - - - - - + + + From 687728718e9ab784384ae3106d2ffef86e7ee327 Mon Sep 17 00:00:00 2001 From: Peter Laggner Date: Sun, 24 Sep 2023 02:39:05 +0200 Subject: [PATCH 3/4] remove broken + irrelevant test --- .../ktfmt/intellij/FormatterUtilTest.java | 35 ------------------- 1 file changed, 35 deletions(-) delete mode 100644 ktfmt_idea_plugin/src/test/java/com/facebook/ktfmt/intellij/FormatterUtilTest.java diff --git a/ktfmt_idea_plugin/src/test/java/com/facebook/ktfmt/intellij/FormatterUtilTest.java b/ktfmt_idea_plugin/src/test/java/com/facebook/ktfmt/intellij/FormatterUtilTest.java deleted file mode 100644 index 8b6b642e..00000000 --- a/ktfmt_idea_plugin/src/test/java/com/facebook/ktfmt/intellij/FormatterUtilTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.facebook.ktfmt.intellij; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class FormatterUtilTest { - @Test - public void getReplacements() throws Exception { - String code = "val a = 5"; - String expected = "val a = 5\n"; - String actual = FormatterUtil.formatCode(UiFormatterStyle.DEFAULT, code); - - assertEquals(expected, actual); - } -} From 3a2209e01b806e74cdee243440dc4dfff5a414f1 Mon Sep 17 00:00:00 2001 From: Peter Laggner Date: Sun, 24 Sep 2023 02:52:04 +0200 Subject: [PATCH 4/4] remove hardcoded ktfmt version required for local development --- ktfmt_idea_plugin/build.gradle.kts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ktfmt_idea_plugin/build.gradle.kts b/ktfmt_idea_plugin/build.gradle.kts index c1610aa7..07653f1a 100644 --- a/ktfmt_idea_plugin/build.gradle.kts +++ b/ktfmt_idea_plugin/build.gradle.kts @@ -20,9 +20,7 @@ plugins { id("com.diffplug.spotless") version "5.10.2" } -// TODO: use the commented line again once 0.45 is successfully published to maven central -//val ktfmtVersion = rootProject.file("../version.txt").readText().trim() -val ktfmtVersion = "0.46" +val ktfmtVersion = rootProject.file("../version.txt").readText().trim() val pluginVersion = "1.1" group = "com.facebook"