├── .config ├── checkstyle │ ├── checkstyle.xml │ └── suppressions.xml └── pmd │ └── java │ └── ruleset.xml ├── .gitattributes ├── .github ├── .lycheeignore ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ ├── enhancement.yml │ └── question.yml ├── labels.yml └── workflows │ ├── broken-links.yml │ ├── check-build.yml │ ├── check-ide-compatibility.yml │ ├── release.yml │ ├── sync-labels.yml │ ├── test-deploy.yml │ └── update-from-template.yml ├── .gitignore ├── .idea ├── PMDPlugin.xml ├── checkstyle-idea.xml ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── externalDependencies.xml ├── inspectionProfiles │ └── Project_Default.xml └── saveactions_settings.xml ├── .run ├── Run Plugin.run.xml ├── Run Tests.run.xml └── Run Verifications.run.xml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── USAGE.md ├── assets ├── intellij-save-actions-plugin-settings-page-java.png └── intellij-save-actions-plugin-settings-page.png ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── renovate.json5 └── src ├── main ├── java │ └── software │ │ └── xdev │ │ └── saveactions │ │ ├── core │ │ ├── ExecutionMode.java │ │ ├── action │ │ │ ├── BatchAction.java │ │ │ ├── ShortcutAction.java │ │ │ └── ToggleAnAction.java │ │ ├── component │ │ │ └── Engine.java │ │ ├── listener │ │ │ └── SaveActionsDocumentManagerListener.java │ │ └── service │ │ │ ├── SaveActionsService.java │ │ │ ├── SaveActionsServiceManager.java │ │ │ └── impl │ │ │ ├── AbstractSaveActionsService.java │ │ │ ├── SaveActionsDefaultService.java │ │ │ └── SaveActionsJavaService.java │ │ ├── model │ │ ├── Action.java │ │ ├── ActionType.java │ │ ├── Storage.java │ │ ├── StorageFactory.java │ │ └── java │ │ │ ├── EpfAction.java │ │ │ ├── EpfKey.java │ │ │ └── EpfStorage.java │ │ ├── processors │ │ ├── BuildProcessor.java │ │ ├── GlobalProcessor.java │ │ ├── Processor.java │ │ ├── Result.java │ │ ├── ResultCode.java │ │ ├── SaveCommand.java │ │ ├── SaveReadCommand.java │ │ ├── SaveWriteCommand.java │ │ └── java │ │ │ ├── InspectionRunnable.java │ │ │ ├── JavaProcessor.java │ │ │ └── inspection │ │ │ ├── AccessibleVisibilityInspection.java │ │ │ ├── CustomAccessCanBeTightenedInspection.java │ │ │ ├── CustomLocalCanBeFinal.java │ │ │ ├── CustomSerializableHasSerialVersionUidFieldInspection.java │ │ │ ├── SerializableHasSerialVersionUIDFieldInspectionWrapper.java │ │ │ └── style │ │ │ └── CustomUnqualifiedStaticUsageInspection.java │ │ ├── ui │ │ ├── BuildPanel.java │ │ ├── Configuration.java │ │ ├── FileMaskExclusionPanel.java │ │ ├── FileMaskInclusionPanel.java │ │ ├── FileMaskPanel.java │ │ ├── FormattingPanel.java │ │ ├── GeneralPanel.java │ │ └── java │ │ │ ├── IdeSupportPanel.java │ │ │ └── InspectionPanel.java │ │ └── utils │ │ └── Helper.java └── resources │ └── META-INF │ ├── plugin-java.xml │ ├── plugin.xml │ ├── pluginIcon.svg │ └── pluginIcon_dark.svg └── test ├── java ├── junit │ └── framework │ │ ├── AssertionFailedError.java │ │ └── TestCase.java ├── org │ └── junit │ │ ├── Assert.java │ │ ├── AssumptionViolatedException.java │ │ ├── ComparisonFailure.java │ │ ├── rules │ │ ├── ExternalResource.java │ │ └── TestRule.java │ │ └── runners │ │ └── model │ │ └── Statement.java └── software │ └── xdev │ └── saveactions │ ├── core │ ├── action │ │ ├── BatchActionConstants.java │ │ └── ShortcutActionConstants.java │ └── component │ │ ├── PsiFileTest.java │ │ └── SaveActionManagerConstants.java │ ├── integration │ ├── ActionTestFile.java │ ├── GlobalIntegrationTest.java │ ├── IntegrationTest.java │ └── JavaIntegrationTest.java │ ├── junit │ └── JUnit5Utils.java │ ├── model │ └── java │ │ ├── EpfActionTest.java │ │ ├── EpfKeyTest.java │ │ ├── EpfStorageTest.java │ │ └── EpfTestConstants.java │ └── processors │ ├── BuildProcessorTest.java │ ├── GlobalProcessorTest.java │ └── java │ └── JavaProcessorTest.java └── resources └── software └── xdev └── saveactions ├── integration ├── AccessCanBeTightened_KO.java ├── AccessCanBeTightened_OK.java ├── CustomUnqualifiedStaticMemberAccess_KO.java ├── CustomUnqualifiedStaticMemberAccess_OK.java ├── ExplicitTypeCanBeDiamond_KO.java ├── ExplicitTypeCanBeDiamond_OK.java ├── FieldCanBeFinal_KO.java ├── FieldCanBeFinal_OK.java ├── FinalPrivateMethod_KO.java ├── FinalPrivateMethod_OK.java ├── GenerateSerialVersionUID_KO.java ├── GenerateSerialVersionUID_OK.java ├── InspectionsAll_KO.java ├── InspectionsAll_OK.java ├── LocalCanBeFinalExceptImplicit_KO.java ├── LocalCanBeFinalExceptImplicit_OK.java ├── LocalCanBeFinal_KO.java ├── LocalCanBeFinal_OK.java ├── MethodMayBeStatic_KO.java ├── MethodMayBeStatic_OK.java ├── MissingOverrideAnnotation_KO.java ├── MissingOverrideAnnotation_OK.java ├── Reformat_KO_Import_KO.java ├── Reformat_KO_Import_OK.java ├── Reformat_KO_Rearrange_KO.java ├── Reformat_KO_Rearrange_OK.java ├── Reformat_OK_Import_KO.java ├── Reformat_OK_Import_OK.java ├── Reformat_OK_Rearrange_OK.java ├── SingleStatementInBlock_KO.java ├── SingleStatementInBlock_OK.java ├── UnnecessaryFinalOnLocalVariableOrParameter_KO.java ├── UnnecessaryFinalOnLocalVariableOrParameter_OK.java ├── UnnecessarySemicolon_KO.java ├── UnnecessarySemicolon_OK.java ├── UnnecessaryThis_KO.java ├── UnnecessaryThis_OK.java ├── UnqualifiedFieldAccess_KO.java ├── UnqualifiedFieldAccess_OK.java ├── UnqualifiedMethodAccess_KO.java ├── UnqualifiedMethodAccess_OK.java ├── UnqualifiedStaticMemberAccess_KO.java ├── UnqualifiedStaticMemberAccess_OK.java ├── UseBlocks_KO.java └── UseBlocks_OK.java └── model ├── example0.epf ├── example1.epf └── example2.epf /.config/checkstyle/suppressions.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Force sh files to have LF 5 | *.sh text eol=lf 6 | -------------------------------------------------------------------------------- /.github/.lycheeignore: -------------------------------------------------------------------------------- 1 | # Ignorefile for broken link check 2 | localhost 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: 🐞 Bug 2 | description: Create a bug report for something that is broken 3 | labels: [bug] 4 | type: bug 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thank you for reporting a bug. 10 | 11 | Please fill in as much information as possible about your bug so that we don't have to play "information ping-pong" and can help you immediately. 12 | 13 | - type: checkboxes 14 | id: checklist 15 | attributes: 16 | label: "Checklist" 17 | options: 18 | - label: "I am able to reproduce the bug with the [latest version](https://github.com/xdev-software/intellij-plugin-save-actions/releases/latest)" 19 | required: true 20 | - label: "I made sure that there are *no existing issues* - [open](https://github.com/xdev-software/intellij-plugin-save-actions/issues) or [closed](https://github.com/xdev-software/intellij-plugin-save-actions/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." 21 | required: true 22 | - label: "I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise." 23 | required: true 24 | - label: "This issue contains only one bug." 25 | required: true 26 | 27 | - type: input 28 | id: app-version 29 | attributes: 30 | label: Affected version 31 | description: "In which version did you encounter the bug?" 32 | placeholder: "x.x.x" 33 | validations: 34 | required: true 35 | 36 | - type: textarea 37 | id: description 38 | attributes: 39 | label: Description of the problem 40 | description: | 41 | Describe as exactly as possible what is not working. 42 | validations: 43 | required: true 44 | 45 | - type: textarea 46 | id: steps-to-reproduce 47 | attributes: 48 | label: Steps to reproduce the bug 49 | description: | 50 | What did you do for the bug to show up? 51 | 52 | If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug. 53 | placeholder: | 54 | 1. Use '...' 55 | 2. Do '...' 56 | validations: 57 | required: true 58 | 59 | - type: textarea 60 | id: additional-information 61 | attributes: 62 | label: Additional information 63 | description: | 64 | Any other relevant information you'd like to include 65 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | contact_links: 2 | - name: 💬 Contact support 3 | url: https://xdev.software/en/services/support 4 | about: "If you need support as soon as possible or/and you can't wait for any pull request" 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement.yml: -------------------------------------------------------------------------------- 1 | name: ✨ Feature/Enhancement 2 | description: Suggest a new feature or enhancement 3 | labels: [enhancement] 4 | type: feature 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thank you for suggesting a new feature/enhancement. 10 | 11 | - type: checkboxes 12 | id: checklist 13 | attributes: 14 | label: "Checklist" 15 | options: 16 | - label: "I made sure that there are *no existing issues* - [open](https://github.com/xdev-software/intellij-plugin-save-actions/issues) or [closed](https://github.com/xdev-software/intellij-plugin-save-actions/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." 17 | required: true 18 | - label: "I have taken the time to fill in all the required details. I understand that the feature request will be dismissed otherwise." 19 | required: true 20 | - label: "This issue contains only one feature request/enhancement." 21 | required: true 22 | 23 | - type: textarea 24 | id: description 25 | attributes: 26 | label: Description 27 | validations: 28 | required: true 29 | 30 | - type: textarea 31 | id: additional-information 32 | attributes: 33 | label: Additional information 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/question.yml: -------------------------------------------------------------------------------- 1 | name: ❓ Question 2 | description: Ask a question 3 | labels: [question] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | Thanks for taking the time to fill out this form! 9 | 10 | - type: checkboxes 11 | id: checklist 12 | attributes: 13 | label: "Checklist" 14 | options: 15 | - label: "I made sure that there are *no existing issues* - [open](https://github.com/xdev-software/intellij-plugin-save-actions/issues) or [closed](https://github.com/xdev-software/intellij-plugin-save-actions/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." 16 | required: true 17 | - label: "I have taken the time to fill in all the required details. I understand that the question will be dismissed otherwise." 18 | required: true 19 | 20 | - type: textarea 21 | id: what-is-the-question 22 | attributes: 23 | label: What is/are your question(s)? 24 | validations: 25 | required: true 26 | 27 | - type: textarea 28 | id: additional-information 29 | attributes: 30 | label: Additional information 31 | description: "Any other information you'd like to include - for instance logs, screenshots, etc." 32 | -------------------------------------------------------------------------------- /.github/labels.yml: -------------------------------------------------------------------------------- 1 | # Default 2 | ## Required for template 3 | - name: bug 4 | description: "Something isn't working" 5 | color: 'd73a4a' 6 | - name: enhancement 7 | description: New feature or request 8 | color: '#a2eeef' 9 | - name: question 10 | description: Information is requested 11 | color: '#d876e3' 12 | ## Others 13 | - name: duplicate 14 | description: This already exists 15 | color: '#cfd3d7' 16 | - name: good first issue 17 | description: Good for newcomers 18 | color: '#7057ff' 19 | - name: help wanted 20 | description: Extra attention is needed 21 | color: '#008672' 22 | - name: invalid 23 | description: "This doesn't seem right" 24 | color: '#e4e669' 25 | # Custom 26 | - name: automated 27 | description: Created by an automation 28 | color: '#000000' 29 | - name: "can't reproduce" 30 | color: '#e95f2c' 31 | - name: customer-requested 32 | description: Was requested by a customer of us 33 | color: '#068374' 34 | - name: stale 35 | color: '#ededed' 36 | - name: waiting-for-response 37 | description: If no response is received after a certain time the issue will be closed 38 | color: '#202020' 39 | -------------------------------------------------------------------------------- /.github/workflows/broken-links.yml: -------------------------------------------------------------------------------- 1 | name: Broken links 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: "23 23 * * 0" 7 | 8 | permissions: 9 | issues: write 10 | 11 | jobs: 12 | link-checker: 13 | runs-on: ubuntu-latest 14 | timeout-minutes: 15 15 | steps: 16 | - uses: actions/checkout@v5 17 | 18 | - run: mv .github/.lycheeignore .lycheeignore 19 | 20 | - name: Link Checker 21 | id: lychee 22 | uses: lycheeverse/lychee-action@885c65f3dc543b57c898c8099f4e08c8afd178a2 # v2 23 | with: 24 | fail: false # Don't fail on broken links, create an issue instead 25 | 26 | - name: Find already existing issue 27 | id: find-issue 28 | run: | 29 | echo "number=$(gh issue list -l 'bug' -l 'automated' -L 1 -S 'in:title "Link Checker Report"' -s 'open' --json 'number' --jq '.[].number')" >> $GITHUB_OUTPUT 30 | env: 31 | GH_TOKEN: ${{ github.token }} 32 | 33 | - name: Close issue if everything is fine 34 | if: steps.lychee.outputs.exit_code == 0 && steps.find-issue.outputs.number != '' 35 | run: gh issue close -r 'not planned' ${{ steps.find-issue.outputs.number }} 36 | env: 37 | GH_TOKEN: ${{ github.token }} 38 | 39 | - name: Create Issue From File 40 | if: steps.lychee.outputs.exit_code != 0 41 | uses: peter-evans/create-issue-from-file@fca9117c27cdc29c6c4db3b86c48e4115a786710 # v6 42 | with: 43 | issue-number: ${{ steps.find-issue.outputs.number }} 44 | title: Link Checker Report 45 | content-filepath: ./lychee/out.md 46 | labels: bug, automated 47 | -------------------------------------------------------------------------------- /.github/workflows/check-build.yml: -------------------------------------------------------------------------------- 1 | name: Check Build 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: [ develop ] 7 | paths-ignore: 8 | - '**.md' 9 | - '.config/**' 10 | - '.github/**' 11 | - '.idea/**' 12 | - 'assets/**' 13 | pull_request: 14 | branches: [ develop ] 15 | paths-ignore: 16 | - '**.md' 17 | - '.config/**' 18 | - '.github/**' 19 | - '.idea/**' 20 | - 'assets/**' 21 | 22 | jobs: 23 | build: 24 | runs-on: ubuntu-latest 25 | timeout-minutes: 30 26 | strategy: 27 | matrix: 28 | java: [21] 29 | distribution: [temurin] 30 | steps: 31 | - uses: actions/checkout@v5 32 | 33 | - name: Set up JDK 34 | uses: actions/setup-java@v5 35 | with: 36 | distribution: ${{ matrix.distribution }} 37 | java-version: ${{ matrix.java }} 38 | 39 | - name: Cache Gradle 40 | uses: actions/cache@v4 41 | with: 42 | path: | 43 | ~/.gradle/caches 44 | ~/.gradle/wrapper 45 | key: ${{ runner.os }}-gradle-build-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} 46 | restore-keys: | 47 | ${{ runner.os }}-gradle-build- 48 | 49 | - name: Build 50 | run: ./gradlew build buildPlugin --info --stacktrace 51 | 52 | - name: Try upload test reports when failure occurs 53 | uses: actions/upload-artifact@v4 54 | if: failure() 55 | with: 56 | name: test-reports-${{ matrix.java }} 57 | path: build/reports/tests/test/** 58 | 59 | - name: Check for uncommited changes 60 | run: | 61 | if [[ "$(git status --porcelain)" != "" ]]; then 62 | echo ---------------------------------------- 63 | echo git status 64 | echo ---------------------------------------- 65 | git status 66 | echo ---------------------------------------- 67 | echo git diff 68 | echo ---------------------------------------- 69 | git diff 70 | echo ---------------------------------------- 71 | echo Troubleshooting 72 | echo ---------------------------------------- 73 | echo "::error::Unstaged changes detected. Locally try running: git clean -ffdx && mvn -B clean package" 74 | exit 1 75 | fi 76 | 77 | - name: Upload plugin files 78 | uses: actions/upload-artifact@v4 79 | with: 80 | name: plugin-files-java-${{ matrix.java }} 81 | path: build/libs/intellij-plugin-save-actions-*.jar 82 | if-no-files-found: error 83 | 84 | checkstyle: 85 | runs-on: ubuntu-latest 86 | if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/') }} 87 | timeout-minutes: 15 88 | strategy: 89 | matrix: 90 | java: [21] 91 | distribution: [temurin] 92 | steps: 93 | - uses: actions/checkout@v5 94 | 95 | - name: Set up JDK 96 | uses: actions/setup-java@v5 97 | with: 98 | distribution: ${{ matrix.distribution }} 99 | java-version: ${{ matrix.java }} 100 | 101 | - name: Cache Gradle 102 | uses: actions/cache@v4 103 | with: 104 | path: | 105 | ~/.gradle/caches 106 | ~/.gradle/wrapper 107 | key: ${{ runner.os }}-gradle-checkstyle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} 108 | restore-keys: | 109 | ${{ runner.os }}-gradle-checkstyle- 110 | 111 | - name: Run Checkstyle 112 | run: ./gradlew checkstyleMain checkstyleTest -PcheckstyleEnabled --stacktrace 113 | 114 | pmd: 115 | runs-on: ubuntu-latest 116 | if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/') }} 117 | timeout-minutes: 15 118 | strategy: 119 | matrix: 120 | java: [21] 121 | distribution: [temurin] 122 | steps: 123 | - uses: actions/checkout@v5 124 | 125 | - name: Set up JDK 126 | uses: actions/setup-java@v5 127 | with: 128 | distribution: ${{ matrix.distribution }} 129 | java-version: ${{ matrix.java }} 130 | 131 | - name: Run PMD 132 | run: ./gradlew pmdMain pmdTest -PpmdEnabled --stacktrace -x test 133 | 134 | - name: Cache Gradle 135 | uses: actions/cache@v4 136 | with: 137 | path: | 138 | ~/.gradle/caches 139 | ~/.gradle/wrapper 140 | key: ${{ runner.os }}-gradle-pmd-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} 141 | restore-keys: | 142 | ${{ runner.os }}-gradle-pmd- 143 | 144 | - name: Upload report 145 | if: always() 146 | uses: actions/upload-artifact@v4 147 | with: 148 | name: pmd-report 149 | if-no-files-found: ignore 150 | path: | 151 | build/reports/pmd/*.html 152 | -------------------------------------------------------------------------------- /.github/workflows/check-ide-compatibility.yml: -------------------------------------------------------------------------------- 1 | name: Check IDE Compatibility 2 | 3 | on: 4 | schedule: 5 | - cron: '55 8 * * 1' 6 | workflow_dispatch: 7 | 8 | jobs: 9 | check-ide-compatibility: 10 | runs-on: ubuntu-latest 11 | timeout-minutes: 45 12 | steps: 13 | - name: Free up disk space 14 | run: | 15 | sudo df -h 16 | declare -a paths_to_wipe=( 17 | "/usr/share/dotnet" 18 | "/usr/local/.ghcup" 19 | "/usr/local/swift" 20 | "/usr/share/swift" 21 | "/usr/lib/jvm" 22 | "/usr/local/lib/android" 23 | "/usr/lib/google-cloud-sdk" 24 | "/usr/local/share/boost" 25 | "/usr/local/share/powershell" 26 | "/usr/local/share/chromium" 27 | "/usr/local/lib/node_modules" 28 | "/usr/lib/mono" 29 | "/usr/lib/heroku" 30 | "/usr/lib/firefox" 31 | "/usr/share/miniconda" 32 | "/opt/microsoft" 33 | "/opt/chrome" 34 | "/opt/pipx" 35 | "$AGENT_TOOLSDIRECTORY" 36 | ) 37 | for p in "${paths_to_wipe[@]}" 38 | do 39 | echo "Clearing $p" 40 | sudo rm -rf $p || true 41 | done 42 | sudo df -h 43 | 44 | - uses: actions/checkout@v5 45 | 46 | - name: Set up JDK 47 | uses: actions/setup-java@v5 48 | with: 49 | distribution: 'temurin' 50 | java-version: 21 51 | 52 | - name: Cache Gradle 53 | uses: actions/cache@v4 54 | with: 55 | path: | 56 | ~/.gradle/caches 57 | ~/.gradle/wrapper 58 | key: ${{ runner.os }}-gradle-ide-compatibility-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} 59 | restore-keys: | 60 | ${{ runner.os }}-gradle-ide-compatibility- 61 | 62 | - name: Check compatibility 63 | id: check-compatibility 64 | run: ./gradlew verifyPlugin --info --stacktrace 65 | 66 | - name: Upload report 67 | uses: actions/upload-artifact@v4 68 | if: ${{ always() }} 69 | with: 70 | name: plugin-verifier-reports 71 | path: build/reports/pluginVerifier/** 72 | if-no-files-found: warn 73 | 74 | - name: Find already existing issue 75 | id: find-issue 76 | if: ${{ always() }} 77 | run: | 78 | echo "number=$(gh issue list -l 'bug' -l 'automated' -L 1 -S 'in:title "IDE Compatibility Problem"' -s 'open' --json 'number' --jq '.[].number')" >> $GITHUB_OUTPUT 79 | env: 80 | GH_TOKEN: ${{ github.token }} 81 | 82 | - name: Close issue if everything is fine 83 | if: ${{ success() && steps.find-issue.outputs.number != '' }} 84 | run: gh issue close -r 'not planned' ${{ steps.find-issue.outputs.number }} 85 | env: 86 | GH_TOKEN: ${{ github.token }} 87 | 88 | - name: Create issue report 89 | if: ${{ failure() && steps.check-compatibility.conclusion == 'failure' }} 90 | run: | 91 | echo 'Encountered problems during plugin verification' > reported.md 92 | echo 'Please check the build logs for details' >> reported.md 93 | 94 | - name: Create Issue From File 95 | if: ${{ failure() && steps.check-compatibility.conclusion == 'failure' }} 96 | uses: peter-evans/create-issue-from-file@e8ef132d6df98ed982188e460ebb3b5d4ef3a9cd # v5 97 | with: 98 | issue-number: ${{ steps.find-issue.outputs.number }} 99 | title: IDE Compatibility Problem 100 | content-filepath: ./reported.md 101 | labels: bug, automated 102 | -------------------------------------------------------------------------------- /.github/workflows/sync-labels.yml: -------------------------------------------------------------------------------- 1 | name: Sync labels 2 | 3 | on: 4 | push: 5 | branches: develop 6 | paths: 7 | - .github/labels.yml 8 | 9 | workflow_dispatch: 10 | 11 | permissions: 12 | issues: write 13 | 14 | jobs: 15 | labels: 16 | runs-on: ubuntu-latest 17 | timeout-minutes: 10 18 | steps: 19 | - uses: actions/checkout@v5 20 | with: 21 | sparse-checkout: .github/labels.yml 22 | 23 | - uses: EndBug/label-sync@52074158190acb45f3077f9099fea818aa43f97a # v2 24 | with: 25 | config-file: .github/labels.yml 26 | -------------------------------------------------------------------------------- /.github/workflows/test-deploy.yml: -------------------------------------------------------------------------------- 1 | name: Test Deployment 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | publish: 8 | runs-on: ubuntu-latest 9 | timeout-minutes: 60 10 | steps: 11 | - uses: actions/checkout@v5 12 | 13 | - name: Set up JDK 14 | uses: actions/setup-java@v5 15 | with: 16 | distribution: 'temurin' 17 | java-version: 21 18 | 19 | - name: Update/Generify version 20 | run: | 21 | originalVersion=$(grep -Po 'pluginVersion=\K.*' gradle.properties) 22 | newVersion="$(echo $originalVersion | cut -d '-' -f1).$( date -u '+%Y%m%d%H%M%S')-SNAPSHOT" 23 | echo "New version: $newVersion" 24 | sed -i "s/pluginVersion=$originalVersion/pluginVersion=$newVersion/" gradle.properties 25 | 26 | echo "Contents of gradle.properties" 27 | cat gradle.properties 28 | 29 | - name: Publish Plugin 30 | env: 31 | PUBLISH_TOKEN: ${{ secrets.JETBRAINS_MARKETPLACE_PUBLISH_TOKEN }} 32 | CERTIFICATE_CHAIN: ${{ secrets.JETBRAINS_MARKETPLACE_CERTIFICATE_CHAIN }} 33 | PRIVATE_KEY: ${{ secrets.JETBRAINS_MARKETPLACE_PRIVATE_KEY }} 34 | PRIVATE_KEY_PASSWORD: ${{ secrets.JETBRAINS_MARKETPLACE_PRIVATE_KEY_PASSWORD }} 35 | run: ./gradlew publishPlugin --info --stacktrace 36 | 37 | - name: Upload plugin files 38 | uses: actions/upload-artifact@v4 39 | with: 40 | name: plugin-files-java-${{ matrix.java }} 41 | path: build/distributions/* 42 | if-no-files-found: error 43 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Intellij 2 | .idea/* 3 | *.iml 4 | *.ipr 5 | *.iws 6 | 7 | # Generated java classes 8 | out 9 | classes 10 | 11 | # Plugins 12 | *.idea/checkstyle-idea.xml 13 | 14 | # Gradle 15 | .gradle/ 16 | build/ 17 | 18 | # IntelliJ Platform Plugin 19 | .intellijPlatform 20 | 21 | 22 | # Some files are user/installation independent and are used for configuring the IDE 23 | # See also https://stackoverflow.com/a/35279076 24 | 25 | .idea/* 26 | !.idea/saveactions_settings.xml 27 | !.idea/checkstyle-idea.xml 28 | !.idea/externalDependencies.xml 29 | !.idea/PMDPlugin.xml 30 | 31 | !.idea/inspectionProfiles/ 32 | .idea/inspectionProfiles/* 33 | !.idea/inspectionProfiles/Project_Default.xml 34 | 35 | !.idea/codeStyles/ 36 | .idea/codeStyles/* 37 | !.idea/codeStyles/codeStyleConfig.xml 38 | !.idea/codeStyles/Project.xml 39 | -------------------------------------------------------------------------------- /.idea/PMDPlugin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 14 | 16 | -------------------------------------------------------------------------------- /.idea/checkstyle-idea.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11.0.0 5 | JavaOnlyWithTests 6 | true 7 | true 8 | 12 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 99 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/externalDependencies.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/saveactions_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 27 | 28 | -------------------------------------------------------------------------------- /.run/Run Plugin.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 17 | 19 | true 20 | true 21 | false 22 | 23 | 24 | -------------------------------------------------------------------------------- /.run/Run Tests.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 17 | 19 | true 20 | true 21 | false 22 | false 23 | 24 | 25 | -------------------------------------------------------------------------------- /.run/Run Verifications.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 17 | 19 | true 20 | true 21 | false 22 | false 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.5.0 2 | * Dropped support for IntelliJ versions < 2025.2 3 | * Resolves "``ActionUtil.performActionDumbAwareWithCallbacks`` deprecated" #250 4 | 5 | ## 1.4.2 6 | * Fix storage deserialization crash on unknown actions value #273 7 | 8 | ## 1.4.1 9 | * Fix ``Add class qualifier to static member access outside declaring class`` not working correctly for ``switch`` statements #263 10 | 11 | ## 1.4.0 12 | * Dropped support for IntelliJ versions < 2024.3 13 | * This is required to fix a few deprecations and remove some workarounds #171 14 | 15 | ## 1.3.1 16 | * Fix IDE hang when projects with different "Process files asynchronously" are open #160 17 | 18 | ## 1.3.0 19 | * Make it possible to run processors asynchronously #130 20 | * This way the UI should be more responsive when processing a lot of files 21 | * May break processors that interact with the UI e.g. when showing dialogs 22 | * Don't process files during project load #145 23 | * This should cause less race conditions due to partial project initialization 24 | * Only active on IntelliJ < 2024.3 as [the underlying problem was fixed in IntelliJ 2024.3](https://github.com/JetBrains/intellij-community/commit/765caa71175d0a67a54836cf840fae829da590d9) 25 | 26 | ## 1.2.4 27 | * Dropped support for IntelliJ versions < 2024.2 28 | * Removed deprecated code that was only required for older IDE versions 29 | 30 | ## 1.2.3 31 | * Fix "run on multiple files" not working when the file is not a text file #129 32 | 33 | ## 1.2.2 34 | * Workaround scaling problem on "New UI" [#26](https://github.com/xdev-software/intellij-plugin-template/issues/26) 35 | 36 | ## 1.2.1 37 | * Fixed ``ToggleAnAction must override getActionUpdateThread`` warning inside IntelliJ 2024+ 38 | * Dropped support for IntelliJ versions < 2023.2 39 | 40 | ## 1.2.0 41 | * Run GlobalProcessors (e.g. Reformat) last so that code is formatted correctly #90 42 | * Dropped support for IntelliJ versions < 2023 43 | 44 | ## 1.1.1 45 | * Shortened plugin name - new name: "Save Actions X" 46 | * Updated assets 47 | 48 | ## 1.1.0 49 | * Removed "Remove unused suppress warning annotation" 50 | * This option never worked #64 51 | * Allows usage of the plugin with IntelliJ IDEA 2024+ #63 52 | * If you used this option you should remove the line ``